
    	h2                        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     d/var/www/html/web-builder-api.evdpl.com/venv/lib/python3.11/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 }| j        } t          di ||          | _        t	          | dd          }|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request)r6   )argnamesinitialnamesnames_closurename2fixturedefsr   )get_closest_markerkwargsobjls_testgetattrfuncargs_fixtureinfor7   typer8   r9   r:   )itemmarkerr<   original_funcrequest_objs        r   pytest_runtest_callrG   A   s       $$[11F  #)0b$7$$V$$]33dJ55"y'E'E'2DM)$"y8I8R'R'R 7T%6 7 7*3lB!.;"/=!%!2!C	! ! !D 
EEEEEr!   c                 4    |                     d          rdS dS )z7Remove the short test-status character outputs ("./F").r   ) rI   rI   N)	getoption)reportr.   s     r   pytest_report_teststatusrL   Z   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.consolerP   	rich.liverQ   r   listtest_suitestest_suite_urlsprocess_statusr   status_lockrS   generate_tableslivestartprint)selfrP   rQ   s      r   __init__zLangSmithPlugin.__init__f   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)r`   sessionrC   s      r   pytest_collection_finishz(LangSmithPlugin.pytest_collection_finishx   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)rX   append)r`   
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)	rZ   r]   rS   r_   r[   get_merge_statusesupdater\   )r`   rm   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.rx   runningN)rz   )r`   rg   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)rU   r   rX   _generate_tablerk   )r`   r   tables
suite_nametabler   s         r   r\   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Durationrx   durationc                 ,    i | ]}|j         |         S r   )rZ   )r   pidr`   s     r   
<dictcomp>z3LangSmithPlugin._generate_table.<locals>.<dictcomp>   s#    OOOC#t237OOOr!   end_time
start_timerp   z.2fsqueuedc              3   H   K   | ]}|                     d           dk    V  dS )rx   passedNru   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 )rx   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!   rq   rr   rs   r   NrI   z[bold]Averages[/bold])
rich.tabler   rX   rY   
add_columnr   timer   rW   re   ru   rk   r   floatr   r   maxr   valuesjoinrS   width_dumps_with_fallbackadd_row_abbreviate_test_namestrr   )r`   r   r   process_idsr   r   
max_statusmax_durationnow	durationsnumeric_feedbackssuite_statusesr   rx   r   r   r   passed_countfailed_countratecoloraggregate_statusaggregate_durationaggregate_feedbackstatus_colorrp   rq   rr   rs   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)r`   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)r]   stoprS   r_   )r`   rh   s     r   pytest_sessionfinishz$LangSmithPlugin.pytest_sessionfinish  s4    		 344444r!   N)__name__
__module____qualname____doc__ra   ri   rn   rz   r}   r\   r   r   r   r   r   r!   r   rN   rN   c   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!   rN   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_linerJ   	importlibutil	find_specr   osenvironru   ls_utilstest_tracking_is_disabledr   registerrN   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   :  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   A  s    
9~~__T**
dw~((4'A+ 0 0111S4000tXIJJ''$.55r!   rw   currentrt   c                    |D ]i}|                      |d           x}rO|                    |i           }t          |t                    rt          |t                    r
i ||||<   d|||<   ji || S r   )popru   r   dict)rw   r   rt   pathpath_updatepath_currents         r   rv   rv   L  s     , , **T4000; 	,";;tR00L+t,, ,L$1O1O , ?< ?; ? + g   r!   r=   c                 N    	 t          j        |           S # t          $ r Y dS w xY w)Nunserializable)jsondumps	Exception)r=   s    r   r   r   W  s9     z#       s    
$$)*r   importlib.utilr   r  loggingr   r   collectionsr   	threadingr   typingr   pytestr	   r   r   langsmith.testing._internalr   r>   	getLoggerr   r   r   r+   __version__
startswithr/   r2   hookimplrG   rL   rN   r   r   r   r   r   r   rW   rv   r   r   r!   r   <module>r     sF           				  # # # # # #              ' ' ' ' ' ' 7 7 7 7 7 7		8	$	$
 
 
*! ! ! 
  && 
"" " " "" " "
 T"""
 
 #"
0   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!   