o
    !2gߘ                     @   s8  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mZ d dlmZmZ d dlmZ d dlmZ d d	lmZ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)Z)d dl*Z*d dl+m,Z,m-Z-m.Z.m/Z/ ddl0m1Z1m2Z2m3Z3m4Z4m5Z5m6Z6 ddl7m8Z8m9Z9 e5 Z:e*j;dddefddZ<e*j;dddd Z=e*j;dddgddd Z>e*j;dd Z?G dd  d e"Z@dd"d#ZAdd$d%ZBded!dfd&d'ZCded!dfd(d)ZDded!dfd*d+ZEded!dfd,d-ZFG d.d/ d/e"ZGG d0d1 d1ZHded!dfd2d3ZIG d4d5 d5e"ZJe*jKLd6g d7e*jKjLd8dd9gd8d:gd;d6eMded!dfd<d=ZNG d>d? d?e"ZOG d@dA dAe"ZPded!dfdBdCZQded!dfdDdEZRded!dfdFdGZSded!dfdHdIZTded!dfdJdKZUG dLdM dMe"ZVded!dfdNdOZWded!dfdPdQZXG dRdS dSe"ZYded!dfdTdUZZG dVdW dWe"Z[d6eMd!e e[ fdXdYZ\ded!dfdZd[Z]eG d\d] d]Z^ded!dfd^d_Z_ded!dfd`daZ`eG dbdc dcZaded!dfdddeZbeG dfdg dgZcded!dfdhdiZdded!dfdjdkZeded!dfdldmZfG dndo doe"ZgG dpdq dqZhded!dfdrdsZiG dtdu due"Zjded!dfdvdwZkeG dxdy dyZlded!dfdzd{Zmdd}ed6eMd~e1fddZne*j;dd Zoded!dfddZpdefddZqdefddZrdddZse*jKLdd9dgdedetd!dfddZuded!dfddZvded!dfddZwded!dfddZxded!dfddZyded!dfddZzded!dfddZ{ded!dfddZ|ded!dfddZ}ded!dfddZ~ded!dfddZded!dfddZe*jKLdddgdedetd!dfddZded!dfddZdS )    N)ProcessPoolExecutor)nullcontext)asdict	dataclass)datedatetimetimezone)chainislice)Path)Random)
check_callcheck_outputrun)sleep)AnyDictIterableIteratorList
NamedTupleOptionalSequenceSetTupleUnioncast)ilenlastoneunique_everseen   )BackendCachewExceptioncachewcallable_name
get_loggersettings   )
gc_controlrunning_on_ciT)autousetmp_pathc                 C   s   | d }|t _d S )Ncachew_default)r'   DEFAULT_CACHEW_DIR)r,   tpath r0   P/home/garg/my-data/venv/lib/python3.10/site-packages/cachew/tests/test_cachew.pyset_default_cachew_dir0   s   
r2   c                   C   s
   dt _d S )NT)r'   THROW_ON_ERRORr0   r0   r0   r1   throw_on_errors6   s   
r4   sqlitefile)r+   paramsc                 C   s   |j }|t_d S N)paramr'   DEFAULT_BACKEND)restore_settingsrequestbackendr0   r0   r1   set_backend>   s   
r>   c                  c   sb    dd t j D } zd V  W |  D ]
\}}tt || qd S |  D ]
\}}tt || q%w )Nc                 S   s    i | ]\}}| d s||qS )__)
startswith).0kvr0   r0   r1   
<dictcomp>G        z$restore_settings.<locals>.<dictcomp>)r'   __dict__itemssetattr)origrB   rC   r0   r0   r1   r;   E   s   r;   c                   @      e Zd ZU eed< eed< dS )UUUxxyyN__name__
__module____qualname__int__annotations__r0   r0   r0   r1   rK   O      
 rK   returnc                  C   s$   t dtt fdd} t|   d S )NrU   c                   s       g E d H  d S r8   r0   r0   r0   r0   r1   funV      ztest_simple.<locals>.fun)r$   r   rK   listrW   r0   r0   r1   test_simpleT   s   r[   c                  C   s$   t dtd fdd} t|   d S )NrU   rK   c                   s   rV   r8   r0   r0   r0   r0   r1   rW   ^   rX   z#test_string_annotation.<locals>.fun)r$   r   rY   rZ   r0   r0   r1   test_string_annotation]   s   r\   c                    s6  | d  d tdddtdddtdddgd dtfd	d
}t| |ddtdtt f fddfdd}t| dksGJ t| dksPJ t| dksYJ  dks_J  d | dd ksoJ | dd kszJ  dksJ  d | ksJ | ksJ  dksJ dS )z\
    Demo of using argument's modification time to determine if underlying data changed
    source0r(   rL   rM   r!      r   pathc                 S   s(   |   j}t|   }t||fS r8   )statst_mtime_nshashlibmd5
