o
    iC                     @   s  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mZ ddlZddlmZmZ ddlmZ ddlmZmZmZmZmZmZmZmZmZmZmZm Z  ddl!m"Z"m#Z# ddl$m%Z%m&Z&m'Z' dd	l(m)Z)m*Z*m+Z+ dddZ,dd Z-dd Z.dd Z/dd Z0e)dddgdd Z1dd Z2dd Z3dd Z4d d! Z5d"d# Z6d$d% Z7d&d' Z8d(d) Z9g fd*d+Z:d,d- Z;e'e)d.dd/gd0d1 Z<e'd2d3 Z=d4d5 Z>d6d7 Z?d8d9 Z@d:d; ZAe)d<d=gd>d/fg d?dfgd@dA ZBdBdC ZCdDdE ZDejE)dFddgdGdH ZFdIdJ ZGdKdL ZHdMdN ZIdOdP ZJdQdR ZKdSdT ZLdUdV ZMdWdX ZNdYdZ ZOd[d\ ZPd]d^d_d`daZQdbeRdceSddeSfdedfZTdgdh ZUdidj ZVddkdlZWdmdn ZXdodp ZYdqdr ZZdsdt Z[dudv Z\dwdx Z]dydz Z^dd{d|Z_e&d}d~ Z`e&dd Zadd ZbG dd deZcG dd deZde)ddee ef gdd Zgdd Zhdd Zidd Zjdd Zkdd Zldd Zmdd Zndd Zodd ZpdddZqejE)ddddd/dddidgdd Zrdd ZsG dd dZtG dd dZuG dd dZvdS )z
Test the memory module.
    N)Path)FileSystemStoreBackendStoreBackendBase)hash)_FUNCTION_HASHES_STORE_BACKENDSJobLibCollisionWarningMemorizedFuncMemorizedResultMemoryNotMemorizedFuncNotMemorizedResult_build_func_identifier_store_backend_factoryexpires_afterregister_store_backend)Paralleldelayed)npwith_multiprocessing
with_numpy)parametrizeraiseswarns   c                 C   s   | d | S )z-A module-level function for testing purposes.    xyr   r   Q/home/kim/smarthome/.venv/lib/python3.10/site-packages/joblib/test/test_memory.pyf/   s   r!   c                 C   sZ   t |dd}|| } tdD ]}tdD ]}| ||ksJ t||d ks)J qqdS )zGiven a function and an accumulator (a list that grows every
    time the function is called), check that the function can be
    decorated by memory to be a lazy identity.
    r   locationverbose   r   r   N)r   cacherangelen)funcaccumulatorr#   memoryi_r   r   r    check_identity_lazy6   s   
r.   c                 C   sV   | j  \}tj|jd}t|d}|d W d    d S 1 s$w   Y  d S )N
output.pklwgarbage)store_backend	get_itemsospathjoinopenwrite)r+   Zsingle_cache_itemZoutput_filenamer!   r   r   r    corrupt_single_cache_itemE   s
   "r9   c                    s"   g   fdd}| | d|  S )Nc                    s     |  d S Nappend)itemZrecordedr   r    append_to_recordS   s   z6monkeypatch_cached_func_warn.<locals>.append_to_recordwarn)setattr)r)   Zmonkeypatch_fixturer?   r   r>   r    monkeypatch_cached_func_warnL   s   rB   c                    s   t    fdd}t| | j dD ]M}dD ]*}t| jd||d}tj| jdd ||}|d	 |jd
d t }|d	}qt |d	 ksKJ |	|d	|ksUJ t |d	 ks_J qd|_
t| jdd}||d	 dS )z&Simple test of memory lazy evaluation.c                         d | S Nr   r;   argr*   r   r    r!   c      
z"test_memory_integration.<locals>.f)FT)rN
   )r#   r$   	mmap_modecompressTignore_errorsr   F)r@   __main__r   r"   N)listr.   strpathr   shutilrmtreer&   clearr(   eval
__module__)tmpdirr!   rL   rK   r+   gcurrent_accumulatoroutr   rG   r    test_memory_integration\   s.   

r[   call_before_reducingTFc                    s  dD ]}d}d |}i }ttt||ddd | |d }d|_|ddks*J |jj|ks2J t| j	d	d
}|
| tt| d dksKJ t| d d	 }d|v sZJ | d | }	|d	krt|	dgksnJ t|	d g ksyJ |r d tt|	d dksJ tdd fdddD  n8tdd fdddD  tdD ]}
tt|	d dkr ntd qtt|	d dksJ  d tt|	d dksJ qtt|	d dksJ  d tt|	d dksJ qd S )N)r   r   z0
        def f(x):
            return x
        z<ipython-input-{}-000000000000>exec)filenamemoder!   rO   r   r   r"   joblibzipython-inputr%   r   Zn_jobsc                 3       | ]	}t  |V  qd S r:   r   .0r,   Zcached_fr   r    	<genexpr>       zHtest_parallel_call_cached_function_defined_in_jupyter.<locals>.<genexpr>)r   r   c                 3   rb   r:   rc   rd   rf   r   r    rg      rh      皙?   )formatr]   compiletextwrapdedentrV   __code__co_filenamer   rQ   r&   r(   r4   listdirr   r'   timesleep)rW   r\   Z
