B
    `B                 @   s  d Z ddlZddlZddlZddlmZmZmZmZm	Z	m
Z
mZmZmZmZ yddlZW n ek
rt   ddlZY nX ddlmZm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$ d	Z%d
ddddddgZ&dd Z'dAddZ(dd Z)dd Z*dd Z+dBddZ,dd Z-G dd
 d
e.Z/G d d de.Z0G d!d de0Z1da2dCd$dZ3d%d& Z4d'd( Z5d)d* Z6d+d, Z7d-d. Z8d/d0 Z9dDd1d2Z:d3d4 Z;d5d6 Z<G d7d8 d8e.Z=G d9d: d:e.Z>d;d Z?d<d Z@d=d> ZAd?d@ ZBdS )EzBeaker utilities    N   )
PY2string_typeunicode_textNoneTypedictkeyslistim_classim_funcpicklefunc_signaturedefault_im_func)datetime	timedelta)asbool)
exceptions)local   ThreadLocalWeakValuedRegistrySyncDictencoded_pathverify_directory	serializedeserializec             C   s
   || _ | S )zReturn a function with a given __name__.

    Will assign to __name__ and return the original function if possible on
    the Python implementation, otherwise a new function will be constructed.

    )__name__)fnname r   S/home/kop/projects/devel/pgwui/test_venv/lib/python3.7/site-packages/beaker/util.pyfunction_named&   s    r   c                s*   pj ddlm   fdd}|S )z!Skip a test if predicate is true.r   )SkipTestc                s$    j  fdd}t|S )Nc                 s*    rdf } |n
| |S d S )Nz'%s' skipped: %sr   )argskwmsg)r    r   fn_name	predicatereasonr   r   maybe:   s
    

z(skip_if.<locals>.decorate.<locals>.maybe)r   r   )r   r'   )r    r%   r&   )r   r$   r   decorate7   s    zskip_if.<locals>.decorate)r   Znoser    )r%   r&   r(   r   )r    r%   r&   r   skip_if1   s    
r)   c             O   s<   y||| d}W n | k
r*   d}Y nX |s8t ddS )zGAssert the given exception is raised by the given function + arguments.FTz#Callable did not raise an exceptionN)AssertionError)Z
except_clsZ	callable_r!   r"   successr   r   r   assert_raisesE   s    

r,   c             C   sJ   d}x@t | t jsDy|d7 }t |  W q   |dkr< Y qX qW dS )zcverifies and creates a directory.  tries to
    ignore collisions with other threads and processes.r   r      N)osaccessF_OKmakedirs)dirtriesr   r   r   r   R   s    c             C   s*   t t| j}|r"|d dkr"dS dS dS )z8Return True if the given function has a 'self' argument.r   )selfclsTFN)listr   
parameters)funcr!   r   r   r   has_self_arg`   s    r9      c             C   s0   t | trtj| tj|d ntj| |d dS )zIssue a warning.)
stacklevelN)
isinstancer   warningswarnr   ZBeakerWarning)r#   r;   r   r   r   r>   i   s    
r>   c                s    fdd}|S )Nc                s*    fdd} j |_ d jf |_|S )Nc                 s   t td  | |S )N   )r=   r>   DeprecationWarning)r!   Zkargs)r   messager   r   deprecated_methods   s    z6deprecated.<locals>.wrapper.<locals>.deprecated_methodz%s

