
    ;i2                        S r SSKrSSKrSSKrSSKrSSKrSSKJr  SSK	J
r
  SSKJr  SSKrSSKJr  SSKJr  \R(                  " \5      rS rS	 r\R2                  R5                  S
5      (       a  S rOS r\R:                  " SS9S 5       r\R:                  S 5       r " S S5      r S r!S\"S\#S\"4S jr$S\"S\#S\"4S jr%S\&S\&S\'\"   S\&4S jr(S\S\"4S jr)g) zLangSmith Pytest hooks.    N)defaultdict)Lock)Any)utils)testc                      U R                  SS5      nUR                  SSSSS9  g	! [         a    [        R	                  S5         g	f = f)
zYSet a boolean flag for LangSmith output.

Skip if --langsmith-output is already defined.
	langsmith	LangSmith--langsmith-output
store_trueFz'Use LangSmith output (requires 'rich').)actiondefaulthelpzCLangSmith output flag cannot be added because it's already defined.N)getgroup	addoption
ValueErrorloggerwarning)parsergroups     g/home/dmtnaga/Documents/work/airagagent/rag_env/lib/python3.13/site-packages/langsmith/pytest_plugin.pypytest_addoptionr      sT    

[9 :	 	 	
  
Q	

s   $' A	A	c                    ^  [        U 4S jS 5       5      (       aZ  [        U 4S jS 5       5      (       d  T R                  SS5        [        U 4S jS 5       5      (       d  T R                  SS	5        g
g
g
)zHandle output arguments.c              3   ,   >#    U  H	  oT;   v   M     g 7fN ).0optargss     r   	<genexpr>&_handle_output_args.<locals>.<genexpr>+   s     
9"83$;"8   )r   c              3   ,   >#    U  H	  oT;   v   M     g 7fr   r   r   ar   s     r   r    r!   -   s     .g9gr"   )-qqr   r&   c              3   ,   >#    U  H	  oT;   v   M     g 7fr   r   r$   s     r   r    r!   0   s     =&<9&<r"   )-sz--capture=nor(   N)anyinsertr   s   `r   _handle_output_argsr,   )   s^    

9"8
999.g...KK5!=&<===KK4  > :    z7.c                     [        U5        g)zCCall immediately after command line options are parsed (pytest v7).Nr,   )configr   s     r   pytest_cmdline_preparser1   6   
    D!r-   c                     [        U 5        g)zHandle args in pytest v8+.Nr/   r+   s    r   pytest_load_initial_conftestsr4   <   r2   r-   T)hookwrapperc              #   0  #    U R                  S5      nU(       a  U(       a  UR                  O0 nU R                  n[        S0 UD6" U5      U l        [	        U SS5      nUb  SU R
                  ;  a  X@R
                  S'   Ub  SU R                  R                  ;  at  [        U R                  5      " U R                  R                  S-   U R                  R                  U R                  R                  U R                  R                  S9U l        Sv   g7f)zEApply LangSmith tracking to tests marked with @pytest.mark.langsmith.r	   _requestNrequest)r8   )argnamesinitialnamesnames_closurename2fixturedefsr   )get_closest_markerkwargsobjls_testgetattrfuncargs_fixtureinfor9   typer:   r;   r<   )itemmarkerr>   original_funcrequest_objs        r   pytest_runtest_callrI   A   s      $$[1F #)b$V$]3dJ5"y'E'2MM)$"y8I8I8R8R'R $T%6%6 7**33lB!..;;"//==!%!2!2!C!C	!D 
s   DDc                 2    UR                  S5      (       a  gg)z7Remove the short test-status character outputs ("./F").r   ) rK   rK   N)	getoption)reportr0   s     r   pytest_report_teststatusrN   Z   s    
 ,-- .r-   c                   V    \ rS rSrSrS rS rS rS rS r	S r