read_bytesdigeststr)ra   nsre   r0   r0   r1   get_path_versiont   s   
z*test_custom_hash.<locals>.get_path_version)
cache_path
depends_onrU   c                    s     d7  t |  }d | S Nr(   )rR   	read_text)ra   count)callsentitiesr0   r1   data}   s   ztest_custom_hash.<locals>.datac                      s   t  dS )N)ra   )rY   r0   )rr   srcr0   r1   <lambda>       z"test_custom_hash.<locals>.<lambda>1N3)
write_textrK   r   r$   r   len)r,   rj   ldatar0   )rp   rr   rq   rs   r1   test_custom_hashf   s4   



	

r{   c                    s   t | dtt fdd d}|t_t fdd}tttt	f |jdd\}}|d	ks0J |d
ks8J dtttt	f |jdd\}}|d	ksMJ |dk sUJ dd S )NrU   c                  s   s6    t d tdD ]} t| | dV  t d q
d S )Nr(      r_   )timer   rangerK   ir0   r0   r1   rr      s   
ztest_caching.<locals>.dataz
def inner(_it, _timer{init}):
    {setup}
    _t0 = _timer()
    for _i in _it:
        retval = {stmt}
    _t1 = _timer()
    return _t1 - _t0, retval
c                      s   t t  S r8   )ry   rY   r0   rr   r0   r1   rt      ru   ztest_caching.<locals>.<lambda>r(   )numberr|         @zshould take at least 5 secondsg       @z#should be pretty much instantaneous)
r$   r   rK   timeittemplateTimerr   r   floatrR   )r,   r   timertcntr0   r   r1   test_caching   s   	r   c                    s   | d }|  rJ |d t|dddtt f fdd}tjtdd t|  W d	   n1 s6w   Y  tjtdd t|  W d	   n1 sRw   Y  d
 t| ddgksdJ d	S )zZ
    Test behaviour when the first time cache is initialized it ends up with an error
    cacheT
force_filerU   c                   3   s    dV   r
t ddV  d S )Nstring1oopsstring2RuntimeErrorr0   should_raiser0   r1   rW      s
   
ztest_error.<locals>.funr   matchNFr   r   )existsr$   r   rh   pytestraisesr   rY   )r,   
cache_filerW   r0   r   r1   
test_error   s   
r   c                    s"  d dt t f fdd}t| d d |}t| ddgks"J  dks(J t| ddgks3J  dks9J | d d }| sEJ t|d	}|jd
sTJ tdd|}t| ddgksfJ  dkslJ t| ddgkswJ  dks}J | d }|	  t|d|}t| ddgksJ  dksJ t| ddgksJ  dksJ t| d dd|}t| ddgksJ  dksJ t| ddgksJ  dksJ | d 
 sJ tdd d|}t| ddgksJ  dksJ t| ddgksJ  dksJ dS )z5
    Tests various ways of specifying cache path
    r   rU   c                   3       dV  dV   d7  d S Nr(   r!   r0   r0   rp   r0   r1   rI      s   ztest_cache_path.<locals>.orignon_existent_dir	cache_dirr(   r!   *z)cachew.tests.test_cachew:test_cache_path.Nrk   r`   a_file   nameTr   r|   c                  W   s   d S r8   r0   )argsr0   r0   r1   rt   	      z!test_cache_path.<locals>.<lambda>      )r   rR   r$   rY   is_dirr   globr   r@   touchis_file)r,   rI   rW   cdircfilefr0   r   r1   test_cache_path   sD   r   c                   @      e Zd ZU eed< dS )UGoodxNrN   r0   r0   r0   r1   r        
 r   c                   @      e Zd ZdS )UBadNrO   rP   rQ   r0   r0   r0   r1   r         r   c                 C   s   t jtdd t| ddtt fdd}W d    n1 s w   Y  t jtdd t| ddttttf  fdd	}W d    d S 1 sJw   Y  d S )
Nz.*failed to infer cache type.*r   r   rU   c                   S   s   t  gS r8   )r   r0   r0   r0   r1   rW     s   z#test_unsupported_class.<locals>.funz.*can't infer type from.*c                   s   s&    t ddV  t V  t ddV  d S )Nr(   r   r!   )r   r   r0   r0   r0   r1   fun2%  s   z$test_unsupported_class.<locals>.fun2)	r   r   r#   r$   r   r   r   r   r   )r,   rW   r   r0   r0   r1   test_unsupported_class  s   "r   c                   @   s&   e Zd ZU eed< eed< eed< dS )TE2valueuuuvalue2N)rO   rP   rQ   rR   rS   rK   r0   r0   r0   r1   r   ,     
 r   ro   )c   i  @B gc_onFgc_off)idsc                    s$   dkrt rtd |d }|  |d }t|dddtt f fdd	}t }t|  ks5J t }t	d
|| ddt
jd t	d| jd  dt
jd t }t|  ksdJ t }t	d|| ddt
jd t| t d t d  d d d dksJ d S )Nr   z8test would be too slow on CI, only meant to run manuallyr]   	test_manyT)rk   r   rU   c                  3   s,    t  D ]} t| t| | d| dV  qd S )Nr_   r   r   r   )r~   r   rK   r   ro   r0   r1   	iter_data?  s   ztest_many.<locals>.iter_dataz'test_many: initial write to cache took z.1fsr6   ztest_many: cache size is r   Mbz#test_many: reading from cache took r(   r_   r   )r*   r   skipr   r$   r   r   r}   r   printsysstderrrb   st_sizer   rK   )ro   r,   r)   rs   rk   r   abr0   r   r1   r   4  s"   

 8r   c                   @   rJ   )BBrL   rM   NrN   r0   r0   r0   r1   r   g  rT   r   c                   @   s*   e Zd ZU eed< ee ed< eed< dS )AAr   r   r   N)rO   rP   rQ   rR   rS   r   r   r0   r0   r0   r1   r   l  s   
 r   c                 C   sJ   t | dtt fdd}tt| dksJ tt| dks#J dS )zJ
    Tests that return type (BB) is inferred from the type annotation
    rU   c                   s   s"    t dddV  t dddV  d S )Nr(   r!   r_   r`   r   )r   r0   r0   r0   r1   rr   w  s   z(test_return_type_inference.<locals>.datar!   N)r$   r   r   ry   rY   r,   rr   r0   r0   r1   test_return_type_inferencer  s   r   c                 C   s@   t | tddtt fdd}t| tdd ddgksJ d S )NclsrU   c                   S   s   t dd ddgS )Nr(   {   r   r   r   )r   r0   r0   r0   r1   data2  s   z(test_return_type_mismatch.<locals>.data2r(   r   r   )r$   r   r   r   rY   )r,   r   r0   r0   r1   test_return_type_mismatch  s   
"r   c                 C   s@   t t t| dd }W d    d S 1 sw   Y  d S )Nc                   S   s   g S r8   r0   r0   r0   r0   r1   rr     s   z#test_return_type_none.<locals>.data)r   r   r#   r$   r   r0   r0   r1   test_return_type_none  s   "r   c                    s   t   tfddddtdtt f fdd}t|dtd	d	d
gks(J t|dtddd
gks7J t|dtd	d	d
gksFJ t|dtddd
gksUJ dS )zN
    Cache path can be function dependent on wrapped function's arguments
    c                    s    |  d S )Nz.cacher0   kindr,   r0   r1   rt     ru   z*test_callable_cache_path.<locals>.<lambda>r   r   rU   c                 3   sD    |  vsJ   |  | dkrtdddV  d S tdddV  d S )Nfirstr(   r_   r!   )addr   r   )calledr0   r1   get_data  s   
