ó
    lQjÀ4  ã                   óÔ  • S r SSKrSSKJs  J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  \
R4                  " \5      rS rS	 r\R>                  RA                  S
5      (       a  S r!OS r"\RF                  " SS9S 5       r$\RF                  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     ÚT/home/mande/repo/quber/.venv/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Ò"8˜3�$Ž;Ò"8ùó   ƒ)r   c              3   ó,   >#   • U  H	  oT;   v •  M     g 7fr   r   ©r   Úar   s     €r   r    r!   -   s   øé € Ð.¢g ˜–9¢gùr"   )ú-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Ó.×.Ñ.Ø�K‰K˜˜5Ô!äÔ=Ñ&<Ó=×=Ñ=Ø�K‰K˜˜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              #   ó²  #   • U R                  S5      nU(       Ga  U(       a  UR                  O0 n[        U SS5      nSU;  a   Ub   UR                  S5      nUb  0 UESU0EnU R                  n[        S	0 UD6" U5      U l        Ub  SU R                  ;  a  X0R                  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! [        R
                   a     Nïf = f7f)
zEApply LangSmith tracking to tests marked with @pytest.mark.langsmith.r	   Ú_requestNÚexperiment_metadataÚlangsmith_experiment_metadataÚrequest)r:   )ÚargnamesÚinitialnamesÚnames_closureÚname2fixturedefsr   )Úget_closest_markerÚkwargsÚgetattrÚgetfixturevalueÚpytestÚFixtureLookupErrorÚobjÚls_testÚfuncargsÚ_fixtureinfor;   Útyper<   r=   r>   )ÚitemÚmarkerr@   Úrequest_objr8   Úoriginal_funcs         r   Úpytest_runtest_callrN   A   sF  é € ð ×$Ñ$ [Ó1€Fßö #)�—’¨bˆô ˜d J°Ó5ˆØ ¨Ó.°;Ñ3JðØ&1×&AÑ&AØ3ó'Ð#ð 'Ñ2ØS ÐSÐ(=Ð?RÑS�Fð Ÿ™ˆÜÑ$˜VÒ$ ]Ó3ˆŒØÑ" y¸¿¹Ó'EØ'2�M‰M˜)Ñ$ØÑ" y¸×8IÑ8I×8RÑ8RÓ'Rä $ T×%6Ñ%6Ô 7Ø×*Ñ*×3Ñ3°lÑBØ!×.Ñ.×;Ñ;Ø"×/Ñ/×=Ñ=Ø!%×!2Ñ!2×!CÑ!Cñ	!ˆDÔô 
øô ×,Ñ,ó Ùðüs+   ‚AEÁD= Á$CEÄ=EÅEÅEÅEc                 ó2   • UR                  S5      (       a  gg)z7Remove the short test-status character outputs ("./F").r   )Ú rP   rP   N)Ú	getoption)Úreportr0   s     r   Úpytest_report_teststatusrS   e   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)ÚLangSmithPluginén   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.consolerX   Ú	rich.liverY   r   ÚlistÚtest_suitesÚtest_suite_urlsÚprocess_statusr   Ústatus_lockr[   Úgenerate_tablesÚliveÚstartÚprint)ÚselfrX   rY   s      r   Ú__init__ÚLangSmithPlugin.__init__q   s�   € å(Ý"ä&¤tÓ,ˆÔØ!ˆÔà ˆÔÜ›6ˆÔÙ“yˆŒáØ× Ñ Ó"¨D¯L©LÈRñ
ˆŒ	ð 	�	‰	�‰ÔØ�	‰	×Ñ×ÑÐ 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)rh   ÚsessionrJ   s      r   Úpytest_collection_finishÚ(LangSmithPlugin.pytest_collection_finishƒ   s2   € ä!$£ˆÔØ—M”MˆDØ×"Ñ"×&Ñ& t§{¡{Ö3ò "r-   c                 ó@   • U R                   U   R                  U5        g)z&Group a test case with its test suite.N)r`   Úappend)rh   Ú
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)	rb   re   r[   rg   rc   ÚgetÚ_merge_statusesÚupdaterd   )rh   rw   ÚstatusÚcurrent_statuss       r   Úupdate_process_statusÚ%LangSmithPlugin.update_process_status�   s�   € ð ×"×"Ø�I‰I×Ñ×#Ñ#Ð$6Ô7à×ÓØ!×0Ñ0×4Ñ4°ZÀÓDˆNÜ.=ØØÚ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…   )rh   rp   s     r   Úpytest_runtest_logstartÚ'LangSmithPlugin.pytest_runtest_logstartœ   s   € à×"Ñ" 6¨H°iÐ+@Õ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)r]   rŒ   r`   Ú_generate_tableru   )rh   rŒ   ÚtablesÚ
suite_nameÚtabler   s         r   rd   ÚLangSmithPlugin.generate_tables    sH   € õ
 	'àˆØ×*Ô*ˆJØ×(Ñ(¨Ó4ˆEØ�M‰M˜%Ö ñ +ñ �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  o»U R                  U   _M     nnUR                  5        HØ  u  p½U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  p½S'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_timer{   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Ò@W¸1Ÿ5™5 ›?¨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.   é € ð +Ú6O©d¨a�1�#�Rœ˜A›¤ Q£™Ð(Õ)Ò6Oùs   ‚+-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   øé € ð !â>‘D�Aô ˜qÐ*?Ñ@ÐAÀÌjÐYZÔ\`×NaÑNaÄCÈÄFÐghÐCiÕjÚ>ùs   ƒ>Ar|   r}   r~   r¾   NrP   z[bold]Averages[/bold])Ú
rich.tabler“   r`   ra   Ú
add_columnr´   Útimer   r_   rb   rn   r€   ru   rÁ   ÚfloatrÃ   rÂ   Úmaxr³   ÚvaluesÚjoinr[   ÚwidthÚ_dumps_with_fallbackÚadd_rowÚ_abbreviate_test_nameÚstrrÀ   )rh   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_colorr{   r|   r}   r~   rÄ   s                                @r   r�   ÚLangSmithPlugin._generate_table®   sv  ø€ å$à×&Ñ& zÑ2ˆà& z lð 3Ø!×1Ñ1°*Ñ=Ð>¸nðPˆá˜E°Ñ8ˆØ×Ñ˜Ô Ø×Ñ˜Ô"Ø×Ñ˜Ô'Ø×Ñ˜Ô#Ø×Ñ˜Ô"Ø×Ñ˜Ô$Ø×Ñ˜Ô$ô ˜“]ˆ
Ü˜:“ˆÜ�iŠi‹kˆØˆ	Ü'¬Ó-ÐáCNÓOÂ;¸C˜t×2Ñ2°3Ñ7Ò7Á;ˆÐOØ)×/Ñ/Ö1‰KˆCØ—z‘z *¨cÓ2°V·Z±ZÀÈcÓ5RÑRˆHØ×Ñ˜XÔ&ØŸ
™
 :¨rÓ2×8Ñ8Ö:‘��1Ü˜a¤%¬¬dÐ!3×4Ó4Ø%Ñ(×/Ñ/°Ö2ñ ;ô œs h¨s ^°1Ð#5Ó6¸ÓEˆLÜœS §¡¨H°hÓ!?Ó@À*ÓMŠJñ 2ô ÑXÀ×@UÑ@UÔ@WÓXÓXˆÜÑXÀ×@UÑ@UÔ@WÓXÓXˆð ˜,×&Ø <°,Ñ#>Ñ?ˆDØ# q›y‘G¨eˆEØ!" 5 '¨¨4°¨*°B°u°g¸QÐ?Ñà+ÐÞÜ$'¨	£N´S¸³^Ñ$CÀCÐ#HÈÐ!JÑà!&ÐÞØ!%§¡ñ +Ø6G×6MÑ6MÔ6Oó+ó "Ñð "&Ðä˜<¬Ð-?Ó)@ÓAˆØ!%§¡×!3Ñ!3°zÑ7PÑ!QÐVWÑ WÐÜ #Ð$9¸1Ó =Ðà)×/Ñ/×1‰KˆCà#Ø!ØØ!ñ	÷
 ‰c�&—*‘*˜X xÓ0°'Ó:ð ð —z‘z *¨cÓ2°V·Z±ZÀÈcÓ5RÑRˆHØ—y‘yô !à"ŸJ™J z°2Ó6×<Ñ<Ô>ó!ó ˆHô *¨&¯*©*°X¸rÓ*BÓCˆFÜ 4Ø—
‘
Ð.°Ó3ó!Ðô +¨6¯:©:°iÀÓ+DÓEˆGØ�M‰MÜ%¤c¨#£hÐ8MÑNÜ˜FÐ,AÑBÜÐ-Ð7LÑMÜ˜GÐ-BÑCØ*Ð*Ð+ðð �L�>  6§:¡:¨h¸Ó#AÐ"BÀ"À\ÀNÐRSÐ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)rh   r0   Úreporters      r   Úpytest_configureÚ LangSmithPlugin.pytest_configure  s9   € ð &+ˆ�‰Ô"ð ×'Ñ'×2Ñ2Ð3DÓEˆÞÙ'CˆHÕ$ð 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)re   Ústopr[   rg   )rh   rq   s     r   Úpytest_sessionfinishÚ$LangSmithPlugin.pytest_sessionfinish   s)   € à�	‰	�‰ÔØ�	‰	×Ñ×ÑÐ 3Õ4r-   )rm   r[   re   rb   rc   ra   r`   N)Ú__name__Ú
__module__Ú__qualname__Ú__firstlineno__Ú__doc__ri   rr   rx   r…   r‰   rd   rÐ   r�   rì   rð   Ú__static_attributes__r   r-   r   rU   rU   n   s>   † Ù1ò7ò$4ò8ò1òBòðf¨#ô fòPDõ5r-   rU   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_linerQ   Ú	importlibÚutilÚ	find_specr   ÚosÚenvironr€   Úls_utilsÚtest_tracking_is_disabledrè   ÚregisterrU   ræ   rç   )r0   Úmsgs     r   rì   rì   &  sÑ   € à
×ÑØÐDôð ×ÑÐ,×-Ñ-Ü�~‰~×'Ñ'¨×/Ñ/ðLð ô ˜S“/Ð!Ü�:‰:�>‰>Ð3×4Ñ4ðPð ô ˜S“/Ð!Ü×-Ò-×/Ñ/ð+ð ô ˜S“/Ð!Ø×Ñ×%Ñ%¤oÓ&7Ð9RÔSà%*ˆ�‰Õ"ð/ .r-   Úxr¿   Úreturnc                 ó:   • [        U 5      U:”  a  U S US-
   S-   $ U $ )Né   ú...)r´   )r  r¿   s     r   rÀ   rÀ   E  s)   € Ü
