o
    -hD1                     @   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   Z/var/www/html/pro-man-master/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                   @   sT   e Zd 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   )uop_executorc                 C   s(   || _ || _g | _i | _d| _d| _d S )Nr   F)testcasefunctiondeltas
peak_statsignored_typesneeds_setUp)r   r/   r0   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 sR|| j	v sR|j
| jv rTdS dS )NFr   T)type_include_object_p__eq__AttributeError__cmp__NotImplemented__dict__valuesr3   IGNORED_TYPESr   IGNORED_TYPE_NAMES)r   objkindexact_method_equalsxr   r   r   r6      s(   

z"_RefCountChecker._include_object_pc                 C   s   t jd | j| jdS )N)limitr2   filter)objgraphgrowthr2   r6   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   rF   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disabler4   r/   setUpskipTearDownr0   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_cacherG   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st|d
d  dks|d
d  ddkrd}nd}t||krtd|| |f dS )NTz"Generated uncollectable garbage %rr   )      F)r   r   r      rg   zrefcount increased by %r
%srf         )r1   r#   garbager   rH   sumrU   rR   )r   rF   r1   rT   rC   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 )
Nrg   r   FTr+   r   c                 s   s    | ]}|d  V  qdS )rf   Nr   )rI   statr   r   r   rK   <  s    z,_RefCountChecker.__call__.<locals>.<genexpr>z#Expected %s to leak but it did not.)ranger#   collectr"   r0   r/   expect_greenlet_leakr3   rG   rp   r`   rd   r1   rN   ro   r   )r   r]   r^   rJ   expect_failurerF   r   r   r   r,   )  s,   


z_RefCountChecker.__call__N)r   r   r   r=   r>   r*   r6   rG   rU   r`   rd   rp   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   wrapperH  s
   

zwrap_refcount.<locals>.wrapper)r"   SKIP_LEAKCHECKSr   )ry   rz   r   rx   r   wrap_refcountD  s
   r|   )
__future__r   osr   r#   	functoolsr   r   rE   environgetRUNNING_ON_GITHUB_ACTIONSRUNNING_ON_TRAVISRUNNING_ON_APPVEYORRUNNING_ON_CIRUNNING_ON_MANYLINUXr{   r   rw   r   r   AssertionErrorr   hasattrobjectr   r'   r(   r-   r|   r   r   r   r   <module>   s6   !	

 A