o
    `^h                     @   s2  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mZ ddlmZmZ ddlmZmZ ddlmZ ddlmZmZ dd	lmZmZ dd
lmZ ddlmZmZ ddlmZm Z  ddl!m"Z"m#Z# ddl!m$Z$ ddl%m&Z&m'Z'm(Z( ddl)m*Z* dddZ+dd Z,dd Z-dd Z.dd Z/e&dddgdd  Z0d!d" Z1d#d$ Z2d%d& Z3d'd( Z4d)d* Z5d+d, Z6d-d. Z7d/d0 Z8g fd1d2Z9d3d4 Z:e"e&d5dd6gd7d8 Z;e"d9d: Z<d;d< Z=d=d> Z>d?d@ Z?dAdB Z@e&dCdDgdEd6fg dFdfgdGdH ZAdIdJ ZBdKdL ZCdMdN ZDdOdP ZEdQdR ZFdSdT ZGdUdV ZHdWdX ZIdYdZ ZJd[d\ ZKd]d^ ZLd_d` ZMdadb ZNdcdd ZOdedfdgdhdiZPdjeQdkeRdleRfdmdnZSdodp ZTdqdr ZUddsdtZVdudv ZWdwdx ZXdydz ZYd{d| ZZd}d~ Z[dd Z\dd Z]dddZ^e$dd Z_e$dd Z`dd ZaG dd deZbG dd deZce&dded ee gdd Zfdd Zgdd Zhdd Zidd Zjdd Zkdd Zldd Zmdd Zndd ZodddZpejq&ddddd6dddidgdd Zrdd Zsdd ZtG dd dZuG dd dZvdS )z
Test the memory module.
    N)Memory)expires_after)MemorizedFuncNotMemorizedFunc)MemorizedResultNotMemorizedResult)_FUNCTION_HASHES)register_store_backend_STORE_BACKENDS)_build_func_identifier_store_backend_factory)JobLibCollisionWarning)Paralleldelayed)StoreBackendBaseFileSystemStoreBackend)
with_numpynp)with_multiprocessing)parametrizeraiseswarns)hash   c                 C   s   | d | S )z3 A module-level function for testing purposes.
        xyr   r   U/home/air/shanriGPT/back/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 )z Given 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_lazy2   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*   single_cache_itemoutput_filenamer    r   r   r   corrupt_single_cache_itemA   s
   "r:   c                    s"   g   fdd}| | d|  S )Nc                    s     |  d S Nappend)itemrecordedr   r   append_to_recordO   s   z6monkeypatch_cached_func_warn.<locals>.append_to_recordwarn)setattr)r(   monkeypatch_fixturerA   r   r?   r   monkeypatch_cached_func_warnH   s   rE   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    _      
z"test_memory_integration.<locals>.f)FT)rN
   )r"   r#   	mmap_modecompressT)ignore_errorsr   F)rB   __main__r   r!   N)listr-   strpathr   shutilrmtreer%   clearr'   eval
__module__)tmpdirr    rO   rN   r*   gcurrent_accumulatoroutr   rJ   r   test_memory_integrationW   s(   

r]   call_before_reducingTFc           
         s  dD ]}d}d |}ttt||dd t d }d|_|ddks'J |jj|ks/J t	| j
d	d
}|| tt| d dksHJ t| d d	 }d|v sWJ | d | }|d	krt|dgkskJ t|d g ksvJ |r d tt|d dksJ tdd fdddD }	ntdd fdddD }	t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    rQ   r   r   r!   joblibzipython-inputr$   r   n_jobsc                 3       | ]	}t  |V  qd S r;   r   .0r+   cached_fr   r   	<genexpr>       zHtest_parallel_call_cached_function_defined_in_jupyter.<locals>.<genexpr>)r   r   c                 3   re   r;   rf   rg   ri   r   r   rk      rl      )formatr_   compiletextwrapdedentlocalsrX   __code__co_filenamer   rS   r%   r'   r3   listdirr   )
rY   r^   
session_noipython_cell_sourceipython_cell_id	aliased_fr*   f_cache_relative_directoryf_cache_directoryresr   ri   r   5test_parallel_call_cached_function_defined_in_jupyter   sF   



	r}   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 memoize c                    rF   rG   r<   rH   rJ   r   r   ff   rK   ztest_no_memory.<locals>.ffNr   r!   rm   r   )rR   r   r%   r&   r'   )r~   r*   ggr,   r[   r   rJ   r   test_no_memory   s   
r   c                    sR   t   d
 fdd	}t| | j t| jdd}||}|ddd	dks'J dS )z4 Test memory with a function with keyword arguments.Nr   c                    rF   rG   r<   arg1arg2rJ   r   r   rZ      rK   ztest_memory_kwarg.<locals>.gr   r!      r   r   rG   )rR   r-   rS   r   r%   )rY   rZ   r*   r   rJ   r   test_memory_kwarg   s   
r   c                    s,   t    fddtfdd | j dS )z+ Test memory with a function with a lambda.c                    rF   z4 A helper function to define l as a lambda.
        r   r<   r   rJ   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)rR   r-   rS   )rY   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 )z0 A first function called name_collision
        r   r   r   r   r   name_collision     z2test_memory_name_collision.<locals>.name_collisionc                 S   r   )z1 A second function called name_collision
        r   r   r   r   r   r     r   r   N	collision)r   rS   r%   r   r   r'   strmessage)rY   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   1      z7test_memory_warning_lambda_collisions.<locals>.<lambda>c                 S      | d S rG   r   r   r   r   r   r   2  r   r   r   rm   )r   rS   r%   r   r   r'   )rY   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   rS   rW   r%   r   r   r'   r   r   lower)rY   r*   a1b1r   r   r   r   'test_memory_warning_collision_detection>  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   rJ   r   r   r(   T  r   z!test_memory_partial.<locals>.funcr   Nr   )rR   	functoolspartialr-   rS   )rY   r(   r   functionr   rJ   r   test_memory_partialP  s
   r   c                 C   s4   t | jdd}td}||}|ddksJ dS )zF Smoke test memory with a function with a function defined in an eval.r   r!   r   r   N)r   rS   rW   r%   )rY   r*   mmmr   r   r   test_memory_eval`  s   