z*test_callable_cache_path.<locals>.get_datar   r(   r_   secondr!   N)setr$   rh   r   r   rY   r,   r   r0   )r   r,   r1   test_callable_cache_path  s   	"r   c                    sz   t dtddddd t dd dd fdd	t| t d
fdd}t|  gks0J t|  gks;J d S )Nr(   r!   r`   r_   r   r   r|   c                   3   s     V  V  d S r8   r0   r0   )d1d2r0   r1   rr        
ztest_nested.<locals>.datark   r   c                   3   s      E d H  d S r8   r0   r0   r   r0   r1   r     s   ztest_nested.<locals>.get_data)r   r   r$   rY   r   r0   )r   r   rr   r1   test_nested  s   

r   c                   @   s&   e Zd ZU eed< eed< eed< dS )BBv2rL   rM   zzN)rO   rP   rQ   rR   rS   r   r0   r0   r0   r1   r     r   r   c                    sv   t ddd t| t d fdd}t|  gksJ tdddd	t| tdfd
d}t| gks9J dS )zL
    Should discard cache on schema change (BB to BBv2) in this example
    r!   r`   r_   r   c                          gS r8   r0   r0   )r   r0   r1   r        z$test_schema_change.<locals>.get_datar   r   )rL   rM   r   c                      r   r8   r0   r0   )b2r0   r1   get_data_v2  r   z'test_schema_change.<locals>.get_data_v2N)r   r$   rY   r   )r,   r   r   r0   )r   r   r1   test_schema_change  s   

