Ë
    ÂXÕiÀ4  ã                   ó®  — 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j2                  j5                  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)y) zLangSmith Pytest hooks.é    N)Údefaultdict)ÚLock)ÚAny)Úutils)Útestc                 óœ   — 	 | j                  dd«      }|j                  dddd¬«       y	# t        $ r t        j	                  d«       Y y	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/root/rosshost/parking-map/parking-api/venv/lib/python3.12/site-packages/langsmith/pytest_plugin.pyÚpytest_addoptionr      sT   € ð

à—‘ ¨[Ó9ˆØ�‰Ø ØØØ:ð	 	õ 	
øô ò 
ä�‰ØQö	
ð
ús   ‚'* ªAÁ
Ac                 óÊ   ‡ — t        ˆ fd„dD «       «      rNt        ˆ fd„dD «       «      s‰ j                  dd«       t        ˆ fd„dD «       «      s‰ j                  dd	«       y
y
y
)zHandle output arguments.c              3   ó&   •K  — | ]  }|‰v –— Œ
 y ­w©N© )Ú.0ÚoptÚargss     €r   ú	<genexpr>z&_handle_output_args.<locals>.<genexpr>+   s   øè ø€ Ò
9˜3ˆ3�$Œ;Ñ
9ùó   ƒ)r   c              3   ó&   •K  — | ]  }|‰v –— Œ
 y ­wr   r   ©r   Úar   s     €r   r    z&_handle_output_args.<locals>.<genexpr>-   s   øè ø€ Ò. �1˜”9Ñ.ùr!   )ú-qqr   r%   c              3   ó&   •K  — | ]  }|‰v –— Œ
 y ­w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+   )   sU   ø€ ä
Ó
9Ð"8Ô
9Ô9äÓ. gÔ.Ô.Ø�K‰K˜˜5Ô!äÓ=Ð&<Ô=Ô=Ø�K‰K˜˜4Õ ð >ð :ó    z7.c                 ó   — t        |«       y)zCCall immediately after command line options are parsed (pytest v7).N©r+   )Úconfigr   s     r   Úpytest_cmdline_preparser0   6   ó
   € ä˜DÕ!r,   c                 ó   — t        | «       y)zHandle args in pytest v8+.Nr.   r*   s    r   Úpytest_load_initial_conftestsr3   <   r1   r,   T)Úhookwrapperc              #   ó�  K  — | j                  d«      }|�r|r|j                  ni }t        | dd«      }d|vr|�	 |j                  d«      }|�i |¥d|i¥}| j                  } t        d	i |¤Ž|«      | _        |�d| j                  vr|| j                  d<   |��d| j                  j                  vrw t        | j                  «      | j                  j                  dz   | j                  j                  | j                  j                  | j                  j                  ¬«      | _	        d–— y# t        j
                  $ r Y Œìw xY w­w)
