
    a
i4                        d Z ddlZddlZddlZddlZddlZddlmZ ddl	m
Z
 ddlmZ ddlZddlmZ ddlmZ  ej        e          Zd Zd	 Zej                            d
          rd Znd Z ej        d          d             Zej        d             Z G d d          Z d Z!de"de#de"fdZ$de"de#de"fdZ%de&de&de'e"         de&fdZ(dede"fdZ)dS ) zLangSmith Pytest hooks.    N)defaultdict)Lock)Any)utils)testc                     	 |                      dd          }|                    dddd           d	S # t          $ r t                              d           Y d	S w xY w)
zaSet 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     C:\Users\Dell Inspiron 16\Desktop\tws\AgrotaPowerBi\back-agrota-powerbi\mcp-client-agrota\venv\Lib\site-packages\langsmith/pytest_plugin.pypytest_addoptionr      s    

[99 :	 	 	
 	
 	
 	
 	
  
 
 
Q	
 	
 	
 	
 	
 	

s   /3 $AAc                 
    t           fddD                       rdt           fddD                       s                     dd           t           fddD                       s                     dd	           d
S d
S d
S )zHandle output arguments.c              3       K   | ]}|v V  	d S N ).0optargss     r   	<genexpr>z&_handle_output_args.<locals>.<genexpr>+   s'      
9
933$;
9
9
9
9
9
9    )r   c              3       K   | ]}|v V  	d S r   r   r   ar   s     r   r    z&_handle_output_args.<locals>.<genexpr>-   s'      ..19......r!   )-qqr   r%   c              3       K   | ]}|v V  	d S r   r   r#   s     r   r    z&_handle_output_args.<locals>.<genexpr>0   s'      ==19======r!   )-sz--capture=nor'   N)anyinsertr   s   `r   _handle_output_argsr+   )   s    

9
9
9
9"8
9
9
999 !....g..... 	"KK5!!!====&<===== 	!KK4     ! !
	! 	!r!   z7.c                 $    t          |           dS )zCCall immediately after command line options are parsed (pytest v7).Nr+   )configr   s     r   pytest_cmdline_preparser/   6       D!!!!!r!   c                 $    t          |            dS )zHandle args in pytest v8+.Nr-   r*   s    r   pytest_load_initial_conftestsr2   <   r0   r!   T)hookwrapperc              #     K   |                      d          }|r|r|j        ni }t          | dd          }d|vr8|6	 |                    d          }|i |d|i}n# t          j        $ r Y nw xY w| j        } t          d	i ||          | _        |d| j        vr
|| j        d<   |_d| j	        j
        vrQ t          | j	                  | j	        j
        dz   | j	        j        | j	        j        | j	        j                  | _	        dV  dS )
zEApply LangSmith tracking to tests marked with @pytest.mark.langsmith.r	   _requestNexperiment_metadatalangsmith_experiment_metadatarequest)r8   )argnamesinitialnamesnames_closurename2fixturedefsr   )get_closest_markerkwargsgetattrgetfixturevaluepytestFixtureLookupErrorobjls_testfuncargs_fixtureinfor9   typer:   r;   r<   )itemmarkerr>   request_objr6   original_funcs         r   pytest_runtest_callrL   A   sp      $$[11F  #)0b dJ55 ..;3J&1&A&A3' '# '2SS(=?RSSF,    $7$$V$$]33"y'E'E'2DM)$"y8I8R'R'R 7T%6 7 7*3lB!.;"/=!%!2!C	! ! !D 
EEEEEs   A A/.A/c                 4    |                     d          rdS dS )z7Remove the short test-status character outputs ("./F").r   ) rN   rN   N)	getoption)reportr.   s     r   pytest_report_teststatusrQ   e   s*    
 ,-- z r!   c                   N    e Zd ZdZd Zd Zd Zd Zd Zd Z	de