session_noZipython_cell_sourceZipython_cell_idZ	my_localsr!   r+   Zf_cache_relative_directoryZf_cache_directoryr-   r   rf   r    5test_parallel_call_cached_function_defined_in_jupyter   sT   

	ru   c                     s^   t    fdd} tddd}|| }tdD ]}t }|d t |d ks,J qdS )z*Test memory with location=None: no memoizec                    rC   rD   r;   rE   rG   r   r    ff   rH   ztest_no_memory.<locals>.ffNr   r"   rk   r   )rP   r   r&   r'   r(   )rv   r+   Zggr-   rY   r   rG   r    test_no_memory   s   
rw   c                    sR   t   d
 fdd	}t| | j t| jdd}||}|ddd	dks'J dS )z3Test memory with a function with keyword arguments.Nr   c                    rC   rD   r;   Zarg1Zarg2rG   r   r    rX     rH   ztest_memory_kwarg.<locals>.gr   r"      r   rx   rD   )rP   r.   rQ   r   r&   )rW   rX   r+   r   rG   r    test_memory_kwarg  s   
rz   c                    s,   t    fddtfdd | j dS )z*Test memory with a function with a lambda.c                    rC   z*A helper function to define l as a lambda.r   r;   r   rG   r   r    helper     
z"test_memory_lambda.<locals>.helperc                    s    | S r:   r   r|   )r}   r   r    <lambda>      z$test_memory_lambda.<locals>.<lambda>N)rP   r.   rQ   )rW   r   )r*   r}   r    test_memory_lambda  s   r   c                 C   s   t | jdd}|jdd }|}|jdd }|}tt}|d |d W d   n1 s0w   Y  t|dks=J dt|d jv sHJ dS )	z=Check that name collisions with functions will raise warningsr   r"   c                 S      | S )z&A first function called name_collisionr   r|   r   r   r    name_collision$     z2test_memory_name_collision.<locals>.name_collisionc                 S   r   )z'A second function called name_collisionr   r|   r   r   r    r   +  r   r   N	collision)r   rQ   r&   r   r   r(   strmessage)rW   r+   r   abwarninfor   r   r    test_memory_name_collision   s   



r   c                 C   s   t | jdd}|dd }|dd }tt }|ddks"J |ddks*J |ddks2J W d    n1 s<w   Y  t|dksIJ d S )	Nr   r"   c                 S   r   r:   r   r|   r   r   r    r   =      z7test_memory_warning_lambda_collisions.<locals>.<lambda>c                 S      | d S rD   r   r|   r   r   r    r   >  r   r   r   rk   )r   rQ   r&   r   r   r(   )rW   r+   r   r   r   r   r   r    %test_memory_warning_lambda_collisions:  s   
r   c                 C   s   t | jdd}td}||}td}||}tt}|d |d |d W d    n1 s4w   Y  t|dksAJ dt|d j	 v sNJ d S )Nr   r"   lambda x: xzlambda x: x+1r   r   zcannot detect)
r   rQ   rU   r&   r   r   r(   r   r   lower)rW   r+   Za1b1r   r   r   r    'test_memory_warning_collision_detectionJ  s   



r   c                    s8   t    fdd}ddl}||d}t| | j dS )z#Test memory with functools.partial.c                    s     d |S r{   r;   r   rG   r   r    r)   `  r~   z!test_memory_partial.<locals>.funcr   Nr   )rP   	functoolspartialr.   rQ   )rW   r)   r   functionr   rG   r    test_memory_partial\  s
   r   c                 C   s4   t | jdd}td}||}|ddksJ dS )zESmoke test memory with a function with a function defined in an eval.r   r"   r   r   N)r   rQ   rU   r&   )rW   r+   mmmr   r   r    test_memory_evall  s   
r   c                 C   s   t | }| d |S )zsA function with a side effect in its arguments.

    Return the length of its argument and append one element.
    N)r(   r<   )r   Zlen_xr   r   r    count_and_appendv  s   
r   c                 C   s8   t | jdd}|t}| dksJ | dksJ dS )zsCheck that if a function has a side effect in its arguments, it
    should use the hash of changing arguments.
    r   r"   r   N)r   rQ   r&   r   )rW   r+   r)   r   r   r    test_argument_change  s   
r   rK   rI   c           	         s   t   d	 fdd	}t| j|dd}||}tjd}tdD ]#}|d}tdD ]}t	|||ks9J t
 |d ksCJ q,q!dS )
z.Test memory with a function with numpy arrays.Nc                    rC   rD   r;   rE   rG   r   r    n  rH   ztest_memory_numpy.<locals>.nr   r#   rK   r$   r%   )rJ   rJ   r   r:   )rP   r   rQ   r&   r   randomZRandomStater'   Zrandom_sampleallr(   )	rW   rK   r   r+   Zcached_nZrndr,   r   r-   r   rG   r    test_memory_numpy  s   

