ó
ÐH/\c           @  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 d  d l	 Z	 d  d l
 Z	 d „  Z d e f d „  ƒ  YZ d „  Z d S(   iÿÿÿÿ(   t   print_functionN(   t   wrapsc         C  s   t  |  _ |  S(   sç  
    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   Truet   ignore_leakcheck(   t   func(    (    s7   lib/python2.7/site-packages/gevent/testing/leakcheck.pyt   ignores_leakcheck"   s    	t   _RefCountCheckerc           B  sœ   e  Z e e e j e j f Z y e j	 j
 Z Wn! e k
 rQ d  d l m
 Z n Xd „  Z d „  Z d „  Z d „  Z d „  Z d „  Z d „  Z d	 „  Z RS(
   iÿÿÿÿ(   t   callbackc         C  s1   | |  _  | |  _ g  |  _ i  |  _ t |  _ d  S(   N(   t   testcaset   functiont   deltast
   peak_statst   Falset   needs_setUp(   t   selfR   R	   (    (    s7   lib/python2.7/site-packages/gevent/testing/leakcheck.pyt   __init__<   s
    				c         C  sˆ   | |  k s0 | |  j  j ƒ  k s0 | |  j k r4 t St | ƒ } | |  j k rS t S| |  j k r„ | j d  k r„ | j	 d  k r„ t St
 S(   N(   t   __dict__t   valuest   _ignore_object_pR   t   typet   IGNORED_TYPESt   CALLBACK_KINDR   t   Nonet   argsR   (   R   t   objt   kind(    (    s7   lib/python2.7/site-packages/gevent/testing/leakcheck.pyR   F   s    -c         C  s"   t  j d d  d |  j d |  j ƒ S(   Nt   limitR   t   filter(   t   objgrapht   growthR   R   R   (   R   (    (    s7   lib/python2.7/site-packages/gevent/testing/leakcheck.pyt   _growthY   s    c         C  sp   | s
 d Sg  } t  d „  | Dƒ ƒ } x4 | D], \ } } } | j d | | | | f ƒ q- Wd j | ƒ } | S(   Ns   <Unable to calculate growth>c         s  s$   |  ] \ } } } t  | ƒ Vq d  S(   N(   t   len(   t   .0t   namet   _(    (    s7   lib/python2.7/site-packages/gevent/testing/leakcheck.pys	   <genexpr>a   s    s   %-*s%9d %+9ds   
(   t   maxt   appendt   join(   R   R   t   linest   widthR!   t   countt   deltat   diff(    (    s7   lib/python2.7/site-packages/gevent/testing/leakcheck.pyt   _report_diff\   s    !c         C  s’   t  j ƒ  } t  j ƒ  |  j r; |  j j ƒ  t |  j _ n  z |  j |  j | | Ž Wd  |  j j	 ƒ  t
 |  j _ t
 |  _ | r t  j ƒ  n  Xd  S(   N(   t   gct	   isenabledt   disableR   R   t   setUpR   t   skipTearDownR	   t   tearDownR   t   enable(   R   R   t   kwargst
   gc_enabled(    (    s7   lib/python2.7/site-packages/gevent/testing/leakcheck.pyt	   _run_testi   s    
		c         C  sP   d t  j k r# t  j d j ƒ  n  d t  j k rF t  j d j ƒ  n  |  j ƒ  S(   Nt   urlparses   urllib.parse(   t   syst   modulest   clear_cacheR   (   R   (    (    s7   lib/python2.7/site-packages/gevent/testing/leakcheck.pyt   _growth_aftery   s
    c         C  s¨  |  j  } | s t St j r5 t d t j f ƒ ‚ n  | d d d g k ra t | ƒ d k ra t S| d d d d g k r~ t St | ƒ d k rª t | d ƒ d k rª t St | ƒ d k r| d	 d k r| d	 | d k r| d | d k r|  j | ƒ } t d
 | | f ƒ ‚ n  t | d ƒ d k sat | d ƒ d k sa| d j	 d ƒ d k rjd } n d } t | ƒ | k r¤t d
 | |  j | ƒ f ƒ ‚ n  t S(   Ns"   Generated uncollectable garbage %riþÿÿÿi    i   i   iýÿÿÿi   iüÿÿÿiÿÿÿÿs   refcount increased by %r
%si   i   (   i   i   (
   R
   R   R,   t   garbaget   AssertionErrorR   R   t   sumR+   R(   (   R   R   R
   R*   R   (    (    s7   lib/python2.7/site-packages/gevent/testing/leakcheck.pyt   _check_deltas‚   s,    		((JE	c         C  sƒ   x t  d ƒ D] } t j ƒ  q W|  j ƒ  } xO |  j | ƒ r~ |  j | | ƒ |  j ƒ  } |  j j t	 d „  | Dƒ ƒ ƒ q0 Wd  S(   Ni   c         s  s   |  ] } | d  Vq d S(   i   N(    (   R    t   stat(    (    s7   lib/python2.7/site-packages/gevent/testing/leakcheck.pys	   <genexpr>À   s    (
   t   rangeR,   t   collectR   R>   R5   R:   R
   R$   R=   (   R   R   R3   R"   R   (    (    s7   lib/python2.7/site-packages/gevent/testing/leakcheck.pyt   __call__³   s    (   t   __name__t
   __module__t   tuplet   dictt   typest	   FrameTypet   TracebackTypeR   t   geventt   coreR   R   t   AttributeErrort   gevent._ffi.callbackR   R   R   R+   R5   R:   R>   RB   (    (    (    s7   lib/python2.7/site-packages/gevent/testing/leakcheck.pyR   1   s   	
							1c           s5   t  ˆ  d t ƒ r ˆ  St ˆ  ƒ ‡  f d †  ƒ } | S(   NR   c           s:   t  |  d t ƒ r$ t j d ƒ ‚ n  t |  ˆ  ƒ | | ƒ S(   NR   s$   This class ignored during leakchecks(   t   getattrR   t   unittestt   SkipTestR   (   R   R   R3   (   t   method(    s7   lib/python2.7/site-packages/gevent/testing/leakcheck.pyt   wrapperÈ   s    (   RN   R   R   (   RQ   RR   (    (   RQ   s7   lib/python2.7/site-packages/gevent/testing/leakcheck.pyt   wrap_refcountÃ   s    (   t
   __future__R    R7   R,   RG   t	   functoolsR   RO   R   RJ   t   gevent.coreR   t   objectR   RS   (    (    (    s7   lib/python2.7/site-packages/gevent/testing/leakcheck.pyt   <module>   s   	’