r   c                    s   G dd dt  t| tdddtf fdd}tdd	d
tddd
tddd
g}t|d|ks3J t|d|ks=J t  t|d W d   n1 sSw   Y  t|d|ksbJ dS )zW
    Should keep old cache and not leave it in some broken state in case of errors
    c                   @   r   )z#test_transaction.<locals>.TestErrorNr   r0   r0   r0   r1   	TestError  r   r   r(   )rk   r   chunk_byversionc                 3   s.    t dD ]}td|dV  | dkr qd S )Nr`   r!   r_   )r~   r   )r   r   r   r0   r1   r     s   z"test_transaction.<locals>.get_datar!   r   r_   N)	Exceptionr$   r   rR   rY   r   r   )r,   r   expr0   r   r1   test_transaction  s   "r   c                   @   s"   e Zd ZU eed< ee ed< dS )JobcompanytitleN)rO   rP   rQ   rh   rS   r   r0   r0   r0   r1   r     s   
 r   c                 C   sN   t | dtt fdd}t|  t| tdddtdddgks%J dS )	z+
    Tests support for typing.Optional
    rU   c                   s   s"    t dddV  t dd dV  d S )Ngoogleengineedr  selfemployed)r   r0   r0   r0   r1   rr     s   ztest_optional.<locals>.datar  r  r  r  N)r$   r   r   rY   r   r0   r0   r1   test_optional  s   


r  c                   @   s2   e Zd ZU eed< eed< eed< ee ed< dS )Personr   
secondnameagejobN)rO   rP   rQ   rh   rS   rR   r   r   r0   r0   r0   r1   r    s
   
 r  c                 #   s    t dtjtj   fdd}t| D ](}ddg}d }|r-t|d|dd}t|d	|d
dd|dV  qd S )N|   c                    s   d j | dS )N )rB   )joinchoices)len_charsgr0   r1   rt   %      z"make_people_data.<locals>.<lambda>TF      )r   r  r|   
      <   )r   r  r	  r
  )	r   stringascii_uppercaseascii_lowercaser~   choicer   r  randint)ro   randstr_has_job	maybe_jobr0   r  r1   make_people_data!  s    

r"  c                    sn   | d }d}d t |tddtt f fdd}t|  td  d	|  d
  d| jd
  d d S )Nr   7   i'  r   rU   c                   3   s    t  dE d H  d S )Nr   )r"  r0   Nr0   r1   get_people_data<  s   z#test_stats.<locals>.get_people_datazCache db size for z entries: estimated size i   z Kb, actual size z Kb;)r$   r  r   rY   r   rb   r   )r,   r   r   r&  r0   r$  r1   
test_stats5  s   

2r'  c                   @   r   )TestfieldNrN   r0   r0   r0   r1   r(  D     
 r(  c                 C   s^   t | dtt fdd}t| dd tdD ksJ t| dd tdD ks-J d S )NrU   c                   s   s    dd t dD E d H  d S )Nc                 S      g | ]}t |d qS )r)  r(  rA   r   r0   r0   r1   
<listcomp>L      z;test_dataclass.<locals>.get_dataclasses.<locals>.<listcomp>r|   r~   r0   r0   r0   r1   get_dataclassesJ  s   z'test_dataclass.<locals>.get_dataclassesc                 S   r+  r,  r-  r.  r0   r0   r1   r/  N  r0  z"test_dataclass.<locals>.<listcomp>r|   c                 S   r+  r,  r-  r.  r0   r0   r1   r/  O  r0  )r$   r   r(  rY   r~   )r,   r2  r0   r0   r1   test_dataclassI  s    $r3  c                 C   sD   t G dd d}t| dt| fdd}t|  t|  d S )Nc                   @   r   )z(test_inner_class.<locals>.InnerDataclassr)  NrN   r0   r0   r0   r1   InnerDataclassV  r*  r4  rU   c                   s   rV   r8   r0   r0   r0   r0   r1   rW   Z  rX   ztest_inner_class.<locals>.fun)r   r$   r   rY   )r,   r4  rW   r0   r0   r1   test_inner_classR  s   
r5  c                   @   s6   e Zd ZU eed< eed< eed< eed< eed< dS )Datesr   r   d3d4d5N)rO   rP   rQ   r   rS   r0   r0   r0   r1   r6  c  s   
 r6  c                    s  ddl m} |d}tdd}tdd}t|j|d|j|d|||jtjdd t| d	t	t f fd
