Xj-5zddlZddlZddlZddlmZddlZddlZejjdZ ejjdxse Z ejjdZ e xse Z ejjdZ e xsejjdZejjdZejjd Zd Zd Zd Zd ZGddeZeedrGddeZee_eZndZGddeZGddeZdZy)N)wrapsGITHUB_ACTIONSTRAVISAPPVEYORGREENLET_MANYLINUXGREENLET_SKIP_LEAKCHECKS GREENLET_SKIP_FAILING_LEAKCHECKS GREENLET_ONLY_FAILING_LEAKCHECKScd|_|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_leakcheckfuncs l/mnt/ssd/data/Dropbox/adrian/vault-secondbrain/venv/lib/python3.12/site-packages/greenlet/tests/leakcheck.pyignores_leakcheckrJs!D Kcfd}|S)a Return a decorator that marks the function to be ignored during leakchecks (see `ignores_leakcheck`) when *condition* is true. *message* describes why the leakcheck is ignored. When *condition* is false, the function is returned unchanged. c0rt|}|_|SN)rignore_leakcheck_reason)r conditionmessages r decoratorz'ignores_leakcheck_if..decoratoras $T*D+2D ( r)rrrs`` rignores_leakcheck_ifrYs rcVd|_trtjd|}|S)z2 Mark that the function is known to leak. TzSkipping known failures)fails_leakcheckSKIP_FAILING_LEAKCHECKSunittestskipr s rrrhs* D7x}}67= KrcHtjdddkr t|S|S)z` Mark the function as known to leak (fails refcount leakchecks) on Python 3.14 or less. N))sys version_inforr s r fails_leakcheck_on_py314_or_lessr&qs) w&t$$ Krc eZdZy)LeakCheckErrorN)__name__ __module__ __qualname__rrrr(r(ysrr( getobjectsceZdZdZdZy)_MockGCc,tjdS)Nr)r$r,selfs r get_objectsz_MockGC.get_objectss>>!$ $rc"tt|Sr)getattrgc)r1names r __getattr__z_MockGC.__getattr__s2t$ $rN)r)r*r+r2r7rrrr.r.s  % %rr.c|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. rr s rfails_strict_leakcheckr9s  rceZdZdZdZy)!ignores_types_in_strict_leakcheckc||_yr)types)r1r=s r__init__z*ignores_types_in_strict_leakcheck.__init__s  rc(|j|_|Sr)r=leakcheck_ignore_types)r1rs r__call__z*ignores_types_in_strict_leakcheck.__call__s&*jj# rN)r)r*r+r>rArrrr;r;s rr;cDeZdZdZdZdZdZdZdZdZ dZ d Z d Z y ) _RefCountCheckerr) uop_executorcX||_||_g|_i|_d|_d|_y)NrF)testcasefunctiondeltas peak_stats ignored_types needs_setUp)r1rFrGs rr>z_RefCountChecker.__init__s0     !rc||uryt|}|t|jk(r' |jj|}|t ur|ry|j jD]}||usy||jvs&||jvs|j|jvryy#t$r!|jj |dk(}YwxYw)NFrT) type_include_object_p__eq__AttributeError__cmp__NotImplemented__dict__valuesrJ IGNORED_TYPESr)IGNORED_TYPE_NAMES)r1objkindexact_method_equalsxs rrNz"_RefCountChecker._include_object_ps $;Cy 4../ / O&*&<&<&C&CC&H##.8=P%%' Aax  D&& &t)))}} 7 77/" O'+&<&<&D&DS&IQ&N#  OsB++'CCcZtjd|j|jS)N)limitrIfilter)objgraphgrowthrIrNr0s r_growthz_RefCountChecker._growths$Tdoo&*&<&<> >rc|syg}td|D}|D]\}}}|jd||||fz dj|}|S)Nzc3:K|]\}}}t|ywr)len).0r6_s r z0_RefCountChecker._report_diff..s7*$1CI7sz %-*s%9d %+9d )maxappendjoin)r1r_lineswidthr6countdeltadiffs r _report_diffz_RefCountChecker._report_diffsd1777"( G D% LL5$u*EE F Gyy rctj}tj|jr+|jj d|j_ |j|jg|i||jj|jjd|j_d|_|rtjyy#|jj|jjd|j_d|_|rtjwwxYw)NFT) r5 isenableddisablerKrFsetUp skipTearDownrGtearDown doCleanupsenable)r1argskwargs gc_enableds r _run_testz_RefCountChecker._run_tests\\^     MM   !).DMM &  DMM$-- 9$ 9& 9 MM " " $ MM $ $ &)-DMM &#D   MM " " $ MM $ $ &)-DMM &#D  s ! C%%A%E cdtjvr!tjdjdtjvr!tjdj|jS)Nurlparsez urllib.parse)r$modules clear_cacher`r0s r _growth_afterz_RefCountChecker._growth_aftersR  $ KK # / / 1 S[[ ( KK ' 3 3 5||~rct|j}|sytjrtdtj|ddddgk(rt |dvry|ddgdk(ryt |d k\rt |d ddk(ryt |d k\r@|d dkDr8|d |dk(r-|d|dk(r"|j |}td |d|t |dddks(t |d ddks|d djddk\rd}nd}t ||k\r td |d|j |y)NTz Generated uncollectable garbage r)r!r"F)rrrr"zrefcount increased by rgr! )rHr5garbager(rcsumrprm)r1r_rHror\s r _check_deltasz_RefCountChecker._check_deltas sZ  :: !UV V "#;1a& S[F%: "#;) # v;! F23K 0A 5 v;! r Q6":3KPVWYPZ^deg^hPh$$V,D 64!PQ Q vbc{ q Crs $4$9VBC[=N=Nq=QUV=VEE v;%  $*$($5$5f$="?@ @ rc4tdD]}tjt|jdd}|rd|j _t|jdd|_|j} |j|r_|j|||j}|jjtd|D|j|r_|rtd|jd y#t$r|sYywxYw) Nr"rFTr@rc3&K|] }|d yw)r!Nr)rdstats rrfz,_RefCountChecker.__call__..Qs'CDQ'Csz Expected z to leak but it did not.)ranger5collectr4rGrFexpect_greenlet_leakrJr`rr|rrHrirr()r1ryrzreexpect_failurer_s rrAz_RefCountChecker.__call__>sq A JJL !0A5I 15DMM .$T]]4LbQ _$$V,tV,++- ""3'CF'C#DE $$V,$dmm%]^^  !" srNr`rpr|rrrArrrrCrCs< M !(T> "/b_rrCctddstrBtdd}|r1ts+tdjd|tj St fd}|S)Nr FrzIgnoring leakchecks for z: )filect|ddrtjdtr"tddstjdt |||S)Nr Fz$This class ignored during leakchecksrz(Only running tests that fail leakchecks.)r4rSkipTestONLY_FAILING_LEAKCHECKSrC)r1ryrzmethods rwrapperzwrap_refcount..wrappercsZ 4+U 3##$JK K "76;Le+T##$NO O-f-dF;;r)r4SKIP_LEAKCHECKSprintr)r$stderrr)rreasonrs` r wrap_refcountrYsev)51_!:DA / 4:OOVLZZ   6]<< Nr)osr$r5 functoolsrrr^environgetRUNNING_ON_GITHUB_ACTIONSRUNNING_ON_TRAVISRUNNING_ON_APPVEYOR RUNNING_ON_CIRUNNING_ON_MANYLINUXrrrrrrr&AssertionErrorr(hasattrobjectr.r9r;rCrrrrrs-0 BJJNN+;<JJNN8,I0IjjnnZ0!8%8 zz~~&:;&T"**..9S*T**..)KL**..)KL   ^  3 %&% )HK,~_v~_@r