r   c           
      C   s   t | jddd}| dd }td}||}||}t|tjs%J |jdks,J t|tjs4J |jdks;J ~~t	  t
| t||}||}t|dksVJ d}	|	|d v s`J t|tjshJ |jdksoJ d	S )
z8Check that mmap_mode is respected even at the first callrI   r   r   c                 S   s   | d S Nr   r   r   r   r   r    twice     z0test_memory_numpy_check_mmap_mode.<locals>.twicer%   r   Exception while loading resultsN)r   rQ   r&   r   Zones
isinstanceZmemmapr_   gcZcollectr9   rB   r(   )
rW   monkeypatchr+   r   r   r   crecorded_warningsdexception_msgr   r   r    !test_memory_numpy_check_mmap_mode  s*   


r   c              	      sz   t | jdd}G dd dt |jd
 fdd	}|  tdD ]}t  |d W d	   n1 s5w   Y  q d	S )z+Smoketest the exception handling of Memory.r   r"   c                   @      e Zd ZdS )z*test_memory_exception.<locals>.MyExceptionN__name__rV   __qualname__r   r   r   r    MyException      r   c                    s   | r d S r:   r   )excr   r   r    h  s   z test_memory_exception.<locals>.hr%   r   N)r   )r   rQ   	Exceptionr&   r'   r   )rW   r+   r   r-   r   r   r    test_memory_exception  s   

r   c                    s   t | jdd}t  |jdgdd fdd	}|jdgks J |ddd t dks.J |ddd t dks<J |dd	d t dksJJ d
S )z!Test the ignore feature of memoryr   r"   r   ignorer   c                         d d S rD   r;   r   rG   r   r    z     ztest_memory_ignore.<locals>.zr   r   Nr   r   rQ   rP   r&   r   r(   )rW   r+   r   r   rG   r    test_memory_ignore  s   r   c                    s   t | jdd}t  dd }|jdgd|d fdd		}|jdgks&J |ddd
 t dks4J |ddd
 t dksBJ |ddd
 t dksPJ dS )z9Test the ignore feature of memory on a decorated functionr   r"   c                    s   t   fdd}|S )Nc                     s    | i |S r:   r   )argskwargsr!   r   r    wrapped  r   z?test_memory_ignore_decorated.<locals>.decorate.<locals>.wrapped)r   wraps)r!   r   r   r   r    decorate  s   z.test_memory_ignore_decorated.<locals>.decorater   r   r   c                    r   rD   r;   r   rG   r   r    r     s   z'test_memory_ignore_decorated.<locals>.zr   r   Nr   r   )rW   r+   r   r   r   rG   r    test_memory_ignore_decorated  s   r   c                 C   sT   t | jdd}|jdd }|ddksJ |dddksJ |dddks(J d	S )
z_Non-regression test against 0.12.0 changes.

    https://github.com/joblib/joblib/pull/751
    r   r"   c                 S   r   rD   r   r   r   r   r    plus_one  r   z,test_memory_args_as_kwargs.<locals>.plus_oner   r   r   r%   N)r   rQ   r&   )rW   r+   r   r   r   r    test_memory_args_as_kwargs  s   
r   zignore, verbose, mmap_moder   d   rJ   c                 C   sT   t | jdd}|j|||ddd }|j|ksJ |j|ks!J |j|ks(J dS )z7Check cache may be called with kwargs before decoratingr   r"   )r   r$   rK   c                 S      d S r:   r   r|   r   r   r    r   '     z"test_partial_decoration.<locals>.zN)r   rQ   r&   r   Z_verboserK   )rW   r   r$   rK   r+   r   r   r   r    test_partial_decoration"  s   
r   c           	      C   s*  t | jdd}td}|d | jdg|R  j}|t}tt}t	j
|jj|}||ks3J t	j
|s;J |jt	j
|jjksHJ t  | rRJ t	j
t	j
|ds_J | seJ |d}t	j
|jj|j|}|d}t	j
|sJ t	t	j
|d ||dksJ d S )	Nr   r"   .r!   r`   zfunc_code.pyr   r/   )r   rQ   r   splitr<   r6   r&   r!   r   r4   r5   r2   r#   existsdirnamer   rT   _check_previous_func_code_get_args_idfunc_idremove)	rW   r+   r5   rX   r   r#   args_id
output_dirr   r   r   r    test_func_dir0  s(   



r   c           	      C   s   t | jdd}|t}|d}tt|}|d}tj	
|jj|j|}tj	|s0J ||j|j|gks=J tt|}|jj|jjksOJ t d dd}tt| |t}tt|}|d d S )Nr   r"   r   )r   rQ   r&   r!   pickleloadsdumpsr   r4   r5   r6   r2   r#   r   r   Z	load_item)	rW   r+   rX   outputr   r   r   Zmemory2gpr   r   r    test_persistenceP  s   