d}t
|  ksDJ t
|  ksMJ t
| }t|jjt jjks`J t|jjt jjksnJ |j d u swJ |j d u sJ |jjtju sJ d S )Nr   )ZoneInfozEurope/Londonz20200203 01:02:03%Y%m%d %H:%M:%Sz20200803 01:02:03)tzinfo)r   r   r7  r8  r9  rU   c                   3        V  d S r8   r0   r0   r   r0   r1   rW   {     
ztest_dates.<locals>.fun)zoneinfor:  r   strptimer6  replacer   utcr$   r   r   rh   r   r<  r   r7  tznamer8  r9  )r,   r:  tzdwinterdsummerrW   rr0   r   r1   
test_datesl  s*   


rH  c                   @   s~   e Zd ZU eed< eed< eed< eed< eed< e	ed< e
eef ed< ee ed< eeef ed	< eed
< ee ed< dS )AllTypesa_stran_inta_floata_boola_dta_datea_dicta_lista_tuplean_excan_optN)rO   rP   rQ   rh   rS   rR   r   boolr   r   r   r   r   r   r   r   r0   r0   r0   r1   rI    s   
 rI  c                    s   dd l }|d}tddddtj|dt jdd	 dd
didg ddtdddd t| dt	t f fdd}dtfdd}|t
| | ksQJ |t
| | ks^J d S )Nr   zEurope/Berlinabacic  g?5^I	@T)rD  i  )yearwhatevergQ	@)r   r   )abar   N)gGz?z3.2.1zerror!r   hello)rJ  rK  rL  rM  rN  rO  rP  rQ  rR  rS  rT  rU   c                   3   r=  r8   r0   r0   objr0   r1   get  r>  ztest_types.<locals>.getr   c                 S   s   t | }|d j|d< |S )NrS  )r   r   )r   dr0   r0   r1   helper  s   ztest_types.<locals>.helper)pytzr   rI  r   nowrA  r   r   r$   r   r   )r,   r`  rD  r]  r_  r0   r[  r1   
test_types  s(   

rb  c                 C   sJ   t | dtt fdd}t| ddgksJ t| ddgks#J d S )NrU   c                   s       dV  dV  d S )NrY  cabar0   r0   r0   r0   r1   rW        
ztest_primitive.<locals>.funrY  rd  )r$   r   rh   rY   r,   rW   r0   r0   r1   test_primitive  s   rg  c                 C   s   t | dtfdd}| dksJ | dksJ t | dtfddd }| d	ks,J | d	ks3J t | d
tdtt fdd}|ddtdddksOJ |ddtdddks\J |ddd u seJ |ddd u snJ d S )NrU   c                   S      dS Nr   r0   r0   r0   r0   r1   fun_int     z"test_single_value.<locals>.fun_intr   singler   c                   S   rh  )NrX  r0   r0   r0   r0   r1   fun_str  rk  z"test_single_value.<locals>.fun_strrX  nonec                 S   s   | rd S t dddS )Nr(   r!   r_   )rK   rn  r0   r0   r1   fun_opt_namedtuple  s   z-test_single_value.<locals>.fun_opt_namedtupleFro  r(   r!   r_   T)r$   rR   rh   rU  r   rK   )r,   rj  rm  rp  r0   r0   r1   test_single_value  s   
rq  c                   @   r   )Or   NrN   r0   r0   r0   r1   rr    r   rr  c                   @   s&   e Zd ZdeddfddZdd ZdS )	_HackHashr   rU   Nc                 C   s
   || _ d S r8   r   )selfr   r0   r0   r1   __init__     
z_HackHash.__init__c                 C   s
   t | jS r8   )reprr   )rt  r0   r0   r1   __repr__  rv  z_HackHash.__repr__)rO   rP   rQ   rR   ru  rx  r0   r0   r0   r1   rs    s    rs  c                    s  t dd fdtdt dtt f fdd}dtdt dtfdd	}t| |d
|}t|d t|dtdgks>J  dksDJ d_t|dtdgksTJ  dksZJ t|dt ddtdgkskJ  dksqJ t| |}t|dtdgksJ  dksJ t|dtdgksJ  dksJ d_t|dtdgksJ  dksJ t| dd d
|}t|dtdgksJ  dksJ d_t|dtdgksJ  dksJ d S )Nr(   r   r   r9   rU   c                 3   s    t jV   d7  d S rm   )rr  r   r   r9   rp   hhr0   r1   rI     s   z$test_default_arguments.<locals>.origc                 S   s
   | |j fS r8   r   ry  r0   r0   r1   rl      s   
