a
    Ò�éi™.  ã                   @   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¡pZeZej	 
d¡ZepneZej	 
d¡ZepŠe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ƒrìG 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)ÚwrapsZGITHUB_ACTIONSZTRAVISZAPPVEYORZGREENLET_MANYLINUXZGREENLET_SKIP_LEAKCHECKSZ GREENLET_SKIP_FAILING_LEAKCHECKSZ 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   úH/home/Claro/venv/lib/python3.9/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                   @   s   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   s    z_MockGC.get_objectsc                 C   s
   t t|ƒS ©N)ÚgetattrÚgc)r   Únamer   r   r   Ú__getattr__n   s    z_MockGC.__getattr__N)r   r   r   r   r   r   r   r   r   r   k   s   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                   @   s   e Zd Zdd„ Zdd„ ZdS )Ú!ignores_types_in_strict_leakcheckc                 C   s
   || _ d S r   )Útypes)r   r   r   r   r   Ú__init__~   s    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   }   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 )Ú_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rfz| j |¡}W n" tyT   | j |¡dk}Y n0 |turf|rfdS | j ¡ D ]}||u rp dS qp|| jv s˜|| j	v rœdS dS )NFr   T)
ÚtypeÚ_include_object_pÚ__eq__ÚAttributeErrorZ__cmp__ÚNotImplementedÚ__dict__Úvaluesr(   ÚIGNORED_TYPES)r   ÚobjÚkindZexact_method_equalsÚxr   r   r   r+   –   s     z"_RefCountChecker._include_object_pc                 C   s   t jd | j| jd�S )N)Úlimitr'   Úfilter)ÚobjgraphÚgrowthr'   r+   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>Ä   ó    z0_RefCountChecker._report_diff.<locals>.<genexpr>z%-*s%9d %+9dÚ
)ÚmaxÚappendÚjoin)r   r8   ÚlinesÚwidthr   ÚcountÚdeltaÚdiffr   r   r   Ú_report_diff¿   s    
z_RefCountChecker._report_diffc                 C   sª   t  ¡ }t  ¡  | jr(| j ¡  d| j_zL| j| jg|¢R i |¤Ž W | j ¡  | j 	¡  d| j_d| _|r¦t  
¡  n0| j ¡  | j 	¡  d| j_d| _|r¤t  
¡  0 d S )NFT)r   Ú	isenabledÚdisabler)   r$   ZsetUpZskipTearDownr%   ZtearDownZ
doCleanupsÚenable)r   ÚargsÚkwargsZ
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 r0t jd  ¡  |  ¡ S )NÚurlparsezurllib.parse)r   ÚmodulesÚclear_cacher9   r   r   r   r   Ú_growth_afterÝ   s
    

z_RefCountChecker._growth_afterc                 C   sL  | j }|sdS tjr$tdtjf ƒ‚|dd … ddgkrHt|ƒdv rHdS |dd … g d¢kr`dS t|ƒd	kr„t|d
d … ƒdkr„dS t|ƒdkrÖ|d dkrÖ|d |d krÖ|d |d krÖ|  |¡}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�rHtd||  |¡f ƒ‚dS )NTz"Generated uncollectable garbage %réþÿÿÿr   )é   é   Féýÿÿÿ)r   r   r   é   éüÿÿÿrU   éÿÿÿÿzrefcount increased by %r
%srT   é   é   )r&   r   Úgarbager   r:   ÚsumrH   rE   )r   r8   r&   rG   r5   r   r   r   Ú_check_deltasæ   s0      8
Dÿÿz_RefCountChecker._check_deltasc                 C   s¸   t dƒD ]}t ¡  qt| jddƒ}|r0d| j_t| jddƒ| _|  ¡ }z>|  	|¡r„|  
||¡ |  ¡ }| j tdd„ |D ƒƒ¡ qJW n tyž   |sš‚ Y n0 |r´td	| jf ƒ‚d S )
NrU   r
   FTr!   r   c                 s   s   | ]}|d  V  qdS )rT   Nr   )r;   Ústatr   r   r   r=   *  r>   z,_RefCountChecker.__call__.<locals>.<genexpr>z#Expected %s to leak but it did not.)Úranger   Zcollectr   r%   r$   Zexpect_greenlet_leakr(   r9   r^   rN   rR   r&   rA   r]   r   )r   rL   rM   r<   Zexpect_failurer8   r   r   r   r"     s"    

 z_RefCountChecker.__call__N)r   r   r   r1   r    r+   r9   rH   rN   rR   r^   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r0t ˆ ddƒs0t d¡‚t| ˆ ƒ||ƒS )Nr   Fz$This class ignored during leakchecksr
   z(Only running tests that fail leakchecks.)r   r   ZSkipTestÚONLY_FAILING_LEAKCHECKSr#   )r   rL   rM   ©Úmethodr   r   Úwrapper6  s
    

zwrap_refcount.<locals>.wrapper)r   ÚSKIP_LEAKCHECKSr   )rc   rd   r   rb   r   Úwrap_refcount2  s
    rf   )Ú
__future__r   Úosr   r   Ú	functoolsr   r   r7   ÚenvironÚgetZRUNNING_ON_GITHUB_ACTIONSZRUNNING_ON_TRAVISZRUNNING_ON_APPVEYORZRUNNING_ON_CIZRUNNING_ON_MANYLINUXre   r   ra   r	   r
   ÚAssertionErrorr   ÚhasattrÚobjectr   r   r   r#   rf   r   r   r   r   Ú<module>   s4   !	

 /