r   c                 C   s   t | }| d |S )zx A function with a side effect in its arguments.

        Return the length of its argument and append one element.
    N)r'   r=   )r   len_xr   r   r   count_and_appendj  s   
r   c                 C   s8   t | jdd}|t}| dksJ | dksJ dS )zx Check that if a function has a side effect in its arguments, it
        should use the hash of changing arguments.
    r   r!   r   N)r   rS   r%   r   )rY   r*   r(   r   r   r   test_argument_changet  s   
r   rN   rL   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                    rF   rG   r<   rH   rJ   r   r   n  rK   ztest_memory_numpy.<locals>.nr   r"   rN   r#   r$   )rM   rM   r   r;   )rR   r   rS   r%   r   randomRandomStater&   random_sampleallr'   )	rY   rN   r   r*   cached_nrndr+   r   r,   r   rJ   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 callrL   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   rS   r%   r   ones
isinstancememmapra   gccollectr:   rE   r'   )
rY   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 )z1 Smoketest the exception handling of Memory.
    r   r!   c                   @      e Zd ZdS )z*test_memory_exception.<locals>.MyExceptionN__name__rX   __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   rS   	Exceptionr%   r&   r   )rY   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 memory r   r!   r   ignorer   c                         d d S rG   r<   r   rJ   r   r   z     ztest_memory_ignore.<locals>.zr   r   Nr   r   rS   rR   r%   r   r'   )rY   r*   r   r   rJ   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 )z; Test the ignore feature of memory on a decorated function r   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   rG   r<   r   rJ   r   r   r     s   z'test_memory_ignore_decorated.<locals>.zr   r   Nr   r   )rY   r*   r   r   r   rJ   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   rG   r   r   r   r   r   plus_one
  r   z,test_memory_args_as_kwargs.<locals>.plus_oner   r   r   r$   N)r   rS   r%   )rY   r*   r   r   r   r   test_memory_args_as_kwargs  s   
r   zignore, verbose, mmap_moder   d   rM   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#   rN   c                 S      d S r;   r   r   r   r   r   r        z"test_partial_decoration.<locals>.zN)r   rS   r%   r   _verboserN   )rY   r   r#   rN   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    rb   zfunc_code.pyr   r.   )r   rS   r   splitr=   r5   r%   r    r   r3   r4   r1   r"   existsdirnamer   rV   _check_previous_func_code_get_args_idfunc_idremove)	rY   r*   r4   rZ   r   r"   args_id
output_dirr   r   r   r   test_func_dir&  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   rS   r%   r    pickleloadsdumpsr   r3   r4   r5   r1   r"   r   r   	load_item)	rY   r*   rZ   outputr   r   r   memory2gpr   r   r   test_persistenceF  s   