z*test_default_arguments.<locals>.depends_on)rl   r   r!   )r9     r`   r   c                 S   s   | S r8   r0   r   r0   r0   r1   rt   !  r   z(test_default_arguments.<locals>.<lambda>r|   )rs  rR   r   rr  rh   r$   rY   r   )r,   rI   rl   rW   r0   rz  r1   test_default_arguments  s6   $"r~  c                   @   s   e Zd ZU eeef ed< dS )Ur   N)rO   rP   rQ   r   rh   rr  rS   r0   r0   r0   r1   r  +  s   
 r  c                 C   sJ   t | dtt fdd}t|  t| tdttdgks#J d S )NrU   c                   s   s    t dV  t tdV  d S )Nhir   )r  rr  r0   r0   r0   r1   rW   0  s   
ztest_union.<locals>.funr  r   )r$   r   r  rY   rr  rf  r0   r0   r1   
test_union/  s   
&r  c                   @   r   )DDr   NrN   r0   r0   r0   r1   r  :  r*  r  c                 C   s@   t | dttttf  fdd}t| dtdgksJ d S )NrU   c                   s   s    dV  t dV  d S )Nr   r|  )r  r0   r0   r0   r1   rW   @  s   z&test_union_with_dataclass.<locals>.funr   r|  )r$   r   r   rR   r  rY   rf  r0   r0   r1   test_union_with_dataclass?  s   r  皙?rk   r=   c                    s4   t | |ddtdtt f fdd}t||dS )N)r=   ro   rU   c                 3   s8    t | D ]}t|  d|  t  || V  qd S )Nz: GENERATING )r~   r   r   )ro   r   sleep_sr0   r1   testK  s   z _concurrent_helper.<locals>.testr   )r$   rR   r   rY   )rk   ro   r=   r  r  r0   r  r1   _concurrent_helperJ  s   
r  c                  c   s4    ddl m}  d}t| | dV  t| | dS )zZ
    Insert random sleeps in cachew_impl to increase likelihood of concurrency issues
    r!   )cachew_wrappera  @@ -189,6 +189,11 @@
             old_hash = backend.get_old_hash()
             logger.debug(f'old hash: {old_hash}')

+            from random import random
+            rs = random() * 2
+            print("sleeping for: ", rs)
+            from time import sleep; sleep(rs)
+
             if new_hash == old_hash:
                 logger.debug('hash matched: loading from cache')
                 yield from cached_items()
N)r  r  patchypatchunpatch)r  r  r0   r0   r1   fuzz_cachew_implU  s   r  c                    s   | d  t  dtj d}t - fddt|D }t|D ]\}}| dd t|D ks4J q!W d    d S 1 s@w   Y  d S )Ncache.sqliter(   r|   c                    s   g | ]} t |tjqS r0   submitr  r'   r:   )rA   ro   rk   poolr0   r1   r/  |  s    z*test_concurrent_writes.<locals>.<listcomp>c                 S   s   g | ]}|| qS r0   r0   r.  r0   r0   r1   r/    r  )r  r'   r:   r   r~   	enumerateresult)r,   r  	processesfuturesro   r   r0   r  r1   test_concurrent_writess  s    "r  c                    s   | d  dt  tjdd d}t }t   fddt|D }|D ]}t|  q(W d    n1 s;w   Y  t }|| }|dk sNJ d S )	Nr  r  r   r  r   c              	      s    g | ]} t tjd qS )r(   r  )rA   r  rk   ro   r  r0   r1   r/    rE   z)test_concurrent_reads.<locals>.<listcomp>r|   )r  r'   r:   r}   r   r~   r   r  )r,   r  r  startr  r   endtakenr0   r  r1   test_concurrent_reads  s   r  c                 C   s\   ddl m} || d ddtt fdd}t| dd	gks!J t| dd	gks,J d S )
Nr   )mcachewr   r   rU   c                   s   rc  )Nr   twor0   r0   r0   r0   r1   func  re  ztest_mcachew.<locals>.funcr   r  )cachew.extrar  r   rh   rY   )r,   r  r  r0   r0   r1   test_mcachew  s
   r  c              	   C   sz  dt t fdd}dd }tdd|}t| dgksJ t| dgks(J dD ]}|r3ttnt }|t_	|w td	d
 d|}t| dgksOJ t| dgksYJ tdd
 d|}t| dgkslJ t| dgksvJ t|}t| ddgksJ t| ddgksJ dt_
t|}t| dgksJ t| dgksJ W d   n1 sw   Y  q*dS )zA
    Make sure that cachew doesn't crash on misconfiguration
    rU   c                   s   s    dV  d S ri  r0   r0   r0   r0   r1   rI     s   
ztest_defensive.<locals>.origc                   s   rc  )Nr   r   r0   r0   r0   r0   r1   orig2  r   ztest_defensive.<locals>.orig2r   )bad_arg)TFc                   S   s   dd S )Nr(   bad_path_providerr0   r0   r0   r0   r1   rt     s    z test_defensive.<locals>.<lambda>r   c                 S   s   dt |  S )Nz/tmp/)rh   )pr0   r0   r1   rt     s    r   z/dev/nonexistentN)r   rR   r$   rY   r   r   r   r   r'   r3   r.   )r;   rI   r  rW   throwctxr0   r0   r1   test_defensive  s2   r  r  c                 C   sz   | d }| d| d  |rttnt }| ttj|gdd	 dks+J W d   dS 1 s6w   Y  dS )z
    this will work in runtime without cachew if from __future__ import annotations is used
    so should work with cachew decorator as well
    zsrc.pyzc
from __future__ import annotations

from cachew import settings, cachew
settings.THROW_ON_ERROR = zI

@cachew
def fun() -> BadType:
    print("called!")
    return 0

fun()
T)textzcalled!N)
rx   lstripr   r   r   r   r   r   
executablestrip)r,   r  rs   r  r0   r0   r1   test_bad_annotation  s    "r  c                    s   ddd t | dtdtt f fdd dks J tdg dks,J t d	ks6J  d
ks<J tdg dksHJ  d
ksNJ tdg dksZJ  dks`J tdg dkslJ  dksrJ d S )Nr   i  nrU   c                 3   sz     d7  | dkrt td| dkrt td| dkr$dV  d S | d }d}|D ]}|V  |}q.||  V  d S )Nr(   r   )ry   inspectstack)r  prevr   r   rp   d0r   
factorialsr0   r1   r    s   z)test_recursive_simple.<locals>.factorialsr`   )r(   r(   r!   r   r!   r   r|   )r(   r(   r!   r      x   r   r  )r$   rR   r   rY   absr   r0   r  r1   test_recursive_simple  s   "r  c              	      s   t | dtdtt f fdd t d ddtdtt f fdd}t }td z t d	 t d	 t|d	 t|d	 W t| d S t| w )
Nr  rU   c                 3   0    | dkr
dV  d S  | d E d H  | V  d S Nr   r(   r0   r  numbersr0   r1   r       
z$test_recursive_deep.<locals>.numbersr   c                 3   r  r  r0   r  r  r0   r1   numbers_cache_disabled!  r  z3test_recursive_deep.<locals>.numbers_cache_disabledi  i   )r$   rR   r   r   getrecursionlimitsetrecursionlimitrY   )r,   r  rlimitr0   r  r1   test_recursive_deep  s   
r  c              	      s   t | dtdtt f fdd t }z ztd t d td ty.   Y nw W t| nt| w t	t ddksHJ d S )	Nr  rU   c                 3   r  r  r0   r  recr0   r1   r  <  r  z!test_recursive_error.<locals>.rec2   d   zExpecting recursion errore   )
r$   rR   r   r   r  r  rY   AssertionErrorRecursionErrorry   )r,   r  r0   r  r1   test_recursive_error;  s   
r  c                    sp   G dd dt  tddt| dtt f fdd}t|  | \}t|tu s/J |jdks6J d S )	Nc                   @   r   )ztest_exceptions.<locals>.Xr   NrN   r0   r0   r0   r1   XT  r   r  z20200102 03:04:05r;  rU   c                   3   s    t dd ddV  d S )NrX  r   r}  r   r0   r  r^  r0   r1   rW   Y  s   ztest_exceptions.<locals>.fun)rX  r   z2020-01-02T03:04:05zX(a=123))	r   r   r@  r$   r   r   rY   typer   )r,   rW   er0   r  r1   test_exceptionsS  s   
r  c                 C   sp   t | dttttf  fdd}t|  | \}}}|dks"J |dks(J t|ts/J |jdks6J d S )NrU   c                   s   s    dV  t dV  dV  d S )Nr(   sad!r   r   r0   r0   r0   r1   rW   f  s   

ztest_result.<locals>.funr(   r   )r  )r$   r   r   r   rR   rY   
isinstancer   )r,   rW   v1vev123r0   r0   r1   test_resulte  s   
r  c                    s   d t | tddtt f fdd}t|  t|   dks#J dd l }|j}z |d |_t|   dks;J t|   dksFJ W ||_n||_w t|   d	ksZJ t|   d	kseJ d S )
Nr   )loggerrU   c                   3   s     d7  g dE d H  d S )Nr(   )r   r   cr0   r0   r   r0   r1   rW   w  s   z test_version_change.<locals>.funr(   	_whateverr!   r`   )r$   r  r   rh   rY   CACHEW_VERSION)r,   rW   cachew_moduleold_versionr0   r   r1   test_version_changet  s&   