S	\4S
 jrS rS rSrg)LangSmithPluginc   z'Plugin for rendering LangSmith results.c                 ^   SSK Jn  SSKJn  [	        [
        5      U l        0 U l        0 U l        [        5       U l
        U" 5       U l        U" U R                  5       U R                  SS9U l        U R                  R                  5         U R                  R                  R                  S5        g)zInitialize.r   )Console)Live
   )consolerefresh_per_secondzCollecting tests...N)rich.consolerS   	rich.liverT   r   listtest_suitestest_suite_urlsprocess_statusr   status_lockrV   generate_tableslivestartprint)selfrS   rT   s      r   __init__LangSmithPlugin.__init__f   s    ("&t,! 6y  "DLLR
	 					 56r-   c                     [        5       U l        UR                   H(  nU R                  R                  UR                  5        M*     g)zHCall after collection phase is completed and session.items is populated.N)setcollected_nodeidsitemsaddnodeid)rc   sessionrE   s      r   pytest_collection_finish(LangSmithPlugin.pytest_collection_finishx   s2    !$MMD""&&t{{3 "r-   c                 @    U R                   U   R                  U5        g)z&Group a test case with its test suite.N)r[   append)rc   
test_suite
process_ids      r   add_process_to_test_suite)LangSmithPlugin.add_process_to_test_suite~   s    $++J7r-   c                 z   U R                   (       d%  U R                  R                  R                  S5        U R                     U R                   R                  U0 5      n[        UU/ SQS9U R                   U'   SSS5        U R                  R                  U R                  5       5        g! , (       d  f       N8= f)zUpdate test results.zRunning tests...)feedbackinputsreference_outputsoutputs)unpackN)	r]   r`   rV   rb   r^   get_merge_statusesupdater_   )rc   rr   statuscurrent_statuss       r   update_process_status%LangSmithPlugin.update_process_status   s     ""II##$67!0044ZDN.=M/D
+  			--/0 s   7B,,
B:c                 ,    U R                  USS05        g)z/Initialize live display when first test starts.r~   runningN)r   )rc   rk   s     r   pytest_runtest_logstart'LangSmithPlugin.pytest_runtest_logstart   s    ""6Hi+@Ar-   c                     SSK Jn  / nU R                   H%  nU R                  U5      nUR	                  U5        M'     U" U6 nU$ )u~   Generate a collection of tables—one per suite.

Returns a 'Group' object so it can be rendered simultaneously by Rich Live.
r   )Group)rX   r   r[   _generate_tablerp   )rc   r   tables
suite_nametabler   s         r   r_   LangSmithPlugin.generate_tables   sH    
 	'**J((4EMM%  + vr-   r   c                   ^ SSK Jn  U R                  U   nSU SU R                  U    S3nU" USS9nUR	                  S5        UR	                  S	5        UR	                  S