zEApply LangSmith tracking to tests marked with @pytest.mark.langsmith.r	   Ú_requestNÚexperiment_metadataÚlangsmith_experiment_metadataÚrequest)r9   )ÚargnamesÚinitialnamesÚnames_closureÚname2fixturedefsr   )Úget_closest_markerÚkwargsÚgetattrÚgetfixturevalueÚpytestÚFixtureLookupErrorÚobjÚls_testÚfuncargsÚ_fixtureinfor:   Útyper;   r<   r=   )ÚitemÚmarkerr?   Úrequest_objr7   Úoriginal_funcs         r   Úpytest_runtest_callrM   A   sM  è ø€ ð ×$Ñ$ [Ó1€FÚñ #)�—’¨bˆô ˜d J°Ó5ˆØ ¨Ñ.°;Ð3JðØ&1×&AÑ&AØ3ó'Ð#ð 'Ð2ØS ÐSÐ(=Ð?RÑS�Fð Ÿ™ˆØ$”7Ñ$˜VÑ$ ]Ó3ˆŒØÐ" y¸¿¹Ñ'EØ'2ˆD�M‰M˜)Ñ$ØÐ" y¸×8IÑ8I×8RÑ8RÑ'Rà 7¤ T×%6Ñ%6Ó 7Ø×*Ñ*×3Ñ3°lÑBØ!×.Ñ.×;Ñ;Ø"×/Ñ/×=Ñ=Ø!%×!2Ñ!2×!CÑ!Cô	!ˆDÔô 
øô ×,Ñ,ò Ùðüs)   ‚8E»D- ÁCEÄ-EÅ EÅEÅEc                 ó(   — |j                  d«      ryy)z7Remove the short test-status character outputs ("./F").r   )Ú rO   rO   N)Ú	getoption)Úreportr/   s     r   Úpytest_report_teststatusrR   e   s   € ð
 ×ÑÐ,Ô-Øð .r,   c                   óL   — 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y)ÚLangSmithPluginz'Plugin for rendering LangSmith results.c                 ód  — ddl m} ddlm} t	        t
        «      | _        i | _        i | _        t        «       | _
         |«       | _         || j                  «       | j                  d¬«      | _        | j                  j                  «        | j                  j                  j                  d«       y)zInitialize.r   )ÚConsole)ÚLiveé
   )ÚconsoleÚrefresh_per_secondzCollecting tests...N)Úrich.consolerV   Ú	rich.liverW   r   ÚlistÚtest_suitesÚtest_suite_urlsÚprocess_statusr   Ústatus_lockrY   Úgenerate_tablesÚliveÚstartÚprint)ÚselfrV   rW   s      r   Ú__init__zLangSmithPlugin.__init__q   s�   € å(Ý"ä&¤tÓ,ˆÔØ!ˆÔà ˆÔÜ›6ˆÔÙ“yˆŒáØ× Ñ Ó"¨D¯L©LÈRô
ˆŒ	ð 	�	‰	�‰ÔØ�	‰	×Ñ×ÑÐ 5Õ6r,   c                 óŽ   — t        «       | _        |j                  D ]'  }| j                  j                  |j                  «       Œ) y)zHCall after collection phase is completed and session.items is populated.N)ÚsetÚcollected_nodeidsÚitemsÚaddÚnodeid)rf   ÚsessionrI   s      r   Úpytest_collection_finishz(LangSmithPlugin.pytest_collection_finishƒ   s7   € ä!$£ˆÔØ—M‘Mò 	4ˆDØ×"Ñ"×&Ñ& t§{¡{Õ3ñ	4r,   c                 ó@   — | j                   |   j                  |«       y)z&Group a test case with its test suite.N)r^   Úappend)rf   Ú
test_suiteÚ
process_ids      r   Úadd_process_to_test_suitez)LangSmithPlugin.add_process_to_test_suite‰   s   € à×Ñ˜Ñ$×+Ñ+¨JÕ7r,   c                 ól  — | j                   s%| j                  j                  j                  d«       | j                  5  | j                   j                  |i «      }t        ||g d¢¬«      | j                   |<   ddd«       | j                  j                  | j                  «       «       y# 1 sw Y   Œ3xY w)zUpdate test results.zRunning tests...)ÚfeedbackÚinputsÚreference_outputsÚoutputs)ÚunpackN)	r`   rc   rY   re   ra   ÚgetÚ_merge_statusesÚupdaterb   )rf   rs   ÚstatusÚcurrent_statuss       r   Úupdate_process_statusz%LangSmithPlugin.update_process_status�   s—   € ð ×"Ò"Ø�I‰I×Ñ×#Ñ#Ð$6Ô7à×Ññ 	Ø!×0Ñ0×4Ñ4°ZÀÓDˆNÜ.=ØØÚMô/ˆD×Ñ 
Ñ+÷	ð 	�	‰	×Ñ˜×-Ñ-Ó/Õ0÷	ð 	ús   ¾:B*Â*B3c                 ó,   — | j                  |ddi«       y)z/Initialize live display when first test starts.r~   ÚrunningN)r€   )rf   rm   s     r   Úpytest_runtest_logstartz'LangSmithPlugin.pytest_runtest_logstartœ   s   € à×"Ñ" 6¨H°iÐ+@ÕAr,   c                 ó†   — ddl m} g }| j                  D ]$  }| j                  |«      }|j	                  |«       Œ&  ||Ž }|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)r[   r…   r^   Ú_generate_tablerq   )rf   r…   ÚtablesÚ
suite_nameÚtabler   s         r   rb   zLangSmithPlugin.generate_tables    sM   € õ
 	'àˆØ×*Ñ*ò 	!ˆJØ×(Ñ(¨Ó4ˆEØ�M‰M˜%Õ ð	!ñ �v�ˆØˆr,   rˆ   c                 óÚ  ‡— ddl m} | j                  |   }d|› d| j                  |   › d�} ||d¬«      }|j	                  d«       |j	                  d	«       |j	                  d
«       |j	                  d«       |j	                  d«       |j	                  d«       |j	                  d«       t        d«      }t        d«      }t        j                  «       }g }	t        t        «      }
|D �ci c]  }|| j                  |   “Œ }}|j                  «       D ]Ñ  \  }}|j                  d|«      |j                  d|«      z
  }|	j                  |«       |j                  di «      j                  «       D ]5  \  }}t        |t        t        t         f«      sŒ"|