r  c                 C   sb   | d }t |dtt fdd}t|  | sJ |td|dgd}t|tj	d d S )	Nzold_cache.sqliterU   c                   s       g dE d H  d S Nr(   r!   r`   r0   r0   r0   r0   r1   rW        zdump_old_cache.<locals>.funsqlite3z.dumputf8r   )
r$   r   rR   rY   r   r   decoder   r   r   )r,   ocrW   sqlr0   r0   r1   dump_old_cache  s   
r  c                 C   sb   t jdkr
td d}| d }td||g t|dtt fdd}g d	t| ks/J d S )
Nr5   z-this test only makes sense for sqlite backendaQ  
PRAGMA foreign_keys=OFF;
BEGIN TRANSACTION;
CREATE TABLE hash (
	value VARCHAR
);
INSERT INTO hash VALUES('cachew: 1, schema: {''_'': <class ''int''>}, hash: ()');
CREATE TABLE IF NOT EXISTS "table" (
	_cachew_primitive INTEGER
);
INSERT INTO "table" VALUES(1);
INSERT INTO "table" VALUES(2);
INSERT INTO "table" VALUES(3);
COMMIT;
    r  r  rU   c                   s   r  r  r0   r0   r0   r0   r1   rW     r  z"test_old_cache_v0_6_3.<locals>.funr  )	r'   r:   r   r   r   r$   r   rR   rY   )r,   r  dbrW   r0   r0   r1   test_old_cache_v0_6_3  s   

r  c                    s   d t | dtt f fdd}t| ddgksJ t| ddgks'J  dks-J ddlm} | + t| ddgksBJ  dksHJ t| ddgksSJ  dksYJ W d    d S 1 sdw   Y  d S )	Nr   rU   c                   3   r   r   r0   r0   r   r0   r1   rW     s   ztest_disabled.<locals>.funr(   r!   )disabled_cachewr`   )r$   r   rR   rY   r  r  )r,   rW   r  r0   r   r1   test_disabled  s   "r  c                    s   d t | dtt f fdddt | dtt ffdd}ttt| dddks2J  dks8J dks>J tt| dksIJ  d	ksOJ d	ksUJ tt| dks`J  d	ksfJ d	kslJ d S )
Nr   rU   c                   3   s    t dE d H   d7  d S )Nr  r(   r1  r0   )calls_fr0   r1   r     s   z!test_early_exit_simple.<locals>.fc                   3   s     E d H   d7  d S rm   r0   r0   )calls_gr   r0   r1   r    s   z!test_early_exit_simple.<locals>.gr  r  r(   )r$   r   rR   ry   rY   r
   )r,   r  r0   )r  r  r   r1   test_early_exit_simple  s   r  c                 C   s^   d}t | d | d|  d}ttjd|g| ddd}|j dks&J d	|jvs-J d S )