r   c                 C   s   t t| jt| jddtfD ].}|d}|rJ t|ts"J |ddks*J |d}|s3J t|ts:J |  qd S )Nr   r!   r      )	r   r    rS   r   r%   check_call_in_cacher   boolrV   )rY   r(   resultr   r   r   test_check_call_in_cache]  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    rS   r   r   r%   r   r   call_and_shelver   getrV   r   KeyError)rY   r(   Resultr   r   r   r   test_call_and_shelvej  s,   



r  c                 C   s   t | jddt}|d}t|tsJ tt}|j	|j
ks#J W d    n1 s-w   Y  t|dks:J dt|d jv sEJ d S )Nr   r!   r   r   z1The 'argument_hash' attribute has been deprecated)r   rS   r%   r    r   r   r   r   DeprecationWarningargument_hashr   r'   r   r   )rY   r(   r   r/   r   r   r   "test_call_and_shelve_argument_hash  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.test_access      ?z>filesystem does not support fine-grained access time attributer   r!   r   r.   r   r   N)r5   r7   r3   statrS   st_atimetimesleepreadpytestskipr   r%   r    r   r4   r1   r"   r   r   r   r   r   )	rY   test_access_time_filetest_access_timer*   r(   r   result_path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    rS   r   r5   r   r6   r   dumploadr   r3   r   )rY   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    rS   r   r   reprr   r  )rY   r(   r   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 )N
tmp_importztmp_joblib_.pyz$def f(x):
    print(x)
    return x
r/   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
)mkdirrS   r3   r4   r5   r6   r7   syspath_prependr"  r   r%   r    rT   rU   sysstdoutmodulespop
readouterr)capsysrY   r   dir_namer`   contentmodule_filetmpr*   r    r\   errr   r   r   test_memory_file_modification  sD   


r0  c                 C   r   r;   r   r   r   r   r   r   _function_to_cache  r   r2  c                 C      | | S r;   r   r1  r   r   r   _sum     r4  c                 C   s   | | S r;   r   r1  r   r   r   _product  r5  r6  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$   )	r4  rs   r2  r   rS   r%   r   r   r6  )rY   r*   r    r   r   r   *test_memory_in_memory_function_code_change"  s   

"r7  c                  C   s   t d d} |   d S )Nr   )r   rV   )r*   r   r   r   $test_clear_memory_with_none_location2  s   
r8  kw1kw2r9  r:  c                C   s   | |||fS r;   r   )r   r   r9  r:  r   r   r   func_with_kwonly_args7  s   r<  r   r   returnc                 C   r3  r;   r   r1  r   r   r   func_with_signature;  r5  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$   )r9  )r   r   r$   r:  rm   )r:  z?Keyword-only parameter 'kw1' was passed as positional parameterr;  r:  r   )r   r   r$   rm   ignored)r   rS   r%   r<  r   
ValueErrormatch)rY   r*   func_cachedexcinfor   r   r   !test_memory_func_with_kwonly_args?  s   




rD  c                 C   s.   t | jdd}|t}|dddksJ d S )Nr   r!   r   g       @g      @)r   rS   r%   r>  )rY   r*   rB  r   r   r   test_memory_func_with_signature[  s   
rE  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   rH   r   r   r   get_1000_bytese  r   z(_setup_toy_cache.<locals>.get_1000_bytesc                    s   g | ]}  |qS r   )r   )rh   rI   )rH  r   r   
<listcomp>n  s    z$_setup_toy_cache.<locals>.<listcomp>c                    s    g | ]}t jjj |qS r   )r3   r4   r5   r1   r"   )rh   r   r   rH  r   r   rI  q  s
    )r   rS   r%   rR   r&   r   )rY   
num_inputsr*   inputsrI   hash_dirnamesfull_hashdirsr   rJ  r   _setup_toy_cacheb  s   



rO  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   )r4   rh   cir   r   r   rI  z      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   r3   r4   r5   rh   fn	directoryr   r   rI  ~      z;test__get_items.<locals>.get_files_size.<locals>.<listcomp>c                 s   s    | ]	}t j|V  qd S r;   )r3   r4   getsize)rh   r  r   r   r   rk     rl   z:test__get_items.<locals>.get_files_size.<locals>.<genexpr>)r3   ru   sum)rX  
full_pathsr   rW  r   get_files_size}  s   
z'test__get_items.<locals>.get_files_sizec                    s   g | ]} |qS r   r   rh   hash_dirr]  r   r   rI    s    c                 S   rP  r   )sizerQ  r   r   r   rI    rS  c                 S   s   g | ]	}t j|d qS )r.   rT  r^  r   r   r   rI    rY  c                 S   s    g | ]}t j tj|qS r   )datetimefromtimestampr3   r4   getatimerU  r   r   r   rI    s    c                 S   rP  r   last_accessrQ  r   r   r   rI    rS  )rO  r1   r2   set)rY   r*   expected_hash_dirsr,   items	hash_dirsexpected_hash_cache_sizeshash_cache_sizesoutput_filenamesexpected_last_accesseslast_accessesr   r`  r   test__get_itemsw  s$   