5        UR	                  S5        UR	                  S5        UR	                  S5        UR	                  S5        [        S5      n[        S5      n[        R                  " 5       n/ n	[        [        5      n
U Vs0 s H  oU R                  U   _M     nnUR                  5        H  u  pUR                  SU5      UR                  SU5      -
  nU	R                  U5        UR                  S0 5      R                  5        H;  u  nn[        U[        [        [         45      (       d  M(  X   R                  U5        M=     [#        [        US S35      U5      n[#        [        UR                  SS5      5      U5      nM     [%        S UR'                  5        5       5      n[%        S UR'                  5        5       5      nUU-   (       a   UUU-   -  nUS:X  a  SOSnSU SUS SU S3nOS nU	(       a  [%        U	5      [        U	5      -  S S3nOS!nU
(       a'  S"R)                  S# U
R                  5        5       5      nOS$n[#        U[        U5      5      nU R*                  R,                  Xg-   -
  S%-  m[#        TS&5      mUR                  5        GH>  u  pS'SSS(S).R                  UR                  SS5      S*5      nUR                  SU5      UR                  SU5      -
  nS"R)                  U4S+ jUR                  S0 5      R                  5        5       5      n[/        UR                  S,0 5      5      n[/        UR                  S-0 5      5      n[/        UR                  S.0 5      5      nUR1                  [3        [5        U5      TS/9[7        UTS/9[7        UTS/9[7        UTS/9T* S0 SU SUR                  SS5       SU S3UUS S35        GMA     UR1                  S1S1S1S1S1S1S15        UR1                  S2S1S1S1UUU5        U$ s  snf )3zGenerate results table.r   )TablezTest Suite: [bold]z$[/bold]
LangSmith URL: [bright_cyan]z[/bright_cyan]left)titletitle_justifyTestInputszRef outputsOutputsStatusFeedbackDurationr~   durationend_time
start_timerv   z.2fsqueuedc              3   H   #    U  H  oR                  S 5      S:H  v   M     g7f)r~   passedNr{   r   r   s     r   r    2LangSmithPlugin._generate_table.<locals>.<genexpr>        X@W155?h6@W    "c              3   H   #    U  H  oR                  S 5      S:H  v   M     g7f)r~   failedNr   r   s     r   r    r      r   r      greenred[]z.0%z[/z
Passed: --z--s
c              3   ^   #    U  H#  u  pU S [        U5      [        U5      -   3v   M%     g7f): N)sumlen)r   kvs      r   r    r      s.      +6Oda1#RAQ()6Os   +-z--      yellowcyan)r   r   r   skippedwhitec              3      >#    U  H6  u  p[        UTS 9 S[        U[        5      (       a  [        U5      OU 3v   M8     g7f)max_lenr   N)_abbreviate
isinstanceboolint)r   r   r   max_dynamic_col_widths      r   r    r      sD      !>DA q*?@AjYZ\`NaNaCFghCij>s   >Arw   rx   ry   r   NrK   z[bold]Averages[/bold])
rich.tabler   r[   r\   
add_columnr   timer   rZ   r]   ri   r{   rp   r   floatr   r   maxr   valuesjoinrV   width_dumps_with_fallbackadd_row_abbreviate_test_namestrr   )rc   r   r   process_idsr   r   
max_statusmax_durationnow	durationsnumeric_feedbackspidsuite_statusesr~   r   r   r   passed_countfailed_countratecoloraggregate_statusaggregate_durationaggregate_feedbackstatus_colorrv   rw   rx   ry   r   s                                @r   r   LangSmithPlugin._generate_table   sv   $&&z2&zl 3!11*=>nPE8 "'#"$$ ]
:iik	'-CNO;Ct22377;O)//1KCzz*c2VZZc5RRHX&

:r288:1a%d!344%(//2 ; shs^1#56ELSHh!?@*MJ 2 X@U@U@WXXX@U@U@WXX ,&<,#>?D#qyGeE!"5'4*BugQ?+$'	NS^$CC#H!J!&!% +6G6M6M6O+ " "&<-?)@A!%!3!3z7P!QVW W #$91 =)//1KC#!!	
 c&**Xx0':  zz*c2VZZc5RRHyy !"JJz26<<>! H *&**Xr*BCF 4

.3! +6::i+DEGMM%c#h8MNF,AB-7LMG-BC**+ L>6::h#A"B"\NRSTC."
% 2> 	b"b"b"b1#	
 ] Ps   +Q5c                 |    SUR                   l        UR                  R                  S5      nU(       a	  S Ul        gg)z9Disable warning reporting and show no warnings in output.Fzwarnings-pluginc                      g r   r   )r   r>   s     r   <lambda>2LangSmithPlugin.pytest_configure.<locals>.<lambda>  s    tr-   N)optionshowwarningspluginmanager
get_pluginwarning_summary)rc   r0   reporters      r   pytest_configure LangSmithPlugin.pytest_configure  s9     &+" ''223DE'CH$ r-   c                     U R                   R                  5         U R                   R                  R                  S5        g)z3Stop Rich Live rendering at the end of the session.z
Finishing up...N)r`   stoprV   rb   )rc   rl   s     r   pytest_sessionfinish$LangSmithPlugin.pytest_sessionfinish  s)    				 34r-   )rh   rV   r`   r]   r^   r\   r[   N)__name__
__module____qualname____firstlineno____doc__rd   rm   rs   r   r   r_   r   r   r   r   __static_attributes__r   r-   r   rP   rP   c   s>    17$481Bf# fPD5r-   rP   c                    U R                  SS5        U R                  S5      (       a  [        R                  R	                  S5      (       d  Sn[        U5      e[        R                  R                  S5      (       a  Sn[        U5      e[        R                  " 5       (       a  Sn[        U5      eU R                  R                  [        5       S	5        S
U R                  l        gg)z Register the 'langsmith' marker.markersz/langsmith: mark test to be tracked in LangSmithr   richzoMust have 'rich' installed to use --langsmith-output. Please install with: `pip install -U 'langsmith[pytest]'`PYTEST_XDIST_TESTRUNUIDzq--langsmith-output not supported with pytest-xdist. Please remove the '--langsmith-output' option or '-n' option.z--langsmith-output not supported when env varLANGSMITH_TEST_TRACKING='false'. Please remove the'--langsmith-output' option or enable test tracking.langsmith_output_pluginFN)addinivalue_linerL   	importlibutil	find_specr   osenvironr{   ls_utilstest_tracking_is_disabledr   registerrP   r   r   )r0   msgs     r   r   r     s    
D ,--~~''//L  S/!::>>344P  S/!--//+  S/!%%o&79RS%*"/ .r-   xr   returnc                 :    [        U 5      U:  a  U S US-
   S-   $ U $ )N   ...)r   )r  r   s     r   r   r   :  s)    
1v7Q;%''r-   	test_namec                     [        U 5      U:  aO  U R                  S5      u  p#[        SU-   5      U:  a  SX1S-
  * S  -   $ U[        SU-   5      -
  nSX$* S  -   S-   U-   $ U $ )Nz::z.py::r  r  z...::)r   split)r  r   filer   file_lens        r   r   r   A  s{    
9~__T*
w~(4A+ 0111S400tIJ''$.55r-   r}   currentrz   c                    U Hh  nU R                  US 5      =n(       d  M  UR                  U0 5      n[        U[        5      (       a  [        U[        5      (       a
  0 UEUEX'   Md  XAU'   Mj     0 UEU E$ r   )popr{   r   dict)r}   r  rz   pathpath_updatepath_currents         r   r|   r|   L  su     **T400;0";;tR0L+t,,L$1O1O ?< ?; ? +  !g   r-   r?   c                 P     [         R                  " U 5      $ ! [         a     gf = f)Nunserializable)jsondumps	Exception)r?   s    r   r   r   W  s'     zz#   s    
%%)*r   importlib.utilr   r  loggingr   r   collectionsr   	threadingr   typingr   pytestr	   r   r   langsmith.testing._internalr   r@   	getLoggerr   r   r   r,   __version__
startswithr1   r4   hookimplrI   rN   rP   r   r   r   r   r   r  rZ   r|   r   r   r-   r   <module>r#     s       	  #    ' 7			8	$
*! 
  &&""
 T"
 #
0  u5 u5p+>3   S 3 3 !D !4 !DI !$ ! c  c  r-   