r   consider_cache_validc                    s   t t| j fdddt| jddjt fdddfD ]0}|d}t|ts*J |r.J |ddks6J |d}t|tsBJ | ksHJ |  qt	t}|drXJ d S )	Nc                        S r:   r   r-   r   r   r    r   k  r   z*test_check_call_in_cache.<locals>.<lambda>cache_validation_callbackr   r"   c                    r   r:   r   r   r   r   r    r   n  r   r      )
r	   r!   rQ   r   r&   Zcheck_call_in_cacher   boolrT   r   )rW   r   r)   resultr   r   r    test_check_call_in_cacheg  s"   


r   c              	   C   s   t tt| jttt| jddttd dtfttttfD ]@\}}|ddks-J |	d}t
||s9J | dksAJ |  tt |  W d    n1 sXw   Y  |  q!d S )Nr   r"   r#   r   r   )zipr	   r!   rQ   r   r   r&   r
   r   call_and_shelver   getrT   r   KeyError)rW   r)   Resultr   r   r   r    test_call_and_shelve~  s$   

	



r   c           	      C   s  |  d}|d t|jj}td | dksJ |t|jjkr,t	
d t| jdd}|t}|d}tj |jj|j|d}|ddksQJ t|j}td	 |d}t|tshJ t|j|ksrJ td	 | dksJ t|j|ksJ d
S )z6Check call_and_shelve only load stored data if needed.Ztest_access      ?z>filesystem does not support fine-grained access time attributer   r"   r   r/   r   r   N)r6   r8   r4   statrQ   st_atimers   rt   readpytestskipr   r&   r!   r   r5   r2   r#   r   r   r   r
   r   )	rW   Ztest_access_time_fileZtest_access_timer+   r)   r   result_pathZfirst_access_timer   r   r   r    .test_call_and_shelve_lazily_load_stored_result  s,   








r   c              	   C   s   t t| jttfD ]Q}| dj}|d}t|d}t|| W d    n1 s-w   Y  t|d}t	|}W d    n1 sGw   Y  |
 |
 ksVJ t| q
d S )Nzpickling_test.datr   wbrb)r	   r!   rQ   r   r6   r   r7   r   dumploadr   r4   r   )rW   r)   r^   r   fpresult2r   r   r    test_memorized_pickling  s   
r   c                 C   s
  t t| j}|d}t t| j}|d}| | ks J t|t|ks*J tt}t| t|d t t| jdt d}|d}|  t t| jdd}|d}|  t t| jdt d}|d}|  t t| jdd}|d}|  d S )Nr      )r$   	timestamp)r$   r   )r	   r!   rQ   r   r   reprr   rs   )rW   r)   r   Zfunc2r   r   r   r    test_memorized_repr  s*   





r  c                 C   s  | dj}tj|d}d}t|d}|| W d    n1 s$w   Y  || dd l}t	|jdd}|
|j}	|	d |	d |	d t|d}|d	|  W d    n1 sbw   Y  |	d |	d t| t | d
}t|d}|| W d    n1 sw   Y  |	d |	d tjd tjd dd l}|
|j}	|	d |	d |  \}
}|
dksJ d S )NZ
tmp_importztmp_joblib_.pyz$def f(x):
    print(x)
    return x
r0   r   r"   r   r   z

z-def f(x):
    print("x=%s" % x)
    return x
z
Reloading
tmp_joblib_z1
2
Reloading
x=1
)mkdirrQ   r4   r5   r6   r7   r8   Zsyspath_prependr  r   r&   r!   rR   rS   sysstdoutmodulespop
readouterr)ZcapsysrW   r   dir_namer^   contentZmodule_filetmpr+   r!   rZ   errr   r   r    test_memory_file_modification  sD   


r  c                 C   r   r:   r   r   r   r   r   r    _function_to_cache  r   r  c                 C      | | S r:   r   r  r   r   r    _sum#     r  c                 C   s   | | S r:   r   r  r   r   r    _product'  r  r  c                 C   s   t jt_t| jdd}|t}|dddksJ |dddks"J tt tjt_|dddks4J |dddks=J W d    d S 1 sHw   Y  d S )Nr   r"   r   r   r%   )	r  rp   r  r   rQ   r&   r   r   r  )rW   r+   r!   r   r   r    *test_memory_in_memory_function_code_change+  s   

"r  c                  C   s   t d d} |   d S )Nr   )r   rT   )r+   r   r   r    $test_clear_memory_with_none_location;  s   
r  kw1kw2r  r  c                C   s   | |||fS r:   r   )r   r   r  r  r   r   r    func_with_kwonly_args@  s   r  r   r   returnc                 C   r  r:   r   r  r   r   r    func_with_signatureD  r  r  c                 C   s  t | jdd}|t}|dddddksJ tt}|ddddd	 W d    n1 s.w   Y  |d
 |ddddd tt}|ddddd	 W d    n1 sWw   Y  |d
 |jtdgd}|ddddddksuJ |ddddddksJ d S )Nr   r"   r   r   r%   )r  )r   r   r%   r  rk   )r  z?Keyword-only parameter 'kw1' was passed as positional parameterr  r  r   )r   r   r%   rk   Zignored)r   rQ   r&   r  r   
ValueErrormatch)rW   r+   func_cachedexcinfor   r   r    !test_memory_func_with_kwonly_argsH  s   