rp  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   )rK  1K2Kr   i   1M  ip  c                 s       | ]}|j V  qd S r;   re  rQ  r   r   r   rk         z,test__get_items_to_delete.<locals>.<genexpr>c                 s   ru  r;   re  rQ  r   r   r   rk     rv  )rO  r1   _get_items_to_deleter2   r'   rg  issubsetsorted
differencemaxmin)rY   r*   r,   items_to_deleteexpected_hash_cachedirsri  	nb_hashesitems_to_delete_2048bitems_to_delete_emptybytes_limit_too_smallitems_to_delete_500bitems_to_delete_6000bsurviving_itemsr   r   r   test__get_items_to_delete  s.   
r  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 )Nrs  )bytes_limit3Kr   rt  rO  r1   r2   reduce_sizery  rg  rx  r'   )rY   r*   r,   ref_cache_itemscache_itemsr  r   r   r   #test_memory_reduce_size_bytes_limit  s    




r  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 )NrM   )items_limitr   r   r  )rY   r*   r,   r  r  r   r   r   #test_memory_reduce_size_items_limit  s   




r  c                 C   s  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 |j|jddd |j }|g ksJ d S )	Nr   r   )days)	age_limitr  secondsr   )r  rb  rO  r1   r2   r  ry  	timedeltar  rg  rx  r'   )rY   r  rb  r*   r,   	put_cacher  r  r   r   r   !test_memory_reduce_size_age_limit  s(   





r  c                 C   s@   t | \}}}|  t|jjg ksJ |jddrJ d S )Nrm   )
stacklevel)rO  rV   r3   ru   r1   r"   r   )rY   r*   r,   rZ   r   r   r   test_memory_clear  s   r  c                  C   s   dgd } | S )NrG  i  r   )complex_objr   r   r   fast_func_with_complex_output  rK   r  c                 C   s"   dd t tdD }| r|S dS )Nc                 S   s   i | ]}t ||qS r   )r   rg   r   r   r   
<dictcomp>  s    z=fast_func_with_conditional_complex_output.<locals>.<dictcomp>g     j@zsimple output)r&   int)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   rc   c                 3   s    | ]}t   V  qd S r;   rf   rg   rB  r   r   rk   *  s    zMtest_cached_function_race_condition_when_persisting_output.<locals>.<genexpr>r$   r   )r   rS   r%   r  r   r&   r)  rY   capfdr*   r&  stderrr   r   r  r   :test_cached_function_race_condition_when_persisting_output"  s   
 r  c                    r  )Nr   r   rc   c                 3   s,    | ]}t  |d  dkrdndV  qdS )r   r   TFNrf   rg   r  r   r   rk   A  s    $zOtest_cached_function_race_condition_when_persisting_output_2.<locals>.<genexpr>r$   r   )r   rS   r%   r  r   r&   r)  r  r   r  r   <test_cached_function_race_condition_when_persisting_output_26  s   
r  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?r  r  rH   r   r   r   r(   R  s   
zItest_memory_recomputes_after_an_error_while_loading_results.<locals>.funcrI   r   r   r   z<It normally not possible to load a corrupted MemorizedResultzis corrupted)r   rS   r%   r:   rE   r'   r   r   AssertionErrorr   r   r   )rY   r   r*   r(   cached_func	input_argrI   r  r   recomputed_argrecomputed_timestampr   	referenceer   r   r   r   ;test_memory_recomputes_after_an_error_while_loading_resultsN  s4   


 r  c                   @   s   e Zd ZdZdS )IncompleteStoreBackendzAThis backend cannot be instantiated and should raise a TypeError.N)r   rX   r   __doc__r   r   r   r   r  }  s    r  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   rF  )zOpen an item on store.Nr   )selfr   r   r   r   r   
