o
    i1                     @   s   d Z ddlZeeZddlZdZdd Zdd Zddd	Z	G d
d de
ZG dd de
Zdd ZG dd deZG dd deZdS )a  The module for memoization stuff.

When you have memory leaks in your daemon, the reason could very well be
reckless usage of the tools here.

These are NOT thread-safe. If you are relying on exactly-one-execution-per-key
behavior in a multithreaded environment, roll your own stuff.
    Ng      N@c                  C   s8   t dttj tjD ]} t d| jt| j qd S )Nz%d memoizers%r: %d entries.)loggerinfolenmemoizeregistryfuncmemor	    r   O/var/www/html/LicenciasMIG/venv/lib/python3.10/site-packages/spyne/util/memo.py_log_all'   s   
r   c                 C   sl   t jD ]}|j| jjju r n	qtd|  d S td|jt|j |j	 D ]\}}td|| q(d S )Nz#%r not found in memoization regisryr   z	%r: %r)
r   r   r   im_selfr   errorr   r   r	   items)r   r	   kvr   r   r   	_log_func-   s   
r   c                 C   sF   t dt | d u rt  nt|  ttt| f}d|_|	  d S )Nz0Enabling @memoize statistics every %d second(s).T)
r   r   MEMOIZATION_STATS_LOG_INTERVALr   r   	threadingTimerstart_memoization_stats_loggerdaemonstart)r   tr   r   r   r   :   s   r   c                   @   s4   e Zd ZdZg Zdd Zdd Zdd Zdd	 Zd
S )r   z7A memoization decorator that keeps caching until reset.c                 C   s&   || _ i | _t | _tj|  d S N)r   r	   r   RLocklockr   r   appendselfr   r   r   r   __init__O   s   
zmemoize.__init__c                 O   s~   |  ||}|| jvr9| j# || jvr*| j|i |}|| j|< |W  d    S W d    n1 s4w   Y  | j|S r   get_keyr	   r   r   getr    argskwargskeyvaluer   r   r   __call__U   s   


zmemoize.__call__c                 C   s   t |t | fS r   tupler   r    r&   r'   r   r   r   r#   a   s   zmemoize.get_keyc                 C   s
   i | _ d S r   r
   r    r   r   r   resetd   s   
zmemoize.resetN)	__name__
__module____qualname____doc__r   r!   r*   r#   r/   r   r   r   r   r   J   s    r   c                   @   s,   e Zd ZdZg Zdd Zdd Zdd ZdS )	memoize_firstzbA memoization decorator that keeps the first call without condition, aka
    a singleton accessor.c                 C   s    || _ t | _tj|  d S r   )r   r   r   r   r   r   r   r   r   r   r   r!   n   s   
zmemoize_first.__init__c                 O   s*   t | ds| j|i |}|| _|S | jS )Nr	   )hasattrr   r	   )r    r&   r'   r)   r   r   r   r*   s   s
   
zmemoize_first.__call__c                 C   s   | ` d S r   r
   r.   r   r   r   r/   z   s   zmemoize_first.resetN)r0   r1   r2   r3   r   r!   r*   r/   r   r   r   r   r4   h   s    r4   c                    s(   t  sJ dG  fdddt}|S )a  A memoization decorator that does memoization unless the returned
    value is in the 'values' iterable. eg let `values = (2,)` and
    `add = lambda x, y: x + y`, the result of `add(1, 1)` (=2) is not memoized
    but the result of `add(5, 5)` (=10) is.
    z7memoize_ignore requires an iterable of values to ignorec                       s   e Zd Z fddZdS )z(memoize_ignore.<locals>._memoize_ignoredc                    s   |  ||}|| jvr=| j' || jvr.| j|i |}| vr%|| j|< |W  d    S W d    n1 s8w   Y  | j|S r   r"   r%   valuesr   r   r*         


z1memoize_ignore.<locals>._memoize_ignored.__call__N)r0   r1   r2   r*   r   r6   r   r   _memoize_ignored   s    r9   )iterr   )r7   r9   r   r6   r   memoize_ignore~   s
   
r;   c                   @      e Zd ZdZdd ZdS )memoize_ignore_nonezA memoization decorator that ignores `None` values. ie when the decorated
    function returns `None`, the value is returned but not memoized.
    c                 O   s   |  ||}|| jvr=| j' || jvr.| j|i |}|d ur%|| j|< |W  d    S W d    n1 s8w   Y  | j|S r   r"   r%   r   r   r   r*      r8   zmemoize_ignore_none.__call__N)r0   r1   r2   r3   r*   r   r   r   r   r=      s    r=   c                   @   r<   )
memoize_idzwA memoization decorator that keeps caching until reset for unhashable
    types. It works on id()'s of objects instead.c                 C   s(   t dd |D t dd | D fS )Nc                 S   s   g | ]}t |qS r   id).0ar   r   r   
<listcomp>   s    z&memoize_id.get_key.<locals>.<listcomp>c                 S   s   g | ]
\}}|t |fqS r   r?   )rA   r   r   r   r   r   rC      s    r+   r-   r   r   r   r#      s   zmemoize_id.get_keyN)r0   r1   r2   r3   r#   r   r   r   r   r>      s    r>   r   )r3   logging	getLoggerr0   r   r   r   r   r   r   objectr   r4   r;   r=   r>   r   r   r   r   <module>   s   


