bg40dZddlZddlZddlZddlZddlZddlmZddlmZddlm Z ddlm Z ddlm Z ddlm Z dd lm Z dd lmZdd lmZdd lmZdd lmZddlmZddlmZddlmZddlmZddlmZddlmZddlmZddlm Z er ddl!m"Z"ddl#m$Z$de%de e%e%ffdZ&deddfdZ'deddfdZ(Gdd Z)Gd!d"Z*Gd#d$Z+d%Z,d&Z-d'ed(ee.d)e de fd*Z/d(ee.dej0fd+Z1d,ej0ddfd-Z2dS).z4Interactive debugging with PDB, the Python Debugger.N)Any)Callable) Generator)List)Optional)Tuple)Type) TYPE_CHECKING)Union)outcomes) ExceptionInfo)Config)ConftestImportFailure)hookimpl)PytestPluginManager)Parser) UsageError)Node) BaseReport)CaptureManager)CallInfovaluereturnc |d\}}n*#t$r}tj|d|d}~wwxYw||fS)z#Validate syntax of --pdbcls option.:z) is not in the format 'modname:classname'N)split ValueErrorargparseArgumentTypeError)rmodname classnamees b/builddir/build/BUILD/cloudlinux-venv-1.0.7/venv/lib/python3.11/site-packages/_pytest/debugging.py_validate_usepdb_clsr$!so"[[-- ( A A A    Y s A=Aparserc|d}|dddd|ddd td |d d dddS)Ngeneralz--pdbusepdb store_truezDStart the interactive Python debugger on errors or KeyboardInterrupt)destactionhelpz--pdbcls usepdb_clszmodulename:classnamez{Specify a custom interactive Python debugger for use with --pdb.For example: --pdbcls=IPython.terminal.debugger:TerminalPdb)r*metavartyper,z--tracetracez(Immediately break when running each test)getgroup _addoptionr$)r%groups r#pytest_addoptionr4,s OOI & &E   S    & !F    7 configcddl|dr'|jt d|dr'|jt dt jj t j t j ft j _ |jt _ |t _ dfd }| |dS) Nrr0pdbtracer( pdbinvokerc~tj\_t_t_dSN) pytestPDB_savedpop set_trace_pluginmanager_config)pdbsr#finzpytest_configure..finUs3   " "  M  $    r5rN) rBgetvalue pluginmanagerregisterPdbTrace PdbInvoker<r=appendr?r@rA add_cleanup)r6rCrBs @r#pytest_configurerLDsJJJ w>%%hjj*=== x  @%%ikk;???   0)2CD'CM%3II###### sr5ceZdZUdZdZeeed<dZee ed<gZ e e e deeee fed<dZdZee eeeefed<ed ed d eeeffd Zed ed fd Zed ed fdZedZeddZdS)r<z'Pseudo PDB that defers to the real pdb.Nr@rA).Nr=r_wrapped_pdb_clscapmanrrc2|r|SdS)NF) is_capturing)clsrOs r# _is_capturingzpytestPDB._is_capturingjs!  )&&(( (ur5c^|js ddl}|jS|jd}|jr|jd|kr |jdS|r|\}} t |t j|}|d}t||d}|ddD]} t|| }nJ#t$r2} d ||f} td| d| | d} ~ wwxYwddl}|j}| ||} || f|_| S)Nrr-.rz--pdbcls: could not import z: )rArBPdbrErN __import__sysmodulesrgetattr Exceptionjoinr_get_pdb_wrapper_class) rRrOrBr-r r!modpartspdb_clspartexcr wrapped_clss r#_import_pdb_clszpytestPDB._import_pdb_clspsy{  JJJ7N[)),77   +C$8$;z$I$I'* *  !+ GY 7###k'*",,!#uQx00!!""I55D%gt44GG5   '9!566 B%BBSBB  JJJgG00&AA *K8sA)C D-C;;Dc8ddlGfdd|}|S)NrcheZdZZdZfdZfdZexZZfdZ e Z e Z fdZ fdZ xZS):pytestPDB._get_pdb_wrapper_class..PytestPdbWrapperFcxjdz c_t|}xjdzc_|S)NrU)_recursive_debugsuperdo_debugselfargret __class__rRs r#rlzCpytestPDB._get_pdb_wrapper_class..PytestPdbWrapper.do_debugsG$$)$$gg&&s++$$)$$ r5cTt|}jdkrĉjJjj}||j}t |}|rO|dkr| ddn| dd|z|J| n| ddj Jj j j|d|_|S) Nrglobal>z#PDB continue (IO-capturing resumed)z*PDB continue (IO-capturing resumed for %s)z PDB continuer6rBT)rk do_continuerjrAr6create_terminal_writerline_pytest_capmanr<rSsepresumer@hookpytest_leave_pdb _continued) rnrorptwrO capturingrq_pytestrRs r#rvzFpytestPDB._get_pdb_wrapper_class..PytestPdbWrapper.do_continues2gg))#..'1,,;222 >>s{KKBGGIII!0F ) 7 7 ? ?I 4$00FF3(MNNNNFF # L"+!, &111 sN333)555"'88 QU8VVV"& r5ct|}jdkrtjd|S)aRaise Exit outcome when quit command is used in pdb. This is a bit of a hack - it would be better if BdbQuit could be handled, but this would require to wrap the whole pytest run, and adjust the report etc. rQuitting debugger)rkdo_quitrjr exitrms r#rzBpytestPDB._get_pdb_wrapper_class..PytestPdbWrapper.do_quits>ggooc**'1,,M"5666 r5ct||}|s)|jr"|jr|jd|S)zSuspend on setup(). Needed after do_continue resumed, and entering another breakpoint again. Tin_)rksetupr~rysuspend_global_capture)rnftbrprqs r#rz@pytestPDB._get_pdb_wrapper_class..PytestPdbWrapper.setups\ ggmmAr**MtM*M+BBtBLLL r5cHt||\}}|wtdt|dz }|rU||djddr.|dz}|r'||djdd.||fS)NrrU__tracebackhide__F)rk get_stackmaxlenf_localsget)rnrtstackirqs r#rzDpytestPDB._get_pdb_wrapper_class..PytestPdbWrapper.get_stacks 77,,Q22q9As5zzA~..Aa 4 8 89Le T TQa 4 8 89Le T Taxr5)__name__ __module__ __qualname__ryr~rlrvdo_cdo_contrdo_qdo_exitrr __classcell__)rqrrOrRs@r#PytestPdbWrapperrhs#NJ              6) (D7      DG              r5r)_pytest.config)rRrarOrrs` ` @r#r^z pytestPDB._get_pdb_wrapper_classsdM M M M M M M M M wM M M ^ r5cddl}|jd}n|jd}|r|d|jr|j|j}||jdkr| dd}|| d|no| |}|dkr| dd |d n9|r| dd |d |d n| dd || |di|} |jr&|jj |j| | S)z4Initialize PDB debugging, dropping any IO capturing.rNcapturemanagerTrheaderrtrszPDB z (IO-capturing turned off)z (IO-capturing turned off for )ru)rr@ getpluginsuspendrAr6rwrxrjr>rzrSrer|pytest_enter_pdb) rRmethodargskwargsrrOrrr_pdbs r# _init_pdbzpytestPDB._init_pdbs    %/3FF'112BCCF  % NNtN $ $ $ ; 566s{CCB GGIII#q((Hd33%FF3'''' # 1 1& 9 9I H,,s$M6$M$M$MNNNN"5C%vvyyy2 sO6OO444*s""6**44V44   S   # 4 4CKT 4 R R R r5ctjj}|jdg|Ri|}||dS)zBInvoke debugging via ``Pdb.set_trace``, dropping any IO capturing.r?N)rY _getframef_backrr?)rRrrframers r#r?zpytestPDB.set_tracesK &s}[:4:::6:: ur5rD)rrr__doc__r@rr__annotations__rArr=rrrrjrNr r classmethodr strboolrSrer^rr?rr5r#r<r<_s1148NH01888 $GXf $$$  D hy!8,?#@(6BRRS    >BhuT#YS %9:;BBB8,<#=%T BR[ $X.>%?$$$[$LT X>N5OT T T [T l%%[%N[r5r<cBeZdZdedddeddfdZdeeddfd ZdS) rInodecallz CallInfo[Any]reportrNc|jjd}|rk|d|\}}t j|t j||jJt|jj tj st||j|dSdS)NrTr)r6rFrrread_global_capturerYstdoutwriteexcinfo isinstancerunittestSkipTest _enter_pdb)rnrrrrOouterrs r#pytest_exception_interactz#PdbInvoke.pytest_exception_interacts*445EFF  "  ) )d ) 3 3 31133HC J  S ! ! ! J  S ! ! !|'''$,,h.?@@ 3 tT\6 2 2 2 2 2 3 3r5rcBt|}t|dSr;)_postmortem_traceback post_mortem)rnrrs r#pytest_internalerrorzPdbInvoke.pytest_internalerror-s "7 + +Br5) rrrrrrr BaseExceptionrrr5r#rIrIso 3 3 / 39C 3  3 3 3 3M-,HTr5rIcJeZdZeddedfdZdS)rHT) hookwrapperr)NNNc#0Kt|dVdSr;) wrap_pytest_function_for_tracing)rn pyfuncitems r#pytest_pyfunc_callzPdbTrace.pytest_pyfunc_call3s!(444 r5N)rrrrrrrr5r#rHrH2sM X$ :J0K r5rHctd|jtjfd}||_dS)zChange the Python function object of the given Function item by a wrapper which actually enters pdb before calling the python function itself, effectively leaving the user in the pdb prompt in the first statement of the function.runcallc\tjg|Ri|}|dSr;) functoolspartialr)rrfuncr testfunctions r#wrapperz1wrap_pytest_function_for_tracing..wrapperDs; ?????? Tr5N)r<robjrwraps)rrrrs @@r#rr9sb   y ) )D>L _\""#"JNNNr5c\|jdrt|dSdS)zaWrap the given pytestfunct item for tracing support if --trace was given in the command line.r0N)r6rEr)rs r#&maybe_wrap_pytest_function_for_tracingrLs;!!'**5(4444455r5rrrepc@|jjdj}||jjj}d|jfd|jfd|j ffD]S\}}||dfvrH|rF| dd|z|ddd kr |dd}||T| dd | || dd t|}d |_ t||S) Nterminalreporterrstderrlogallrtz captured  tracebackz entering PDBT)r6rFr_twrxoption showcapture capstdout capstderrcaplogrz toterminalr _pdbshownr)rrrrr sectionnamecontentrs r#rrSs1  " , ,-? @ @ DBGGIII+$0K 3=! 3=!  !   W ;. . .7 . FF3 k1 2 2 2rss|t##!#2#, GGG   FF3 NN2FF3 w ' 'BCMOOO Jr5cddlm}t|j|r|jjdSt|jt r|jjdS|jJ|jdS)Nr)UnexpectedException)doctestrrrexc_inforr_excinfo)rrs r#rrrs++++++'-!455 #}%a(( GM#8 9 9#}$Q''+++""r5rctd}||d||jrt jddSdS)Nrr)r<rreset interactionquittingr r)rps r#rrsaM**AGGIIIMM$z+ )*****++r5)3rrrrYtypesrtypingrrrrrrr r r rr _pytest._coder rrrrr_pytest.config.argparsingr_pytest.config.exceptionsr _pytest.nodesr_pytest.reportsr_pytest.capturer_pytest.runnerrrr$r4rLr<rIrHrrrr TracebackTyperrrr5r#rs\::  ''''''!!!!!!000000######......,,,,,,000000&&&&&&(......''''''  c3h    V0V6||||||||~(&555 &}5 #=#? #EDW # # # # +5&+4++++++r5