|   j                  |«       Œ7 t#        t        |d›d�«      |«      }t#        t        |j                  dd«      «      |«      }ŒÓ t%        d„ |j'                  «       D «       «      }t%        d„ |j'                  «       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!}|
r'd"j)                  d#„ |
j                  «       D «       «      }nd$}t#        |t        |«      «      }| j*                  j,                  ||z   z
  d%z  Št#        ‰d&«      Š|j                  «       D �]I  \  }}d'ddd(d)œj                  |j                  dd«      d*«      }|j                  d|«      |j                  d|«      z
  }d"j)                  ˆfd+„|j                  di «      j                  «       D «       «      }t/        |j                  d,i «      «      }t/        |j                  d-i «      «      }t/        |j                  d.i «      «      }|j1                  t3        t5        |«      ‰¬/«      t7        |‰¬/«      t7        |‰¬/«      t7        |‰¬/«      ‰ d0 d|› d|j                  dd«      › d|› d�||d›d�«       �ŒL |j1                  d1d1d1d1d1d1d1«       |j1                  d2d1d1d1|||«       |S c c}w )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   óD   K  — | ]  }|j                  d «      dk(  –— Œ y­w)r~   ÚpassedN©r{   ©r   r˜   s     r   r    z2LangSmithPlugin._generate_table.<locals>.<genexpr>Ð   ó   è ø€ ÒX¸1˜1Ÿ5™5 ›?¨hÕ6ÑXùó   ‚ c              3   óD   K  — | ]  }|j                  d «      dk(  –— Œ y­w)r~   ÚfailedNrœ   r�   s     r   r    z2LangSmithPlugin._generate_table.<locals>.<genexpr>Ñ   rž   rŸ   é   ÚgreenÚredú[ú]z.0%z[/z
Passed: --z--sú
c              3   óZ   K  — | ]#  \  }}|› d t        |«      t        |«      z  › �–— Œ% y­w)ú: N)ÚsumÚlen)r   ÚkÚvs      r   r    z2LangSmithPlugin._generate_table.<locals>.<genexpr>ß   s1   è ø€ ò +Ù.2¨a°�1�#�Rœ˜A›¤ Q£™Ð(Ô)ñ+ùs   ‚)+z--é   é   ÚyellowÚcyan)r‚   r›   r¡   ÚskippedÚwhitec              3   ó~   •K  — | ]4  \  }}t        |‰¬ «      › dt        |t        «      rt        |«      n|› �–— Œ6 y­w)©Úmax_lenr©   N)Ú_abbreviateÚ
isinstanceÚboolÚint)r   r¬   r­   Úmax_dynamic_col_widths      €r   r    z2LangSmithPlugin._generate_table.<locals>.<genexpr>ò   sD   øè ø€ ò !á�A�qô ˜qÐ*?Ô@ÐAÀÌjÐYZÔ\`ÔNaÄCÈÄFÐghÐCiÔjñ!ùs   ƒ:=rw   rx   ry   rµ   NrO   z[bold]Averages[/bold])Ú
rich.tabler‹   r^   r_   Ú
add_columnr«   Útimer   r]   r`   rk   r{   rq   r¸   Úfloatrº   r¹   Úmaxrª   ÚvaluesÚjoinrY   ÚwidthÚ_dumps_with_fallbackÚadd_rowÚ_abbreviate_test_nameÚstrr·   )rf   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†   zLangSmithPlugin._generate_table®   s�  ø€ å$à×&Ñ& zÑ2ˆà& z lð 3Ø!×1Ñ1°*Ñ=Ð>¸nðPˆá˜E°Ô8ˆØ×Ñ˜Ô Ø×Ñ˜Ô"Ø×Ñ˜Ô'Ø×Ñ˜Ô#Ø×Ñ˜Ô"Ø×Ñ˜Ô$Ø×Ñ˜Ô$ô ˜“]ˆ
Ü˜:“ˆÜ�i‰i‹kˆØˆ	Ü'¬Ó-ÐàCNÖO¸C˜#˜t×2Ñ2°3Ñ7Ñ7ÐOˆÐOØ)×/Ñ/Ó1ò 	N‰KˆC�Ø—z‘z *¨cÓ2°V·Z±ZÀÈcÓ5RÑRˆHØ×Ñ˜XÔ&ØŸ
™
 :¨rÓ2×8Ñ8Ó:ò 3‘��1Ü˜a¤%¬¬dÐ!3Õ4Ø% aÑ(×/Ñ/°Õ2ð3ô œs h¨s ^°1Ð#5Ó6¸ÓEˆLÜœS §¡¨H°hÓ!?Ó@À*ÓM‰Jð	Nô Ñ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ÀLÑ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�. Ð"ö
ð%	ð> 	�‰�b˜"˜b " b¨"¨bÔ1à�‰Ø#ØØØØØØô	
ð ˆùò] Ps   Ã-Q(c                 ór   — d|j                   _        |j                  j                  d«      }|r	d„ |_        yy)z9Disable warning reporting and show no warnings in output.Fzwarnings-pluginc                   ó   — y r   r   )r   r?   s     r   ú<lambda>z2LangSmithPlugin.pytest_configure.<locals>.<lambda>  s   � r,   N)ÚoptionÚshowwarningsÚpluginmanagerÚ
get_pluginÚwarning_summary)rf   r/   Úreporters      r   Úpytest_configurez LangSmithPlugin.pytest_configure  s9   € ð &+ˆ�‰Ô"ð ×'Ñ'×2Ñ2Ð3DÓEˆÙÙ'CˆHÕ$ð r,   c                 ó‚   — | j                   j                  «        | j                   j                  j                  d«       y)z3Stop Rich Live rendering at the end of the session.z
Finishing up...N)rc   ÚstoprY   re   )rf   rn   s     r   Úpytest_sessionfinishz$LangSmithPlugin.pytest_sessionfinish   s)   € à�	‰	�‰ÔØ�	‰	×Ñ×ÑÐ 3Õ4r,   N)Ú__name__Ú
__module__Ú__qualname__Ú__doc__rg   ro   rt   r€   rƒ   rb   rÇ   r†   rá   rä   r   r,   r   rT   rT   n   s>   „ Ù1ò7ò$4ò8ò1òBòðf¨#ó fòPDó5r,   rT   c                 ó¨  — | j                  dd«       | j                  d«      r¯t        j                  j	                  d«      sd}t        |«      ‚t        j                  j                  d«      rd}t        |«      ‚t        j                  «       rd}t        |«      ‚| j                  j                  t        «       d	«       d
| j                  _        yy)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_linerP   Ú	importlibÚutilÚ	find_specr   ÚosÚenvironr{   Úls_utilsÚtest_tracking_is_disabledrÝ   ÚregisterrT   rÛ   rÜ   )r/   Úmsgs     r   rá   rá   &  sÅ   € à
×ÑØÐDôð ×ÑÐ,Ô-Ü�~‰~×'Ñ'¨Ô/ðLð ô ˜S“/Ð!Ü�:‰:�>‰>Ð3Ô4ðPð ô ˜S“/Ð!Ü×-Ñ-Ô/ð+ð ô ˜S“/Ð!Ø×Ñ×%Ñ%¤oÓ&7Ð9RÔSà%*ˆ�‰Õ"ð/ .r,   Úxr¶   Úreturnc                 ó8   — t        | «      |kD  r| d |dz
   dz   S | S )Né   ú...)r«   )rø   r¶   s     r   r·   r·   E  s)   € Ü