%s)r   __doc__)r   rB   )rA   )r   r   wrapperr   s    zdeprecated.<locals>.wrapperr   )rA   rD   r   )rA   r   
deprecatedq   s    rE   c               @   s>   e Zd ZdZdZdd Zdd Zdd Zdd
dZdd Z	d	S )r   z$stores a value on a per-thread basis_tlocalc             C   s   t  | _ d S )N)rF   )r4   r   r   r   __init__   s    zThreadLocal.__init__c             C   s   || j _d S )N)rF   value)r4   rH   r   r   r   put   s    zThreadLocal.putc             C   s   t | jdS )NrH   )hasattrrF   )r4   r   r   r   has   s    zThreadLocal.hasNc             C   s   t | jd|S )NrH   )getattrrF   )r4   defaultr   r   r   get   s    zThreadLocal.getc             C   s
   | j `d S )N)rF   rH   )r4   r   r   r   remove   s    zThreadLocal.remove)N)
r   
__module____qualname__rC   	__slots__rG   rI   rK   rN   rO   r   r   r   r   r   }   s   
c               @   s`   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d Zdd ZdS )r   a  
    An efficient/threadsafe singleton map algorithm, a.k.a.
    "get a value based on this key, and create if not found or not
    valid" paradigm:

        exists && isvalid ? get : create

    Designed to work with weakref dictionaries to expect items
    to asynchronously disappear from the dictionary.

    Use python 2.3.3 or greater !  a major bug was just fixed in Nov.
    2003 that was driving me nuts with garbage collection/weakrefs in
    this section.

    c             C   s   t  | _i | _d S )N)
_threadingLockmutexdict)r4   r   r   r   rG      s    
zSyncDict.__init__c             O   sV   y,|| j kr| j | S | j||f||S W n$ tk
rP   | j||f||S X d S )N)rV   sync_getKeyError)r4   key
createfuncr!   kwargsr   r   r   rN      s    