fd	Zd
 Zd ZdS )LangSmithPluginz'Plugin for rendering LangSmith results.c                 t   ddl m} ddlm} t	          t
                    | _        i | _        i | _        t                      | _
         |            | _         ||                                 | j        d          | _        | j                                         | j        j                            d           dS )zInitialize.r   )Console)Live
   )consolerefresh_per_secondzCollecting tests...N)rich.consolerU   	rich.liverV   r   listtest_suitestest_suite_urlsprocess_statusr   status_lockrX   generate_tableslivestartprint)selfrU   rV   s      r   __init__zLangSmithPlugin.__init__q   s    ((((((""""""&t,,! 66wyyD  ""DLR
 
 
	 			 566666r!   c                 ~    t                      | _        |j        D ]!}| j                            |j                   "dS )zHCall after collection phase is completed and session.items is populated.N)setcollected_nodeidsitemsaddnodeid)re   sessionrH   s      r   pytest_collection_finishz(LangSmithPlugin.pytest_collection_finish   sE    !$M 	4 	4D"&&t{3333	4 	4r!   c                 F    | j         |                             |           dS )z&Group a test case with its test suite.N)r]   append)re   
test_suite
process_ids      r   add_process_to_test_suitez)LangSmithPlugin.add_process_to_test_suite   s$    $++J77777r!   c                 V   | j         s| j        j                            d           | j        5  | j                             |i           }t          ||g d          | j         |<   ddd           n# 1 swxY w Y   | j                            |                                            dS )zUpdate test results.zRunning tests...)feedbackinputsreference_outputsoutputs)unpackN)	r_   rb   rX   rd   r`   get_merge_statusesupdatera   )re   rr   statuscurrent_statuss       r   update_process_statusz%LangSmithPlugin.update_process_status   s     " 	8I##$6777 	 	!044ZDDN.=MMM/ / /D
+	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 		--//00000s   8A22A69A6c                 6    |                      |ddi           dS )z/Initialize live display when first test starts.r}   runningN)r   )re   rl   s     r   pytest_runtest_logstartz'LangSmithPlugin.pytest_runtest_logstart   s#    ""6Hi+@AAAAAr!   c                     ddl m} g }| j        D ],}|                     |          }|                    |           - || }|S )u   Generate a collection of tables—one per suite.

        Returns a 'Group' object so it can be rendered simultaneously by Rich Live.
        r   )Group)rZ   r   r]   _generate_tablerp   )re   r   tables
suite_nametabler   s         r   ra   zLangSmithPlugin.generate_tables   se    
 	'&&&&&* 	! 	!J((44EMM%    vr!   r   c                 
    ddl m}  j        |         }d| d j        |          d} ||d          }|                    d           |                    d	           |                    d
           |                    d           |                    d           |                    d           |                    d           t          d          }t          d          }t          j                    }g }	t          t                    }
 fd|D             }|	                                D ]\  }}|
                    d|          |
                    d|          z
  }|	                    |           |
                    di           	                                D ]B\  }}t          |t          t          t          f          r|
|                             |           Ct!          t          |dd          |          }t!          t          |
                    dd                    |          }t#          d |                                D                       }t#          d |                                D                       }||z   r |||z   z  }|dk    rdnd}d| d|dd | d}nd!}|	r$t#          |	          t          |	          z  dd}nd"}|
r2d#                    d$ |
	                                D                       }nd%}t!          |t          |                    } j        j        ||z   z
  d&z  t!          d'          |	                                D ]\  }}d(ddd)d*
                    |
                    dd          d+          }|
                    d|          |
                    d|          z
  }d#                    fd,|
                    di           	                                D                       }t-          |
                    d-i                     }t-          |
                    d.i                     }t-          |
                    d/i                     }|                    t1          t3          |          0          t5          |0          t5          |0          t5          |0           d1         d| d|
                    dd           d | d||dd           |                    d2d2d2d2d2d2d2           |                    d3d2d2d2|||           |S )4z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}   durationc                 ,    i | ]}|j         |         S r   )r_   )r   pidre   s     r   
<dictcomp>z3LangSmithPlugin._generate_table.<locals>.<dictcomp>   s#    OOOC#t237OOOr!   end_time
start_timeru   z.2fsqueuedc              3   H   K   | ]}|                     d           dk    V  dS )r}   passedNrz   r   r   s     r   r    z2LangSmithPlugin._generate_table.<locals>.<genexpr>   1      XX1155??h6XXXXXXr!   c              3   H   K   | ]}|                     d           dk    V  dS )r}   failedNr   r   s     r   r    z2LangSmithPlugin._generate_table.<locals>.<genexpr>   r   r!      greenred[]z.0%z[/z
Passed: --z--s
c              3   d   K   | ]+\  }}| d t          |          t          |          z   V  ,dS ): N)sumlen)r   kvs      r   r    z2LangSmithPlugin._generate_table.<locals>.<genexpr>   sU       + +.2a1))AQ))+ + + + + +r!   z--      yellowcyan)r   r   r   skippedwhitec              3      K   | ]A\  }}t          |            dt          |t                    rt          |          n| V  BdS )max_lenr   N)_abbreviate
isinstanceboolint)r   r   r   max_dynamic_col_widths      r   r    z2LangSmithPlugin._generate_table.<locals>.<genexpr>   ss       ! !Aq q*?@@@jjjYZ\`NaNaDhCFFFghjj! ! ! ! ! !r!   rv   rw   rx   r   NrN   z[bold]Averages[/bold])
rich.tabler   r]   r^   
add_columnr   timer   r\   rj   rz   rp   r   floatr   r   maxr   valuesjoinrX   width_dumps_with_fallbackadd_row_abbreviate_test_namestrr   )re   r   r   process_idsr   r   
max_statusmax_durationnow	durationsnumeric_feedbackssuite_statusesr   r}   r   r   r   passed_countfailed_countratecoloraggregate_statusaggregate_durationaggregate_feedbackstatus_colorru   rv   rw   rx   r   s   `                            @r   r   zLangSmithPlugin._generate_table   s   $$$$$$&z2Pz P P!1*=P P PE888   """'''###"""$$$$$$ ]]
:ikk	'--OOOO;OOO)//11 	N 	NKCzz*c22VZZc5R5RRHX&&&