ˆ1ƒv�ÓØ��7˜Q‘;Ð %Ñ'Ð'àˆ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Ï   L  s{   € Ü
ˆ9ƒ~˜ÓØ—_‘_ TÓ*‰
ˆÜˆw˜‰~Ó Ó(Ø˜4¨A¡+ Ð 0Ð1Ñ1Ð1ØœS ¨4¡Ó0Ñ0ˆØ�t˜I˜JÐ'Ñ'¨$Ñ.°Ñ5Ð5àÐr-   r‚   Úcurrentr   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  r   ÚpathÚpath_updateÚpath_currents         r   r�   r�   W  su   € ÛˆØ Ÿ*™* T¨4Ó0Ð0ˆ;×0Ø"Ÿ;™; t¨RÓ0ˆLÜ˜+¤t×,Ñ,´¸LÌ$×1OÑ1OØ ? <Ð ?°;Ð ?�“à +˜“ñ ð !ˆgÐ ˜Ð Ð r-   rE   c                 óP   •  [         R                  " U 5      $ ! [         a     gf = f)NÚunserializable)ÚjsonÚdumpsÚ	Exception)rE   s    r   rÍ   rÍ   b  s'   € ð Ü�zŠz˜#‹ÐøÜó  Ùð ús   ‚ ˜
%¤%)0rö   ÚbuiltinsÚ@py_builtinsÚ_pytest.assertion.rewriteÚ	assertionÚrewriteÚ
@pytest_arÚimportlib.utilrþ   r  Úloggingr  rÇ   Úcollectionsr   Ú	threadingr   Útypingr   rC   r	   r   r  Úlangsmith.testing._internalr   rF   Ú	getLoggerrò   r   r   r,   Ú__version__Ú
startswithr1   r4   ÚhookimplrN   rS   rU   rì   rÐ   rÃ   rÀ   rÏ   r  r_   r�   rÍ   r   r-   r   Ú<module>r-     s  ðÙ ç  „ Ó Û Û Û 	Û Ý #Ý Ý ã å 'Ý 7à	×	Ò	˜8Ó	$€ò
ò*!ð 
×Ñ× Ñ  ×&Ñ&ó"ò"ð
 ‡‚˜TÑ"ñ 
ó #ð 
ðF ‡�ñó ð÷u5ñ u5òp+ð>�3ð  ð ¨ô ð Sð °3ð ¸3ô ð!˜Dð !¨4ð !¸DÀ¹Ið !È$ô !ð ˜cð   cõ  r-   