o
    Šåg¼.  ã                   @   s   d dl mZ d dlZd dlZd dlZd dlmZ d dlZd dlZej	 
d¡Zej	 
d¡p-eZej	 
d¡Zep7eZej	 
d¡ZepEej	 
d¡Zej	 
d	¡Zej	 
d
¡Zdd„ Zdd„ ZG dd„ deƒZeedƒrvG dd„ deƒZeƒ e_eZndd„ ZG dd„ deƒZG dd„ deƒZdd„ ZdS )é    )Úprint_functionN)ÚwrapsÚGITHUB_ACTIONSÚTRAVISÚAPPVEYORÚGREENLET_MANYLINUXÚGREENLET_SKIP_LEAKCHECKSÚ GREENLET_SKIP_FAILING_LEAKCHECKSÚ GREENLET_ONLY_FAILING_LEAKCHECKSc                 C   s
   d| _ | S )aç  
    Ignore the given object during leakchecks.

    Can be applied to a method, in which case the method will run, but
    will not be subject to leak checks.

    If applied to a class, the entire class will be skipped during leakchecks. This
    is intended to be used for classes that are very slow and cause problems such as
    test timeouts; typically it will be used for classes that are subclasses of a base
    class and specify variants of behaviour (such as pool sizes).
    T)Úignore_leakcheck©Úfunc© r   úT/var/www/html/flaskapp/venv/lib/python3.10/site-packages/greenlet/tests/leakcheck.pyÚignores_leakcheckL   s   r   c                 C   s   d| _ trt d¡| ƒ} | S )z2
    Mark that the function is known to leak.
    TzSkipping known failures)Úfails_leakcheckÚSKIP_FAILING_LEAKCHECKSÚunittestÚskipr   r   r   r   r   [   s   r   c                   @   s   e Zd ZdS )ÚLeakCheckErrorN)Ú__name__Ú
__module__Ú__qualname__r   r   r   r   r   d   s    r   Ú
getobjectsc                   @   ó   e Zd Zdd„ Zdd„ ZdS )Ú_MockGCc                 C   s
   t  d¡S )Nr   )Úsysr   ©Úselfr   r   r   Úget_objectsl   ó   
z_MockGC.get_objectsc                 C   s
   t t|ƒS ©N)ÚgetattrÚgc)r   Únamer   r   r   Ú__getattr__n   r    z_MockGC.__getattr__N)r   r   r   r   r%   r   r   r   r   r   k   ó    r   c                 C   s   | S )a  
        Decorator for a function that is known to fail when running
        strict (``sys.getobjects()``) leakchecks.

        This type of leakcheck finds all objects, even those, such as
        strings, which are not tracked by the garbage collector.
        r   r   r   r   r   Úfails_strict_leakchecks   s   r'   c                   @   r   )Ú!ignores_types_in_strict_leakcheckc                 C   s
   || _ d S r!   )Útypes)r   r)   r   r   r   Ú__init__~   r    z*ignores_types_in_strict_leakcheck.__init__c                 C   s   | j |_|S r!   )r)   Úleakcheck_ignore_types)r   r   r   r   r   Ú__call__€   s   z*ignores_types_in_strict_leakcheck.__call__N)r   r   r   r*   r,   r   r   r   r   r(   }   r&   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 )Ú_RefCountCheckerr   c                 C   s(   || _ || _g | _i | _d| _d| _d S )Nr   F)ÚtestcaseÚfunctionÚdeltasÚ
peak_statsÚignored_typesÚneeds_setUp)r   r.   r/   r   r   r   r*   ‹   s   
z_RefCountChecker.__init__c                 C   s    || u rdS t |ƒ}|t | jƒkr3z| j |¡}W n ty*   | j |¡dk}Y nw |tur3|r3dS | j ¡ D ]	}||u rA dS q8|| jv sL|| j	v rNdS dS )NFr   T)
ÚtypeÚ_include_object_pÚ__eq__ÚAttributeErrorÚ__cmp__ÚNotImplementedÚ__dict__Úvaluesr2   ÚIGNORED_TYPES)r   ÚobjÚkindÚexact_method_equalsÚxr   r   r   r5   –   s$   üÿz"_RefCountChecker._include_object_pc                 C   s   t jd | j| jd�S )N)Úlimitr1   Úfilter)ÚobjgraphÚgrowthr1   r5   r   r   r   r   Ú_growth»   s   
ÿz_RefCountChecker._growthc                 C   sR   |sdS g }t dd„ |D ƒƒ}|D ]\}}}| d||||f ¡ qd |¡}|S )Nz<Unable to calculate growth>c                 s   s   � | ]
\}}}t |ƒV  qd S r!   )Úlen)Ú.0r$   Ú_r   r   r   Ú	<genexpr>Ä   s   € z0_RefCountChecker._report_diff.<locals>.<genexpr>z%-*s%9d %+9dÚ
)ÚmaxÚappendÚjoin)r   rD   ÚlinesÚwidthr$   ÚcountÚdeltaÚdiffr   r   r   Ú_report_diff¿   s   
z_RefCountChecker._report_diffc                 C   s®   t  ¡ }t  ¡  | jr| j ¡  d| j_z)| j| jg|¢R i |¤Ž W | j ¡  | j 	¡  d| j_d| _|r<t  
¡  d S d S | j ¡  | j 	¡  d| j_d| _|rVt  
¡  w w )NFT)r#   Ú	isenabledÚdisabler3   r.   ÚsetUpÚskipTearDownr/   ÚtearDownÚ
doCleanupsÚenable)r   ÚargsÚkwargsÚ
gc_enabledr   r   r   Ú	_run_testÌ   s*   