_open_item  r   zDummyStoreBackend._open_itemc                 C   rF  )z!Check if an item location exists.Nr   r  r"   r   r   r   _item_exists  r   zDummyStoreBackend._item_existsc                 C   rF  )z&Move an item from src to dst in store.Nr   )r  srcdstr   r   r   
_move_item  r   zDummyStoreBackend._move_itemc                 C   rF  )zCreate location on store.Nr   r  r   r   r   create_location  r   z!DummyStoreBackend.create_locationc                 C   rF  )z&Check if an object exists in the storeFr   r  objr   r   r   r     r   zDummyStoreBackend.existsc                 C   rF  )zClear object on storeNr   r  r   r   r   clear_location  r   z DummyStoreBackend.clear_locationc                 C   s   g S )z3Returns the whole list of items available in cache.r   )r  r   r   r   r2     r   zDummyStoreBackend.get_itemsc                 O   rF  )zConfigure the storeNr   )r  r"   r   r   r   r   r   	configure  r   zDummyStoreBackend.configureN)r   rX   r   r  r  r  r  r  r   r  r2   r  r   r   r   r   r    s    r  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	   rA  )r  rC  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  rC  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   rA  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  unsupported_locationr   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 )Nisbfake_locationznCan't instantiate abstract class IncompleteStoreBackend (without an implementation for|with) abstract methods*)r	   r  r
   ri  r   r  r   rA  )backend_namerC  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 )Ndsbdummy_location)r	   r  r
   ri  r   r   )r  backend_objr   r   r   test_dummy_store_backend  s
   

r  c                  C   s&   t d} td| }|jdksJ d S )Nsome_folderr  )pathlibPathr   r"   )r4   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   rn   r  rS   )rY   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   r3  r;   r   r1  r   r   r   my_func   r5  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   rS   r%   r   rn   r1   r"   r   r   r   )rY   r  r*   memorized_funcmemorized_func_reprmemorized_result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   rZ   !  r   z'test_memorized_result_pickle.<locals>.grm   )r   rS   r%   r   r   r   r   r1   r"   r(   r   r   )rY   r*   rZ   r  memorized_result_pickle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;   )varsrg  keys)leftrightignored_attrs	left_vars
right_varsattrr   r   r   compare0  s   r  memory_kwargsr$   r   )rO   r#   r   	parameterunused)rN   r#   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"   )r1   r  _func_code_id)r  r   r   )r   rS   r   r   r   r  r1   rg  r   r%   r    r   )rY   r  r*   memory_reloadedrB  func_cached_reloadedr  memorized_result_reloadedr   r   r   test_memory_pickle_dump_load=  s.   




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    g  r   ztest_info_log.<locals>.fQueryingr   c                 S   r  r   r   r   r   r   r   r    q  r   )	set_levelloggingINFOr   rS   r%   textrV   )rY   caplogr   r*   r    r,   r   r   r   test_info_loga  s   

r  c                 C   s^   ddl m} |dkrtdtjtdd t| jdd}W d    d S 1 s(w   Y  d S )	Nr   )__version__z1.5z6Bytes limit is deprecated and should be removed by 1.4r  rA  rq  )r"   r  )rb   r  r  r  r   r   rS   )rY   r  r,   r   r   r   test_deprecated_bytes_limitz  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   r  )r  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.r  T)cache_validation_callbackN)r  r   r@  r%   )r  r*   rA  r   r   r   &test_invalid_cache_validation_callback  s   "zBTestCacheValidationCallback.test_invalid_cache_validation_callbackconsider_cache_validTFc                    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                    s    S r;   r   )r,   r  r   r   r     r   zUTestCacheValidationCallback.test_constant_cache_validation_callback.<locals>.<lambda>r   r
  r   r  Fr   rm   Nr%   r	  )r  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  rm   g?Nr  )r  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?r  r   r  r  Fr   rm   r  N)r%   r	  r   r  r  )r  r*   r    r  r  d3r   r   r   test_memory_expires_after  s   
z5TestCacheValidationCallback.test_memory_expires_afterr;   )r   rX   r   r  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 )	TestMemorizedFuncz8Tests 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r  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   rX   r   r  staticmethodr    r"  r#  r   r   r   r   r    s    
r  r   )rM   )Tr;   )wr  r   r   r  rT   r3   os.pathr  r   r%  r  rb  rp   r  joblib.memoryr   r   r   r   r   r   r   r	   r
   r   r   r   joblib.parallelr   r   joblib._store_backendsr   r   joblib.test.commonr   r   r   joblib.testingr   r   r   joblib.hashingr   r    r-   r:   rE   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   r0  r2  r4  r6  r7  r8  r<  r  floatr>  rD  rE  rO  rp  r  r  r  r  r  r  r  r  r  r  r  r  r  rR   r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r   r   r   r   <module>   s    
+
b


'
 $ 8
'



/$


 
N