r"  c                 C   s.   t | jdd}|t}|dddksJ d S )Nr   r"   r   g       @g      @)r   rQ   r&   r  )rW   r+   r   r   r   r    test_memory_func_with_signatureb  s   
r#  c                    st   t | jdd}| dd tt|}|D ]}| qt fdd|D } fdd|D }||fS )Nr   r"   c                 S      dS )N  aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaar   rE   r   r   r    get_1000_bytesl  r   z(_setup_toy_cache.<locals>.get_1000_bytesc                    s   g | ]}  |qS r   )r   )re   rF   )r&  r   r    
<listcomp>u      z$_setup_toy_cache.<locals>.<listcomp>c                    s    g | ]}t jjj |qS r   )r4   r5   r6   r2   r#   )re   r   r   r&  r   r    r'  w  s    )r   rQ   r&   rP   r'   r   )rW   
num_inputsr+   ZinputsrF   Zhash_dirnamesZfull_hashdirsr   r)  r    _setup_toy_cachei  s   


r+  c                    s   t | \}}}|j }dd |D }t|t|ksJ dd   fdd|D }dd |D }||ks7J dd |D }dd |D }	d	d |D }
|
|	ksRJ d S )
Nc                 S      g | ]}|j qS r   )r5   re   cir   r   r    r'        z#test__get_items.<locals>.<listcomp>c                    s*    fddt  D }tdd |D S )Nc                    s   g | ]	}t j |qS r   r4   r5   r6   re   fn	directoryr   r    r'        z;test__get_items.<locals>.get_files_size.<locals>.<listcomp>c                 s   s    | ]	}t j|V  qd S r:   )r4   r5   getsize)re   r   r   r   r    rg     rh   z:test__get_items.<locals>.get_files_size.<locals>.<genexpr>)r4   rr   sum)r4  Z
full_pathsr   r3  r    get_files_size  s   z'test__get_items.<locals>.get_files_sizec                    s   g | ]} |qS r   r   re   Zhash_dirr8  r   r    r'    s    c                 S   r,  r   )sizer-  r   r   r    r'    r/  c                 S   s   g | ]	}t j|d qS )r/   r0  r9  r   r   r    r'    r5  c                 S   s    g | ]}t j tj|qS r   )datetimefromtimestampr4   r5   getatimer1  r   r   r    r'    s    c                 S   r,  r   Zlast_accessr-  r   r   r    r'    r/  )r+  r2   r3   set)rW   r+   Zexpected_hash_dirsr-   itemsZ	hash_dirsZexpected_hash_cache_sizesZhash_cache_sizesZoutput_filenamesZexpected_last_accessesZlast_accessesr   r:  r    test__get_items~  s   
rB  c                 C   s$  t | dd\}}}|jd}|g ksJ t | \}}}|j }|jd}t|}tt|t|s7J t||d ksAJ |jd}t|t|ksQJ |jd}|g ks]J d}	|j|	}
t|
soJ t||jd	}t||}t	d
d |D t
d
d |D ksJ d S )Nr   )r*  Z1KZ2Kr   i   1M  ip  c                 s   s    | ]}|j V  qd S r:   r?  r-  r   r   r    rg     s    z,test__get_items_to_delete.<locals>.<genexpr>)r+  r2   Z_get_items_to_deleter3   r(   r@  issubsetsorted
differencemaxmin)rW   r+   r-   Zitems_to_deleteZexpected_hash_cachedirsrA  Z	nb_hashesZitems_to_delete_2048bZitems_to_delete_emptybytes_limit_too_smallZitems_to_delete_500bZitems_to_delete_6000bZsurviving_itemsr   r   r    test__get_items_to_delete  s.   
rK  c                 C   s   t | \}}}|j }|  |j }t|t|ksJ |jdd |j }t|t|ks4J |jdd |j }tt|t|sKJ t|dksSJ d}|j|d |j }|g ksfJ d S )NrC  )Zbytes_limitZ3Kr   rD  r+  r2   r3   reduce_sizerF  r@  rE  r(   )rW   r+   r-   ref_cache_itemscache_itemsrJ  r   r   r    #test_memory_reduce_size_bytes_limit  s    




rP  c                 C   s   t | \}}}|j }|  |j }t|t|ksJ |jdd |j }t|t|ks4J |jdd |j }tt|t|sKJ t|dksSJ |jdd |j }|g ksdJ d S )NrJ   )Zitems_limitr   r   rL  )rW   r+   r-   rN  rO  r   r   r    #test_memory_reduce_size_items_limit  s   




rQ  c                 C   sZ  dd l }dd l}t| \}}}|j }|  |j }t|t|ks'J |j|jddd |j }t|t|ks@J |d |d |d |j|jddd |j }t	
t	|t	|rhJ t|dkspJ tjtd	d
 |j|jddd W d    n1 sw   Y  |d |j|jddd |j }|g ksJ d S )Nr   r   )days)Z	age_limitsecondsr   zhas to be a positiver  gMbP?)r<  rs   r+  r2   r3   rM  rF  	timedeltart   r@  rE  r(   r   r   r  )rW   r<  rs   r+   r-   Z	put_cacherN  rO  r   r   r    !test_memory_reduce_size_age_limit  s0   