ˆ1ƒv�ÒØ��7˜Q‘;Ð %Ñ'Ð'àˆr,   Ú	test_namec                 óÄ   — t        | «      |kD  rQ| j                  d«      \  }}t        d|z   «      |kD  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Ð1Ñ1Ð1ØœS ¨4¡Ó0Ñ0ˆØ�t˜X˜I˜JÐ'Ñ'¨$Ñ.°Ñ5Ð5àÐr,   r}   Úcurrentrz   c                óÈ   — |D ]X  }| j                  |d «      x}sŒ|j                  |i «      }t        |t        «      rt        |t        «      r
i |¥|¥||<   ŒT|||<   ŒZ i |¥| ¥S r   )Úpopr{   r¸   Údict)r}   r  rz   ÚpathÚpath_updateÚpath_currents         r   r|   r|   W  sx   € Øò ,ˆØ Ÿ*™* T¨4Ó0Ð0ˆ;Ñ0Ø"Ÿ;™; t¨RÓ0ˆLÜ˜+¤tÔ,´¸LÌ$Ô1OØ ? <Ð ?°;Ð ?�˜’à +�˜’ð,ð !ˆgÐ ˜Ð Ð r,   rD   c                 óL   — 	 t        j                  | «      S # t        $ r Y yw xY w)NÚunserializable)ÚjsonÚdumpsÚ	Exception)rD   s    r   rÄ   rÄ   b  s'   € ð Ü�z‰z˜#‹ÐøÜò  Ùð ús   ‚ —	#¢#)*rè   Úimportlib.utilrï   r  Úloggingrò   r¾   Úcollectionsr   Ú	threadingr   Útypingr   rB   r	   r   rô   Úlangsmith.testing._internalr   rE   Ú	getLoggerrå   r   r   r+   Ú__version__Ú
startswithr0   r3   ÚhookimplrM   rR   rT   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,   