NzE
from sqlalchemy import Column

import re
re.hack = lambda: None
    zimport_hack.pyzq
import import_hack

import cachew
cachew.settings.THROW_ON_ERROR = True # todo check with both?
@cachew.cachew('zQ', cls=int)
def fun():
    yield 0

g = fun()
e = next(g)

print("FINISHED")
    z-cT)cwdcapture_outputchecks   FINISHEDs	   Traceback)r   rx   r   r   r  stdoutr  r   )r,   import_hackprogrG  r0   r0   r1   test_early_exit_shutdown  s   r  use_syntheticFalseTruec              	      s  g  dt dtt  f fddg d}g d}g d}g d}dtt  f fd	d
}t| |r0dnd dg ddtt  dtt  dtt  ffdddtt  dtt  ffdd}||tdkscJ | |ksjJ ||tdkstJ | g ks{J ||tdksJ |r| ddgksJ n| |ksJ ||tdksJ | g ksJ ||tdksJ |r| ddgksJ n| |ksJ ||tdksJ | g ksJ ||tdksJ | |ksJ ||tdksJ | g ksJ d S )NkeyrU   c                 3   s0      |  t| }t|d V  t|V  d S rm   )appendrR   rh   )r  r  _recomputedr0   r1   compute)  s
   
z&test_synthetic_keyset.<locals>.compute)rv   25)rv   r  r  67)rv   r  r  r   89)r  r   r  r  c                     s   t  }    | S r8   )rY   clear)rG  r  r0   r1   
recomputed:  s   z)test_synthetic_keyset.<locals>.recomputedkeys)synthetic_key)cachew_cachedr  c                3   s.    t t|g fdd| D R  E d H  d S )Nc                 3   s    | ]} |V  qd S r8   r0   )rA   r  r  r0   r1   	<genexpr>E  s    z9test_synthetic_keyset.<locals>.fun_aux.<locals>.<genexpr>)r    r	   )r  r  r	  r0   r1   fun_aux@  s   z&test_synthetic_keyset.<locals>.fun_auxc                    s   t  | dS )Nr  )r   r  )r  r0   r1   rW   I  s   z"test_synthetic_keyset.<locals>.fun011245
0112455667r   r  011245567889r  r  45567889)rh   r   r   r$   r   r   r   r   )r,   r  keys125	keys12567
keys125689keys5689r  rW   r0   )r  r  r  r1   test_synthetic_keyset  s<   .r  c                 C   sl   t | dtfdd}t | dtt fdd}|  t|  | t|  s*J | t|  s4J d S )NrU   c                   S   rh  ri  r0   r0   r0   r0   r1   
fun_single}  rk  z1test_db_path_matches_fun_name.<locals>.fun_singlec                   S   s   dgS ri  r0   r0   r0   r0   r1   fun_multiple  r   z3test_db_path_matches_fun_name.<locals>.fun_multiple)r$   rR   r   rY   r%   r   )r,   r  r  r0   r0   r1   test_db_path_matches_fun_name|  s   
r  )rU   N)r  )rd   r  r  r   r}   r   concurrent.futuresr   
contextlibr   dataclassesr   r   r   r   r   	itertoolsr	   r
   pathlibr   randomr   
subprocessr   r   r   r   typingr   r   r   r   r   r   r   r   r   r   r   r   r  r   more_itertoolsr   r   r   r    r  r"   r#   r$   r%   r&   r'   utilsr)   r*   r  fixturer2   r4   r>   r;   rK   r[   r\   r{   r   r   r   r   r   r   r   markparametrizerR   r   r   r   r   r   r   r   r   r   r   r   r   r  r  r"  r'  r(  r3  r5  r6  rH  rI  rb  rg  rq  rr  rs  r~  r  r  r  r  r  r  r  r  r  r  rU  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r0   r0   r0   r1   <module>   s    8 




	

		4=1		 &
5

'+#$$\