rY  c                 C   s@   t | \}}}|  t|jjg ksJ |jddrJ d S )Nrk   )
stacklevel)r+  rT   r4   rr   r2   r#   r   )rW   r+   r-   rX   r   r   r    test_memory_clear  s   r[  c                  C   s   dgd } | S )Nr%  i  r   )complex_objr   r   r    fast_func_with_complex_output#  rH   r]  c                 C   s"   dd t tdD }| r|S dS )Nc                 S   s   i | ]}t ||qS r   )r   rd   r   r   r    
<dictcomp>)  r(  z=fast_func_with_conditional_complex_output.<locals>.<dictcomp>g     j@zsimple output)r'   int)Zcomplex_outputr\  r   r   r    )fast_func_with_conditional_complex_output(  s   r`  c                    b   t | jd}|t tdd fddtdD  | \}}d}||vs)J ||vs/J d S )Nr   r   ra   c                 3   s    | ]}t   V  qd S r:   rc   rd   r   r   r    rg   5  s    zMtest_cached_function_race_condition_when_persisting_output.<locals>.<genexpr>r%   r   )r   rQ   r&   r]  r   r'   r
  rW   Zcapfdr+   r  stderrr   r   rb  r    :test_cached_function_race_condition_when_persisting_output-  s   
 re  c                    ra  )Nr   r   ra   c                 3   s,    | ]}t  |d  dkrdndV  qdS )r   r   TFNrc   rd   rb  r   r    rg   K  s    