ÿ
ü

ÿz_RefCountChecker._run_testc                 C   s8   dt jv rt jd  ¡  dt jv rt jd  ¡  |  ¡ S )NÚurlparsezurllib.parse)r   ÚmodulesÚclear_cacherE   r   r   r   r   Ú_growth_afterÝ   s
   

z_RefCountChecker._growth_afterc                 C   sD  | j }|sdS tjrtdtjf ƒ‚|dd … ddgkr$t|ƒdv r$dS |dd … g d¢kr0dS t|ƒd	krBt|d
d … ƒdkrBdS t|ƒdkrk|d dkrk|d |d krk|d |d krk|  |¡}td||f ƒ‚t|dd … ƒdksŠt|d
d … ƒdksŠ|d
d …  d¡dkr�d}nd}t|ƒ|kr td||  |¡f ƒ‚dS )NTz"Generated uncollectable garbage %réþÿÿÿr   )é   é   Féýÿÿÿ)r   r   r   é   éüÿÿÿre   éÿÿÿÿzrefcount increased by %r
%srd   é   é   )r0   r#   Úgarbager   rF   ÚsumrS   rP   )r   rD   r0   rR   rA   r   r   r   Ú_check_deltasç   s0     8
>ÿÿz_RefCountChecker._check_deltasc                 C   sÂ   t dƒD ]}t ¡  qt| jddƒ}|rd| j_t| jddƒ| _|  ¡ }z#|  	|¡rF|  
||¡ |  ¡ }| j tdd„ |D ƒƒ¡ |  	|¡s*W n tyT   |sQ‚ Y d S w |r_td	| jf ƒ‚d S )
Nre   r   FTr+   r   c                 s   s   � | ]}|d  V  qdS )rd   Nr   )rG   Ústatr   r   r   rI   +  s   € z,_RefCountChecker.__call__.<locals>.<genexpr>z#Expected %s to leak but it did not.)Úranger#   Úcollectr"   r/   r.   Úexpect_greenlet_leakr2   rE   rn   r^   rb   r0   rL   rm   r   )r   r[   r\   rH   Úexpect_failurerD   r   r   r   r,     s,   


û€ÿÿÿz_RefCountChecker.__call__N)r   r   r   r<   r*   r5   rE   rS   r^   rb   rn   r,   r   r   r   r   r-   „   s    %
1r-   c                    s,   t ˆ ddƒstr
ˆ S tˆ ƒ‡ fdd„ƒ}|S )Nr   Fc                    s@   t | ddƒrt d¡‚trt ˆ ddƒst d¡‚t| ˆ ƒ||ƒS )Nr   Fz$This class ignored during leakchecksr   z(Only running tests that fail leakchecks.)r"   r   ÚSkipTestÚONLY_FAILING_LEAKCHECKSr-   )r   r[   r\   ©Úmethodr   r   Úwrapper7  s
   

zwrap_refcount.<locals>.wrapper)r"   ÚSKIP_LEAKCHECKSr   )rw   rx   r   rv   r   Úwrap_refcount3  s
   rz   )Ú
__future__r   Úosr   r#   Ú	functoolsr   r   rC   ÚenvironÚgetÚRUNNING_ON_GITHUB_ACTIONSÚRUNNING_ON_TRAVISÚRUNNING_ON_APPVEYORÚRUNNING_ON_CIÚRUNNING_ON_MANYLINUXry   r   ru   r   r   ÚAssertionErrorr   ÚhasattrÚobjectr   r'   r(   r-   rz   r   r   r   r   Ú<module>   s6   !	

 0