zSyncDict.getc             O   sr   | j   zVy,|| jkr"| j| S | j||f||S W n$ tk
r\   | j||f||S X W d | j   X d S )N)rU   acquirerV   _createrX   release)r4   rY   rZ   r!   r[   r   r   r   rW      s    


zSyncDict.sync_getc             O   s   ||| | |< }|S )Nr   )r4   rY   rZ   r!   r[   objr   r   r   r]      s    zSyncDict._createc             C   s
   || j kS )N)rV   )r4   rY   r   r   r   has_key   s    zSyncDict.has_keyc             C   s   | j |S )N)rV   __contains__)r4   rY   r   r   r   ra      s    zSyncDict.__contains__c             C   s   | j |S )N)rV   __getitem__)r4   rY   r   r   r   rb      s    zSyncDict.__getitem__c             C   s   | j || d S )N)rV   __setitem__)r4   rY   rH   r   r   r   rc      s    zSyncDict.__setitem__c             C   s   | j |S )N)rV   __delitem__)r4   rY   r   r   r   rd      s    zSyncDict.__delitem__c             C   s   | j   d S )N)rV   clear)r4   r   r   r   re      s    zSyncDict.clearN)r   rP   rQ   rC   rG   rN   rW   r]   r`   ra   rb   rc   rd   re   r   r   r   r   r      s   	c               @   s   e Zd Zdd ZdS )r   c             C   s   t  | _t | _d S )N)rS   RLockrU   weakrefWeakValueDictionaryrV   )r4   r   r   r   rG      s    
zWeakValuedRegistry.__init__N)r   rP   rQ   rG   r   r   r   r   r      s   .encTc       	      C   s   d |}tdkrddlma |rLt|tr@t|d }nt| }tj	|}g }x$t
d|D ]}||d|  qhW tjj | f| }t| tj ||| S )zsGenerate a unique file-accessible path from the given list of
    identifiers starting at the given root directory._Nr   )sha1zutf-8r   )joinrk   Zbeaker.cryptor<   r   encode	hexdigestr.   pathbasenamerangeappendr   )	rootZidentifiers	extensiondepthZdigest_filenamesidenttokensdr2   r   r   r   r      s    

c             C   s8   t | tr| S t | tr,td| r,t| S tdd S )Nz^\d+$zThis is not a proper int)r<   intr   rematch	Exception)r_   r   r   r   asint   s
    
r}   c             C   s   t | |st |ts|f}d}x|D ]}yn|ttfkrLdd | dD } nD|tkrZt}n.|tkrht}n |tt	fkrt | |st
d||| } d}W n   Y nX |r$P q$W |st
|nt | tr|  st
d| | S )NFc             S   s   g | ]}|  qS r   )strip).0xr   r   r   
<listcomp>	  s    z"verify_options.<locals>.<listcomp>,z%s requires a timedelta typeTz!Empty strings are invalid for: %s)r<   tupler6   splitboolr   ry   r}   r   r   r|   strr~   )opttypeserrorZcoercedtypr   r   r   verify_options  s4    





r   c             C   s4   x.|D ]&\}}}|| krt | | ||| |< qW | S )N)r   )paramsZrulesetrY   r   rA   r   r   r   verify_rules  s    r   c             C   sP  dt tfdfdt tfdfdt tfdfdttttfdfd	t tfd
fdt tfdfdt fdfdt fdfdt tfdfdt tfdfdt tfdfdttfdfdttfdfdttfdfdttfdfdttfd fd!ttfd"fd#t tfd$fd%t fd&fg}t| |}|d}|r&t|tr&t|ts&t|d'|d< |dd k	rL|dd(sLt	d)|S )*Ndata_dirz3data_dir must be a string referring to a directory.lock_dirz3lock_dir must be a string referring to a directory.typezSession type must be a string.cookie_expireszGCookie expires was not a boolean, datetime, int, or timedelta instance.Zcookie_domainzCookie domain must be a string.Zcookie_pathzCookie path must be a string.idzSession id must be a string.rY   zSession key must be a string.secretz Session secret must be a string.Zvalidate_keyz%Session encrypt_key must be a string.Zencrypt_keyz&Session validate_key must be a string.Zencrypt_nonce_bitsz+Session encrypt_nonce_bits must be a numbersecurez!Session secure must be a boolean.httponlyz#Session httponly must be a boolean.timeoutz#Session timeout must be an integer.Zsave_accessed_timez@Session save_accessed_time must be a boolean (defaults to true).autozSession is created if accessed.Zwebtest_varnamez!Session varname must be a string.Zdata_serializerz!data_serializer must be a string.)secondsTz.save_accessed_time must be true to use timeout)
r   r   r   r   r   ry   r   rN   r<   r|   )r   rulesoptsr   r   r   r   coerce_session_params&  s:    



r   c          	   C   sb   dt tfdfdt tfdfdt fdfdttfdfd	ttfd
fdtttfdfdttfdfg}t| |S )Nr   z3data_dir must be a string referring to a directory.r   z3lock_dir must be a string referring to a directory.r   zCache type must be a string.enabledz&enabled must be true/false if present.expirezNexpire must be an integer representing how many seconds the cache is valid forregionsz7Regions must be a comma separated list of valid regions
key_lengthzUkey_length must be an integer which indicates the longest a key can be before hashing)r   r   r   ry   r6   r   r   )r   r   r   r   r   coerce_cache_paramsJ  s    

r   c             C   s>  dt tfdfdt tfdfdtfdfdtfdfd	tfd
fdtfdfdt tfdfdtfdfdt tfdfdtfdfdt tfdfdt tfdfdtt fdfdt tfdfdt tfdfdtfd fd!t tfd"fd#tfd$fd%tfd&fd'tfd(fd)t tfd*fd+tfd,fd-tfd.fd/tfd0fd1tfd2fd3tfd4fd5t tfd6fd7tfd8fg}t| |S )9NZcasz#cas must be a boolean or an integerZno_blockz(no_block must be a boolean or an integerZreceive_timeoutz"receive_timeout must be an integerZsend_timeoutzsend_timeout must be an integerZketama_hashzHketama_hash must be a string designating a valid hashing strategy optionZ_poll_timeoutz _poll_timeout must be an integerZ
auto_ejectzauto_eject must be an integerZretry_timeoutz retry_timeout must be an integerZ_sort_hostsz_sort_hosts must be an integerZ_io_msg_watermarkz$_io_msg_watermark must be an integerZketamaz&ketama must be a boolean or an integerZketama_weightedz/ketama_weighted must be a boolean or an integerZ_io_key_prefetchz0_io_key_prefetch must be a boolean or an integerZ_hash_with_prefix_keyz5_hash_with_prefix_key must be a boolean or an integerZtcp_nodelayz+tcp_nodelay must be a boolean or an integerZfailure_limitz failure_limit must be an integerZbuffer_requestsz/buffer_requests must be a boolean or an integerZ_socket_send_sizez$_socket_send_size must be an integerZnum_replicasznum_replicas must be an integerZremove_failedz remove_failed must be an integerZ_noreplyz(_noreply must be a boolean or an integerZ_io_bytes_watermarkz&_io_bytes_watermark must be an integerZ_socket_recv_sizez$_socket_recv_size must be an integerdistributionzEdistribution must be a string designating a valid distribution optionconnect_timeoutz"connect_timeout must be an integerhashz8hash must be a string designating a valid hashing optionZverify_keysz+verify_keys must be a boolean or an integerZdead_timeoutzdead_timeout must be an integer)r   ry   r   r   )	behaviorsr   r   r   r   coerce_memcached_behaviorsZ  s@    












r   c             C   s@  |rt ddddd}ni }xH|  D ]<\}}|drF|||dd < |dr$|||dd < q$W t| d|kr|rd	|d< |d
d}|r<i }x|D ]}|sqt |d|d|d|d |d|dtd}d| }	t|	}
x0t|D ]$}||	r|||||
d < qW t| |||< qW ||d< |S )zJParse configuration options and validate for use with the
    CacheManagerZmemoryN)r   r   r   Zlog_filezbeaker.cache.   zcache.   r   Tr   r   r   r   r   r   )r   r   r   r   r   r   z%s.Zcache_regions)	rV   items
startswithr   poprN   DEFAULT_CACHE_KEY_LENGTHlenr   )configZinclude_defaultsoptionsrY   valr   Zregion_configsZregionZregion_optionsZregion_prefixZ
region_lenr   r   r   parse_cache_config_options  sB    





r   c             C   s@   i }x.|   D ]"\}}|dr|||dd < qW t| |S )zParse behavior options and validate for use with pylibmc
    client/PylibMCNamespaceManager, or potentially other memcached
    NamespaceManagers that support behaviorsz	behavior.	   N)r   r   r   )r   r   rY   r   r   r   r   parse_memcached_behaviors  s    
r   c             C   sT   d}t | dst | dr(t| }t| } |r<d|j|jf S dt| | jf S dS )z+Generates a unique namespace for a functionNr	   __func__z%s.%sz%s|%s)rJ   r   r	   rP   r   inspectgetsourcefile)r8   Zklsr   r   r   func_namespace  s    r   c               @   s   e Zd Zdd Zdd ZdS )PickleSerializerc             C   s
   t |S )N)r
   loads)r4   data_stringr   r   r   r     s    zPickleSerializer.loadsc             C   s   t |dS )Nr?   )r
   dumps)r4   datar   r   r   r     s    zPickleSerializer.dumpsN)r   rP   rQ   r   r   r   r   r   r   r     s   r   c               @   s   e Zd Zdd Zdd ZdS )JsonSerializerc             C   s   t t|dS )Nzutf-8)jsonr   zlib
decompressdecode)r4   r   r   r   r   r     s    zJsonSerializer.loadsc             C   s   t t|dS )Nzutf-8)r   compressr   r   rm   )r4   r   r   r   r   r     s    zJsonSerializer.dumpsN)r   rP   rQ   r   r   r   r   r   r   r     s   r   c             C   s    |dkrt  }nt }|| S )Nr   )r   r   r   )r   method
serializerr   r   r   r     s    c             C   s    |dkrt  }nt }|| S )Nr   )r   r   r   )r   r   r   r   r   r   r     s    c              C   sJ   t  } ts | t   n| t  t| 	 dd 
dS )Nr   r:   ascii)hashlibmd5r   updatesocketgethostnamerm   binasciihexlifydigestr   )Zmachine_hashr   r   r   machine_identifier  s
    r   c             C   s\   t jdkr<d|  }t|d}|| |  t ||  nt| d}|| |  d S )Nposixz%s.tempwb)r.   r   openwritecloserename)filepathcontentstempnamefhr   r   r   
safe_write  s    




r   )N)r:   )ri   r:   T)T)CrC   r   r   r   _compatr   r   r   r   r   r   r	   r
   r   r   	threadingrS   ImportErrorZdummy_threadingr   r   r.   rz   stringr   rg   r=   sysr   r   r   Zbeaker.convertersr   Zbeakerr   r   rF   r   __all__r   r)   r,   r   r9   r>   rE   objectr   r   r   rk   r   r}   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   <module>   sl   0
	
A 
	$%
.	