zOtest_cached_function_race_condition_when_persisting_output_2.<locals>.<genexpr>r%   r   )r   rQ   r&   r`  r   r'   r
  rc  r   rb  r    <test_cached_function_race_condition_when_persisting_output_2A  s   
rf  c              
   C   s   t | jd}dd }||}d}||\}}||ksJ t| t||}||\}	}
t|dks4J d}||d v s>J |	|ksDJ |
|ksJJ t| ||}z|  td t	yy } zd	}|t
|jv snJ W Y d }~d S d }~ww )
Nr   c                 S   s   t d | t   fS )Ng{Gz?rs   rt   rE   r   r   r    r)   \  s   
zItest_memory_recomputes_after_an_error_while_loading_results.<locals>.funcrF   r   r   r   z<It normally not possible to load a corrupted MemorizedResultzis corrupted)r   rQ   r&   r9   rB   r(   r   r   AssertionErrorr   r   r   )rW   r   r+   r)   Zcached_funcZ	input_argrF   r  r   Zrecomputed_argZrecomputed_timestampr   	referenceer   r   r   r    ;test_memory_recomputes_after_an_error_while_loading_resultsY  s4   


 rk  c                   @   s   e Zd ZdZdS )IncompleteStoreBackendzAThis backend cannot be instantiated and should raise a TypeError.N)r   rV   r   __doc__r   r   r   r    rl    s    rl  c                   @   sP   e Zd ZdZdd Zdd Zdd Zdd	 Zd
d Zdd Z	dd Z
dd ZdS )DummyStoreBackendz(A dummy store backend that does nothing.c                 O   r$  )zOpen an item on store.Nr   )selfr   r   r   r   r    
_open_item  r   zDummyStoreBackend._open_itemc                 C   r$  )z!Check if an item location exists.Nr   ro  r#   r   r   r    _item_exists  r   zDummyStoreBackend._item_existsc                 C   r$  )z&Move an item from src to dst in store.Nr   )ro  srcdstr   r   r    
_move_item  r   zDummyStoreBackend._move_itemc                 C   r$  )zCreate location on store.Nr   rq  r   r   r    create_location  r   z!DummyStoreBackend.create_locationc                 C   r$  )z&Check if an object exists in the storeFr   ro  objr   r   r    r     r   zDummyStoreBackend.existsc                 C   r$  )zClear object on storeNr   rw  r   r   r    clear_location  r   z DummyStoreBackend.clear_locationc                 C   s   g S )z3Returns the whole list of items available in cache.r   )ro  r   r   r    r3     r   zDummyStoreBackend.get_itemsc                 O   r$  )zConfigure the storeNr   )ro  r#   r   r   r   r   r    	configure  r   zDummyStoreBackend.configureN)r   rV   r   rm  rp  rr  ru  rv  r   ry  r3   rz  r   r   r   r    rn    s    rn  invalid_prefixc                 C   s@   t t}t| d  W d    n1 sw   Y  |d d S )Nz&Store backend name should be a string*r   r  r   r  )r{  r!  r   r   r    (test_register_invalid_store_backends_key     
r}  c                  C   s@   t t} tdd  W d    n1 sw   Y  | d d S )Nfsz.Store backend should inherit StoreBackendBase*r|  r!  r   r   r    +test_register_invalid_store_backends_object  r~  r  c                  C   sB   t t} tddd W d    n1 sw   Y  | d d S )Nz/tmp/joblibunknown)r#   backendzUnknown location*)r   	TypeErrorr   r  r  r   r   r    !test_memory_default_store_backend  s   
r  c                  C   sf   G dd d} |  }t t}td|d W d    n1 sw   Y  d}|t|d jv s1J d S )Nc                   @   r   )zHtest_warning_on_unknown_location_type.<locals>.NonSupportedLocationClassNr   r   r   r   r    NonSupportedLocationClass  r   r  localr   zbInstantiating a backend using a NonSupportedLocationClass as a location is not supported by joblibr   )r   UserWarningr   r   r   )r  Zunsupported_locationr   Zexpected_mesager   r   r    %test_warning_on_unknown_location_type  s   
r  c                  C   sb   d} t | t | tft v sJ tt}t| d W d    n1 s%w   Y  |d d S )NZisbZfake_locationznCan't instantiate abstract class IncompleteStoreBackend (without an implementation for|with) abstract methods*)r   rl  r   rA  r   r  r   r  )backend_namer!  r   r   r    )test_instanciate_incomplete_store_backend  s   

r  c                  C   s>   d} t | t | tft v sJ t| d}t|tsJ d S )NZdsbZdummy_location)r   rn  r   rA  r   r   )r  backend_objr   r   r    test_dummy_store_backend  s
   

r  c               
   C   sF   t d} td| }z|jdksJ W tjddd d S tjddd w )NZsome_folderr  TrM   )r   r   r#   rR   rS   )r5   r  r   r   r    0test_instanciate_store_backend_with_pathlib_path  s
   
"r  c                 C   sj   d}t  }|jd u sJ t| t||jd dksJ || j t||j| jdks/J t| d S )Nz-FileSystemStoreBackend(location="{location}")r   )r   r#   r  r   rl   rz  rQ   )rW   Zrepr_patternr  r   r   r    "test_filesystem_store_backend_repr  s   r  c                 C   s   dd }t | jdd}||}d}t||j||jjdks!J |dd}d}t||j|jj|j|j	d	ks;J t|d
j|jjdksIJ d S )Nc                 S   r  r:   r   r  r   r   r    my_func  r  z)test_memory_objects_repr.<locals>.my_funcr   r"   z/MemorizedFunc(func={func}, location={location}))r)   r#   *   zJMemorizedResult(location="{location}", func="{func}", args_id="{args_id}"))r#   r)   r   zMemory(location={location})r   )
r   rQ   r&   r   rl   r2   r#   r   r   r   )rW   r  r+   Zmemorized_funcZmemorized_func_reprmemorized_resultZmemorized_result_reprr   r   r    test_memory_objects_repr  s$   



r  c                 C   s   t | jd}|jdd }|d}t|}t|}|jj|jjks&J |j	|j	ks.J |j
|j
ks6J t|t|ks@J d S )Nr   c                 S      | d S r   r   r|   r   r   r    rX   6  r   z'test_memorized_result_pickle.<locals>.grk   )r   rQ   r&   r   r   r   r   r2   r#   r)   r   r   )rW   r+   rX   r  Zmemorized_result_pickleZmemorized_result_loadsr   r   r    test_memorized_result_pickle/  s   



r  c                 C   sh   |d u rg }t | }t |}t| t| ksJ | D ]}||v r'q || || ks1J q d S r:   )varsr@  keys)leftrightignored_attrsZ	left_varsZ
right_varsattrr   r   r    compareG  s   r  memory_kwargsr%   r   )rL   r$   r   Z	parameterZunused)rK   r$   Zbackend_optionsc                 C   s  t dd| ji|}tt|}t|j|j t||tg dd t|t|ks.J |	t
}tt|}t|j|j t||tg dd t|t|ksWJ |d}tt|}t|j|j t||tg dd t|t|ksJ d S )Nr#   )r2   r  Z_func_code_id)r  r   r   )r   rQ   r   r   r   r  r2   r@  r   r&   r!   r   )rW   r  r+   Zmemory_reloadedr   Zfunc_cached_reloadedr  Zmemorized_result_reloadedr   r   r    test_memory_pickle_dump_loadT  s6   




r  c                 C   s   | tj d}t| jdd}|jdd }||}d|jv s!J |  t| jdd}|jdd }||}d|jvs>J |  d S )	Nr%      r"   c                 S   r  r   r   r|   r   r   r    r!     r   ztest_info_log.<locals>.fZQueryingr   c                 S   r  r   r   r|   r   r   r    r!     r   )Z	set_levelloggingINFOr   rQ   r&   textrT   )rW   Zcaplogr   r+   r!   r-   r   r   r    test_info_log  s   

r  c                   @   sL   e Zd ZdZdddZdd Zejddd	gd
d Z	dd Z
dd ZdS )TestCacheValidationCallbackz.Tests on parameter `cache_validation_callback`Nc                 C   s"   d|d< |d urt | |d S )NTrunr   rg  )ro  r   r   delayr   r   r    foo  s   
zTestCacheValidationCallback.fooc                 C   sD   d}t jt|d |jdd W d   dS 1 sw   Y  dS )z2Test invalid values for `cache_validation_callbackz9cache_validation_callback needs to be callable. Got True.rW  Tr   N)r   r   r  r&   )ro  r+   r  r   r   r    &test_invalid_cache_validation_callback  s   "zBTestCacheValidationCallback.test_invalid_cache_validation_callbackr   TFc                    sr   |j | j fdddgd}ddiddi}}|d|dks J |d|dks)J |d s/J |d  ks7J d	S )
zTest expiry of old resultsc                    r   r:   r   r   r   r   r    r     r   zUTestCacheValidationCallback.test_constant_cache_validation_callback.<locals>.<lambda>r   r   r   r  Fr   rk   Nr&   r  )ro  r+   r   r!   d1d2r   r   r    'test_constant_cache_validation_callback  s   
zCTestCacheValidationCallback.test_constant_cache_validation_callbackc                 C   s   dd }|j | j|dgd}ddiddi}}|d|dd	d
ks"J |d|dd	d
ks-J |d s3J |d s9J ddiddi}}|d|dd	d
ksMJ |d|dd	d
ksXJ |d s^J |d rdJ dS )z*Test cache validity based on run duration.c                 S   s   | d }|dkr
dS d S )Ndurationg?Tr   )metadatar  r   r   r    r     s   z^TestCacheValidationCallback.test_memory_only_cache_long_run.<locals>.cache_validation_callbackr   r  r  Fr   r   )r  rk   rj   Nr  )ro  r+   r   r!   r  r  r   r   r    test_memory_only_cache_long_run  s   
z;TestCacheValidationCallback.test_memory_only_cache_long_runc                 C   s   |j | jtdddgd}ddiddiddi}}}|d|dks$J |d|dks-J td	 |d|dks;J |d sAJ |d rGJ |d sMJ d
S )z!Test expiry of old cached resultsg333333?rU  r   r  r  Fr   rk   r   N)r&   r  r   rs   rt   )ro  r+   r!   r  r  Zd3r   r   r    test_memory_expires_after  s   
z5TestCacheValidationCallback.test_memory_expires_afterr:   )r   rV   r   rm  r  r  r   markr   r  r  r  r   r   r   r    r    s    