:r2288:: 3 31a%d!344 3%a(//222sh#5#5#5#566EELSHh!?!?@@*MMJJXX@U@U@W@WXXXXXXX@U@U@W@WXXXXX ,& 	,<,#>?D#qyyGGeE?5??4???u???+ 	'$'	NNS^^$C!J!J!J!J!& 	&!% + +6G6M6M6O6O+ + + " " "&<-?)@)@AA!%!3zL7P!QVW W #$91 = =)//11 	 	KC#!!	 
 c&**Xx00'::  zz*c22VZZc5R5RRHyy ! ! ! !"JJz266<<>>! ! !  H *&**Xr*B*BCCF 4

.33! ! +6::i+D+DEEGMM%c#hh8MNNNF,ABBB-7LMMMG-BCCC**++ ULTT6::h#A#ATT\TTT""""
 
 
 
 	b"b"b"b111#	
 	
 	
 r!   c                 j    d|j         _        |j                            d          }|r
d |_        dS dS )z9Disable warning reporting and show no warnings in output.Fzwarnings-pluginc                      d S r   r   )r   r>   s     r   <lambda>z2LangSmithPlugin.pytest_configure.<locals>.<lambda>  s    t r!   N)optionshowwarningspluginmanager
get_pluginwarning_summary)re   r.   reporters      r   pytest_configurez LangSmithPlugin.pytest_configure  sM     &+" '223DEE 	D'C'CH$$$	D 	Dr!   c                 v    | j                                          | j         j                            d           dS )z3Stop Rich Live rendering at the end of the session.z
Finishing up...N)rb   stoprX   rd   )re   rm   s     r   pytest_sessionfinishz$LangSmithPlugin.pytest_sessionfinish   s4    		 344444r!   N)__name__
__module____qualname____doc__rf   rn   rs   r   r   ra   r   r   r   r   r   r!   r   rS   rS   n   s        117 7 7$4 4 48 8 81 1 1B B B  f# f f f fPD D D5 5 5 5 5r!   rS   c                    |                      dd           |                     d          rt          j                            d          sd}t          |          t          j                            d          rd}t          |          t          j
                    rd}t          |          | j                            t                      d	           d
| j        _        dS dS )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_linerO   	importlibutil	find_specr   osenvironrz   ls_utilstest_tracking_is_disabledr   registerrS   r   r   )r.   msgs     r   r   r   &  s    
D   ,-- +~''// 	"L  S//!:>>344 	"P  S//!-// 	"+  S//!%%o&7&79RSSS%*"""/+ +r!   xr   returnc                 L    t          |           |k    r| d |dz
           dz   S | S )N   ...)r   )r   r   s     r   r   r   E  s0    
1vv7Q;%''r!   	test_namec                     t          |           |k    rh|                     d          \  }}t          d|z             |k    rd||dz
   d          z   S |t          d|z             z
  }d|| d          z   dz   |z   S | S )Nz::z.py::r   r   z...::)r   split)r   r   filer   file_lens        r   r   r   L  s    
9~~__T**
dw~((4'A+ 0 0111S4000tXIJJ''$.55r!   r|   currentry   c                    |D ]i}|                      |d           x}rO|                    |i           }t          |t                    rt          |t                    r
i ||||<   d|||<   ji || S r   )poprz   r   dict)r|   r  ry   pathpath_updatepath_currents         r   r{   r{   W  s     , , **T4000; 	,";;tR00L+t,, ,L$1O1O , ?< ?; ? + g   r!   rC   c                 N    	 t          j        |           S # t          $ r Y dS w xY w)Nunserializable)jsondumps	Exception)rC   s    r   r   r   b  s9     z#       s    
$$)*r   importlib.utilr   r  loggingr   r   collectionsr   	threadingr   typingr   rA   r	   r   r   langsmith.testing._internalr   rD   	getLoggerr   r   r   r+   __version__
startswithr/   r2   hookimplrL   rQ   rS   r   r   r   r   r   r  r\   r{   r   r   r!   r   <module>r     sG           				  # # # # # #              ' ' ' ' ' ' 7 7 7 7 7 7		8	$	$
 
 
*! ! ! 
  && 
"" " " "" " "
 T""" 
  
 #" 
F   u5 u5 u5 u5 u5 u5 u5 u5p+ + +>3      S 3 3    !D !4 !DI !$ ! ! ! ! c  c            r!   