r  c                   @   s,   e Zd ZdZedd Zdd Zdd ZdS )	TestMemorizedFunc8Tests for the MemorizedFunc and NotMemorizedFunc classesc                 C   s   | | dd || < ||  S )Nr   r   )r   )r   counterr   r   r    r!     s   zTestMemorizedFunc.fc                 C   sp   |j | jdgd}i }|d|dksJ |d|dksJ |d|\}}|dks-J dt|ts6J ddS )Test calling the functionr  r   r   r   f has not been called properly0Metadata are not returned by MemorizedFunc.call.N)r&   r!   callr   dictro  r+   r!   r  r   metar   r   r    test_call_method_memorized  s   z,TestMemorizedFunc.test_call_method_memorizedc                 C   sh   t | j}i }|d|dksJ |d|dksJ |d|\}}|dks)J dt|ts2J ddS )r  r   r   r%   r  r  N)r   r!   r  r   r  r  r   r   r    test_call_method_not_memorized  s   
z0TestMemorizedFunc.test_call_method_not_memorizedN)r   rV   r   rm  staticmethodr!   r  r  r   r   r   r    r    s    
r  c                   @   s    e Zd ZdZdd Zdd ZdS )TestAutoGitignorer  c                 C   sP   t |d}t|}|t}|d |d }| sJ | dks&J dS )zsTest that using the memory object automatically creates a `.gitignore` file
        within the new cache directory.test_cache_dirr   
.gitignorez%# Created by joblib automatically.
*
N)r   r  r   r&   idr   	read_text)ro  rW   r#   memZcostly_operationgitignore_filer   r   r    test_memory_creates_gitignore  s   
z/TestAutoGitignore.test_memory_creates_gitignorec                 C   sZ   t |d}|d }d}|| t|}|td | s#J | |ks+J dS )zvTest that using the memory object does not overwrite an existing
        `.gitignore` file within the cache directory.r  r  z# Existing .gitignore file!r   N)r   r  
write_textr   r&   r  r   r  )ro  rW   r#   r  Zexisting_contentr  r   r   r    1test_memory_does_not_overwrite_existing_gitignore  s   
zCTestAutoGitignore.test_memory_does_not_overwrite_existing_gitignoreN)r   rV   r   rm  r  r  r   r   r   r    r    s    r  r   )rJ   )Tr:   )wrm  r<  r   r   r  r4   Zos.pathr   rR   r  rn   rs   pathlibr   r   Zjoblib._store_backendsr   r   Zjoblib.hashingr   Zjoblib.memoryr   r   r   r	   r
   r   r   r   r   r   r   r   Zjoblib.parallelr   r   Zjoblib.test.commonr   r   r   Zjoblib.testingr   r   r   r!   r.   r9   rB   r[   ru   rw   rz   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r  r   r   r   r   r  r  r  r  r  r  r  r  r_  floatr  r"  r#  r+  rB  rK  rP  rQ  rY  r[  r]  r`  re  rf  rk  rl  rn  r  rP   r}  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r   r   r   r    <module>   s    8
.
i


'
 
$ 9
(%



-$

 

(K'