ó
    Ð]jV  ã                  óˆ  • % S r SSKJr  SSKrSSKJs  Jr  SSK	r	SSK
Jr  SSKJrJr  SSKJr  \(       a  SSKrSSKJrJr   SSKr\R*                  " 5       rS\S	'   \R*                  " 5       rS
\S'   \R*                  " 5       rS\S'   \R*                  " 5       rS\S'    " S S5      rS+S jrS,S jrS-S jrS+S jr S.S jr!S/S jr"S0S jr#S1S jr$S2S jr%\RL                  " SS9S3S j5       r'S4S jr(S5S jr)\RL                  " SS 9      S6S! j5       r*\RL                  " SS 9      S7S" j5       r+\RL                  " SS 9S8S# j5       r,\RL                  " SS 9S8S$ j5       r-\RL                  " SS 9S8S% j5       r.S+S& jr/S9S' jr0\Rb                  " SS(9S:S) j5       r2\RL                  " SS 9S;S* j5       r3g! \ a     GN!f = f)<zôPytest plugin for Logfire distributed tracing.

This module implements a pytest plugin that enables distributed tracing for tests.
The plugin is enabled via `--logfire` command-line option or auto-enabled in CI
when `LOGFIRE_TOKEN` is present.
é    )ÚannotationsN)Ú	Generator)ÚTYPE_CHECKINGÚAny)Ú
StatusCode)ÚLogfireÚLogfireSpanz$pytest.StashKey[LogfirePluginConfig]Ú_CONFIG_KEYzpytest.StashKey[LogfireSpan]Ú_SESSION_SPAN_KEYzpytest.StashKey[Any]Ú	_SPAN_KEYÚ_CONTEXT_TOKEN_KEYc                  ó"   • \ rS rSrSrSS jrSrg)ÚLogfirePluginConfigé!   z,Configuration for the Logfire pytest plugin.c                ó(   • Xl         X l        X0l        g ©N©Úlogfire_instanceÚservice_nameÚtrace_phases)Úselfr   r   r   s       Úb/home/mande/repo/quber/.venv/lib/python3.13/site-packages/logfire/_internal/integrations/pytest.pyÚ__init__ÚLogfirePluginConfig.__init__$   s   € Ø 0ÔØ(ÔØ(Õó    r   N)r   r   r   Ústrr   ÚboolÚreturnÚNone)Ú__name__Ú
__module__Ú__qualname__Ú__firstlineno__Ú__doc__r   Ú__static_attributes__© r   r   r   r   !   s
   † Ù6÷)r   r   c                óª   • U R                  SSS9(       a  gU R                  SSS9(       a  gU R                  S5      (       a  g[        5       (       a  gg)z'Check if the Logfire plugin is enabled.ú--no-logfireF©Údefaultú	--logfireTÚlogfire)Ú	getoptionÚgetiniÚ_should_auto_enable©Úconfigs    r   Ú_is_enabledr2   *   sW   € ð ×Ñ˜°ÐÖ6Øð ×Ñ˜¨UÐÖ3Øð ‡}�}�Y×ÑØô ×ÑØàr   c                 ó´   • [         R                  R                  SS5      R                  5       S;  a  g[         R                  R                  S5      (       d  gg)z5Auto-enable in CI environments when token is present.ÚCIÚ )ÚtrueÚ1FÚLOGFIRE_TOKENT)ÚosÚenvironÚgetÚlowerr&   r   r   r/   r/   ?   s>   € ä	‡z�z‡~�~�d˜BÓ×%Ñ%Ó'¨}Ó<ØÜ�:‰:�>‰>˜/×*Ñ*ØØr   c                óÌ   • U R                  SSS9nU(       a  U$ [        R                  R                  S5      nU(       a  U$ U R	                  S5      nU(       a  [        U5      $ g)z(Get the service name from configuration.ú--logfire-service-nameNr)   ÚLOGFIRE_SERVICE_NAMEÚlogfire_service_nameÚpytest)r-   r9   r:   r;   r.   r   )r1   Ú	cli_valueÚ	env_valueÚ	ini_values       r   Ú_get_service_namerE   H   sd   € ð × Ñ Ð!9À4Ð ÐH€IÞØÐô —
‘
—‘Ð5Ó6€IÞØÐð —‘Ð4Ó5€IÞÜ�9‹~Ðð r   c                ób   • U R                  SSS9(       a  g[        U R                  S5      5      $ )ú"Check if phase tracing is enabled.ú--logfire-trace-phasesFr)   TÚlogfire_trace_phases)r-   r   r.   r0   s    r   Ú_get_trace_phasesrJ   ]   s2   € ð ×ÑÐ0¸%ÐÖ@Øô �—‘Ð4Ó5Ó6Ð6r   c                ó"  • U R                  SS5      nUR                  SSSSS9  UR                  SSSS	S9  UR                  S
SSSS9  UR                  SSSSS9  U R                  SSSSS9  U R                  SSSS9  U R                  SSSSS9  g)zAdd Logfire options to pytest.r,   zLogfire distributed tracingr+   Ú
store_trueFz Enable Logfire tracing for tests)Úactionr*   Úhelpr(   z/Disable Logfire tracing (overrides auto-enable)r>   ÚstoreNz1Service name for Logfire traces (default: pytest)rH   z%Trace test setup/call/teardown phaseszEnable Logfire tracingr   )Útyper*   r@   zService name for tracesrA   r)   rI   zTrace test phases)ÚgetgroupÚ	addoptionÚaddini)ÚparserÚgroups     r   Úpytest_addoptionrV   g   sÏ   € à�O‰O˜IÐ'DÓE€EØ	‡O�OØØØØ/ð	 ñ ð 
‡O�OØØØØ>ð	 ñ ð 
‡O�OØ ØØØ@ð	 ñ ð 
‡O�OØ ØØØ4ð	 ñ ð ‡M�M�)Ð5¸FÈE€MÑRØ
‡M�MÐ(Ð*CÈX€MÑVØ
‡M�MÐ(Ð*=ÀFÐTY€MÒZr   c                óÎ   • [        U 5      (       d  gSSKn[        U 5      nUR                  SUSSSS9R	                  SS9n[        UU[        U 5      S	9U R                  [        '   g)
z-Configure Logfire when the plugin is enabled.Nr   Tzif-token-presentF)Úlocalr   Úsend_to_logfireÚinspect_argumentsÚ	scrubbingrA   )Úcustom_scope_suffixr   )	r2   r,   rE   Ú	configureÚwith_settingsr   rJ   Ústashr
   )r1   r,   r   r   s       r   Úpytest_configurer`   ˆ   sw   € ä�v×ÑØãä$ VÓ,€Lð ×(Ñ(ØØ!Ø*ØØð )ð ÷ �m¨€mÐ1ð ô !4Ø)Ø!Ü& vÓ.ñ!€F‡L�L”Òr   c                óD  • [         R                  R                  S5      S:X  a³  S[         R                  R                  SS5      [         R                  R                  SS5      [         R                  R                  SS5      S.n[         R                  R                  S	S5      nU(       a  X!S
'   [        5       nU(       a  X1S'   U R	                  U5        g[         R                  R                  S5      S:X  aÕ  S[         R                  R                  SS5      [         R                  R                  SS5      S.n[         R                  R                  SS5      nU(       a  X!S
'   [         R                  R                  SS5      nU(       a  X1S'   [         R                  R                  SS5      nU(       a  XAS'   U R	                  U5        g[         R                  R                  S5      S:X  aª  S[         R                  R                  SS5      [         R                  R                  SS5      S.n[         R                  R                  SS5      nU(       a  X!S
'   [         R                  R                  SS5      nU(       a  X1S'   U R	                  U5        g[         R                  R                  S5      (       aª  S[         R                  R                  SS5      [         R                  R                  SS5      S.n[         R                  R                  S S5      nU(       a  X!S
'   [         R                  R                  S!S5      nU(       a  X1S'   U R	                  U5        g[         R                  R                  S"5      (       a  U R                  S#S$5        gg)%z!Add CI-specific metadata to span.ÚGITHUB_ACTIONSr6   zgithub-actionsÚGITHUB_WORKFLOWr5   Ú
GITHUB_REFÚ
GITHUB_SHA)ú	ci.systemzci.workflowúci.refúci.shaÚGITHUB_RUN_IDz	ci.job.idz
ci.job.urlNÚ	GITLAB_CIz	gitlab-ciÚCI_COMMIT_REF_NAMEÚCI_COMMIT_SHA)rf   rg   rh   Ú	CI_JOB_IDÚ
CI_JOB_URLÚCI_PIPELINE_IDzci.pipeline.idÚCIRCLECIÚcircleciÚCIRCLE_BRANCHÚCIRCLE_SHA1ÚCIRCLE_BUILD_NUMÚCIRCLE_BUILD_URLÚJENKINS_URLÚjenkinsÚ
GIT_BRANCHÚ
GIT_COMMITÚBUILD_NUMBERÚ	BUILD_URLr4   rf   Úunknown)r9   r:   r;   Ú_build_github_job_urlÚset_attributesÚset_attribute)ÚspanÚattrsÚjob_idÚjob_urlÚpipeline_ids        r   Ú_add_ci_metadatar…   ¢   s®  € ô 
‡z�z‡~�~Ð&Ó'¨6Ó1à)ÜŸ:™:Ÿ>™>Ð*;¸RÓ@Ü—j‘j—n‘n \°2Ó6Ü—j‘j—n‘n \°2Ó6ñ	
ˆô —‘—‘ °Ó4ˆÞØ!'�+ÑÜ'Ó)ˆÞØ")�,ÑØ×Ñ˜EÔ"Øô 
‡z�z‡~�~�kÓ" fÓ,à$Ü—j‘j—n‘nÐ%9¸2Ó>Ü—j‘j—n‘n _°bÓ9ñ
ˆô
 —‘—‘ ¨RÓ0ˆÞØ!'�+ÑÜ—*‘*—.‘. ¨rÓ2ˆÞØ")�,ÑÜ—j‘j—n‘nÐ%5°rÓ:ˆÞØ&1Ð"Ñ#Ø×Ñ˜EÔ"Øô 
‡z�z‡~�~�jÓ! VÓ+à#Ü—j‘j—n‘n _°bÓ9Ü—j‘j—n‘n ]°BÓ7ñ
ˆô
 —‘—‘Ð 2°BÓ7ˆÞØ!'�+ÑÜ—*‘*—.‘.Ð!3°RÓ8ˆÞØ")�,ÑØ×Ñ˜EÔ"Øô 
‡z�z‡~�~�m×$Ñ$à"Ü—j‘j—n‘n \°2Ó6Ü—j‘j—n‘n \°2Ó6ñ
ˆô
 —‘—‘ °Ó3ˆÞØ!'�+ÑÜ—*‘*—.‘. ¨bÓ1ˆÞØ")�,ÑØ×Ñ˜EÔ"Øô 
‡z�z‡~�~�d×ÑØ×Ñ˜;¨	Õ2ð r   c                 óô   • [         R                  R                  SS5      n [         R                  R                  SS5      n[         R                  R                  SS5      nU(       a  U(       a
  U  SU SU 3$ g)z.Build GitHub Actions job URL from environment.ÚGITHUB_SERVER_URLzhttps://github.comÚGITHUB_REPOSITORYr5   ri   Ú/z/actions/runs/©r9   r:   r;   )ÚserverÚrepoÚrun_ids      r   r}   r}   í   s`   € ä�Z‰Z�^‰^Ð/Ð1EÓF€FÜ�:‰:�>‰>Ð-¨rÓ2€DÜ�Z‰Z�^‰^˜O¨RÓ0€FÞ–Ø�˜˜4˜& ¨v¨hÐ7Ð7Ør   c                 ó¨   • SSK Jn   0 nU R                  U5        SU;   a  US   [        R                  S'   SU;   a  US   [        R                  S'   gg)z¯Inject the current OTel trace context into TRACEPARENT/TRACESTATE env vars.

This allows child processes (xdist workers, subprocess.Popen, etc.) to inherit
the trace context.
r   )Ú	propagateÚtraceparentÚTRACEPARENTÚ
tracestateÚ
TRACESTATEN)Úopentelemetryr�   Úinjectr9   r:   )r�   Úcarriers     r   Ú_inject_traceparent_envr—   ÷   sU   € õ (à €GØ×Ñ�WÔØ˜ÓØ$+¨MÑ$:Œ�
‰
�=Ñ!Ø�wÓØ#*¨<Ñ#8Œ�
‰
�<Ò ð r   T)Úoptionalhookc                ó<   • A[        U 5      (       d  g[        5         g)u  Inject TRACEPARENT into env before xdist spawns workers.

Called in the controller before any ``makegateway()`` call, so all workers
inherit the session-level trace context via ``os.environ``.

NOTE: This relies on ``pytest_sessionstart`` (which creates the session span)
running at default priority, *before* xdist's ``DSession.pytest_sessionstart``
which uses ``trylast=True`` and calls ``setup_nodes()`` â†’
``pytest_xdist_setupnodes``.  Do not add ``trylast=True`` to our
``pytest_sessionstart`` or this ordering guarantee breaks.
N)r2   r—   )r1   Úspecss     r   Úpytest_xdist_setupnodesr›     s   € ð 	Ü�v×ÑØÜÕr   c                 ó@   • [         R                  R                  S5      $ )z7Get the xdist worker ID if running in a worker process.ÚPYTEST_XDIST_WORKERrŠ   r&   r   r   Ú_get_xdist_worker_idrž     s   € ä�:‰:�>‰>Ð/Ó0Ð0r   Úsessionc                óp  • [        U R                  5      (       d  gU R                  R                  R                  [        S5      nU(       d  gUR
                  n[        R                  R                  S5      nU(       aq  SSKJ	n  SU0n[        R                  R                  S5      nU(       a  XeS'   U" 5       R                  US9nSS	KJn  UR                  U5      n	X�R                  [        '   U R                  R                  R                   n
S
R#                  U R                  R$                  R&                  5      n[)        5       nU(       a  UR+                  SU
US9nOUR+                  SU
S9nU[-        U R                  R                  5      [-        U R.                  5      S.nU(       a  XÎS'   [        R                  R                  S5      nU(       a   [1        U5      US'   UR5                  U5        [7        U5        UR9                  5         XÐR                  [:        '   g! [2         a     NKf = f)aƒ  Create a session span when the test session starts.

IMPORTANT: This hook must run at default priority (no ``trylast=True``).
``pytest_xdist_setupnodes`` depends on the session span being active when
it injects TRACEPARENT into ``os.environ`` for worker processes.  xdist's
``DSession.pytest_sessionstart`` uses ``trylast=True``, so our default-priority
hook is guaranteed to run first.
Nr‘   r   )ÚTraceContextTextMapPropagatorr�   r“   r’   )r–   ©ÚcontextÚ zpytest: {project} ({worker_id}))ÚprojectÚ	worker_idzpytest: {project})r¥   )zpytest.argszpytest.rootpathzpytest.startpathzpytest.xdist.worker_idÚPYTEST_XDIST_WORKER_COUNTzpytest.xdist.worker_count)r2   r1   r_   r;   r
   r   r9   r:   Ú,opentelemetry.trace.propagation.tracecontextr¡   Úextractr”   r£   Úattachr   ÚrootpathÚnameÚjoinÚinvocation_paramsÚargsrž   r€   r   Ú	startpathÚintÚ
ValueErrorr~   r…   Ú	__enter__r   )rŸ   Úplugin_configr   r�   r¡   r–   r’   r£   Úcontext_apiÚtokenÚrootpath_namer¯   r¦   r€   r�   Úworker_counts                   r   Úpytest_sessionstartr¹     sà  € ô �w—~‘~×&Ñ&Øà—N‘N×(Ñ(×,Ñ,¬[¸$Ó?€MÞàà$×5Ñ5Ðô —*‘*—.‘. Ó/€KÞÝ^à  +Ð.ˆÜ—Z‘Z—^‘^ LÓ1ˆ
ÞØ$.�LÑ!á/Ó1×9Ñ9À'Ð9ÐJˆÝ8à×"Ñ" 7Ó+ˆà,1�‰Ô(Ñ)ð —N‘N×+Ñ+×0Ñ0€MØ�8‰8�G—N‘N×4Ñ4×9Ñ9Ó:€DÜ$Ó&€IæØ×$Ñ$Ø-Ø!Øð %ð 
‰ð  ×$Ñ$ØØ!ð %ð 
ˆð Ü˜wŸ~™~×6Ñ6Ó7Ü × 1Ñ 1Ó2ñ€Eö
 Ø*3Ð&Ñ'Ü—:‘:—>‘>Ð"=Ó>€LÞð	Ü14°\Ó1BˆEÐ-Ñ.ð 	×Ñ˜Ôô �TÔà‡N�NÔØ'+‡M�MÔ#Ò$øô ó 	Ùð	ús   ÇH( È(
H5È4H5)Úhookwrapperc              #  óØ  #   • [        U R                  5      (       d  Sv •  gU R                  R                  R                  [        S5      nU(       d  Sv •  gSSKJn  UR                  nUR                  U R                  5       nU R                  nUR                  U R                  U R                  US   US   US   S.5        [        U S5      (       a7  U R                  (       a&  UR                  SU R                  R                   5        [        U S	5      (       a7  U R"                  (       a&  UR                  S
U R"                  R                   5        [        U S5      (       a<  SSKn UR'                  U R(                  R*                  5      nUR                  SU5        UR7                  5       U R                  [8        '   [:        R<                  R                  S5      n	[:        R<                  R                  S5      n
[?        5          Sv •  U	b  U	[:        R<                  S'   O [:        R<                  RA                  SS5        U
b  U
[:        R<                  S'   O![:        R<                  RA                  SS5         SSS5        g! [,        [.        4 aJ    UR                  S[1        [3        U R(                  R*                  R5                  5       5      5      5         GN?f = f! U	b  U	[:        R<                  S'   O [:        R<                  RA                  SS5        U
b  U
[:        R<                  S'   f [:        R<                  RA                  SS5        f = f! , (       d  f       g= f7f)zCreate a span for each test.Nr   )Útraceé   é   )z	test.nameztest.nodeidzcode.filepathzcode.linenozcode.functionÚclsz
test.classÚmoduleztest.moduleÚcallspecztest.parametersr‘   r“   )!r2   r1   r_   r;   r
   r”   r¼   r   r€   ÚnodeidÚlocationr~   r¬   Úhasattrr¿   r   r    rÀ   ÚjsonÚdumpsrÁ   ÚparamsÚ	TypeErrorr²   r   ÚlistÚkeysÚget_current_spanr   r9   r:   r—   Úpop)ÚitemÚnextitemr´   r¼   r   r€   rÃ   rÅ   Úparams_jsonÚold_traceparentÚold_tracestates              r   Úpytest_runtest_protocolrÒ   j  s€  é € ô �t—{‘{×#Ñ#ÛØà—K‘K×%Ñ%×)Ñ)¬+°tÓ<€MÞãØå#à$×5Ñ5Ðà	×	Ñ	˜tŸ{™{Ô	+¨tØ—=‘=ˆØ×Ñà!ŸY™YØ#Ÿ{™{Ø!)¨!¡Ø'¨™{Ø!)¨!¡ñô	
ô �4˜×Ñ D§H§HØ×Ñ˜|¨T¯X©X×->Ñ->Ô?Ü�4˜×"Ñ" t§{§{Ø×Ñ˜}¨d¯k©k×.BÑ.BÔCô �4˜×$Ñ$Ûð^Ø"Ÿj™j¨¯©×)=Ñ)=Ó>�Ø×"Ñ"Ð#4°kÔBð
 !&× 6Ñ 6Ó 8ˆ�
‰
”9Ñô Ÿ*™*Ÿ.™.¨Ó7ˆÜŸ™Ÿ™¨Ó5ˆÜÔ!ð
	3ÛàÑ*Ø,;”—
‘
˜=Ò)ä—
‘
—‘˜}¨dÔ3ØÑ)Ø+9”—
‘
˜<Ò(ä—
‘
—‘˜|¨TÕ2÷] 
,Ð	+øô2 œzÐ*ó ^à×"Ñ"Ð#4´c¼$¸t¿}¹}×?SÑ?S×?XÑ?XÓ?ZÓ:[Ó6\×]ð^ûð Ñ*Ø,;”—
‘
˜=Ò)ä—
‘
—‘˜}¨dÔ3ØÑ)Ø+9”—
‘
˜<Ò(ä—
‘
—‘˜|¨TÕ2ú÷] 
,Õ	+üs_   ‚BM*ÂC&MÅ,7J	Æ#A)MÈK&ÈA/MÊ 	M*Ê	AK#ËMË"K#Ë#MË&A0MÍMÍ
M'Í#M*c              #  ó.  #   • Sv •nUR                  5       nUR                  S:w  a  gU R                  R                  [        S5      nU(       d  gUR                  SUR                  5        UR                  SUR                  S-  5        UR                  (       a´  UR                  [        R                  UR                  (       a/  UR                  R                   SUR                  R                   3OS5        UR                  (       aB  UR                  R                  (       a&  UR                  UR                  R                  5        gggUR                   (       a³  Sn[#        US	5      (       a  UR$                  =(       d    S
nOwUR&                  (       af  [)        UR&                  [*        5      (       a2  [-        UR&                  5      S:”  a  [/        UR&                  S   5      nO[/        UR&                  5      nUR                  SU5        gg7f)z$Record test outcomes and exceptions.NÚcallztest.outcomeztest.duration_msiè  z: zTest failedr5   ÚwasxfailÚxfailedr¾   ztest.skip_reason)Ú
get_resultÚwhenr_   r;   r   r   ÚoutcomeÚdurationÚfailedÚ
set_statusr   ÚERRORÚexcinfoÚtypenameÚvalueÚrecord_exceptionÚskippedrÄ   rÕ   ÚlongreprÚ
isinstanceÚtupleÚlenr   )rÍ   rÔ   rÙ   Úreportr€   Úskip_reasons         r   Úpytest_runtest_makereportré   ¯  sx  é € ò €GØ '× 2Ñ 2Ó 4€Fà‡{�{�fÓØà�:‰:�>‰>œ) TÓ*€DÞØà×Ñ�~ v§~¡~Ô6Ø×ÑÐ)¨6¯?©?¸TÑ+AÔBà‡}‡}Ø�‰Ü×ÑØ@DÇÇˆt�|‰|×$Ñ$Ð% R¨¯©×(:Ñ(:Ð';Ñ<ÐR_ô	
ð
 �<�<˜DŸL™L×.×.à×!Ñ! $§,¡,×"4Ñ"4Õ5ð /ˆ<ð 
��àˆÜ�6˜:×&Ñ&Ø Ÿ/™/×6¨Y‰KØ�_�_ä˜&Ÿ/™/¬5×1Ñ1´c¸&¿/¹/Ó6JÈQÓ6NÜ! &§/¡/°!Ñ"4Ó5‘ô " &§/¡/Ó2�Ø×ÑÐ-¨{Õ;ð 
ùs   ‚HHc              #  ó>  #   • [        U R                  5      (       d  Sv •  gU R                  R                  R                  [        S5      nU(       d  Sv •  gUR
                  nUR                  SU R                  S9   Sv •  SSS5        g! , (       d  f       g= f7f)z<Trace test setup phase if --logfire-trace-phases is enabled.Nzsetup: {nodeid}©rÂ   ©Ú_should_trace_phasesr1   r_   r;   r
   r   r€   rÂ   ©rÍ   r´   r   s      r   Úpytest_runtest_setuprï   Ú  st   é € ô   §¡×,Ñ,ÛØà—K‘K×%Ñ%×)Ñ)¬+°tÓ<€MÞãØà$×5Ñ5Ðà	×	Ñ	Ð0¸¿¹Ð	Ò	EÛ÷ 
F×	EÖ	Eüó   ‚A<BÁ>BÂ	BÂ
BÂBc              #  ó>  #   • [        U R                  5      (       d  Sv •  gU R                  R                  R                  [        S5      nU(       d  Sv •  gUR
                  nUR                  SU R                  S9   Sv •  SSS5        g! , (       d  f       g= f7f)z;Trace test call phase if --logfire-trace-phases is enabled.Nzcall: {nodeid}rë   rì   rî   s      r   Úpytest_runtest_callrò   í  st   é € ô   §¡×,Ñ,ÛØà—K‘K×%Ñ%×)Ñ)¬+°tÓ<€MÞãØà$×5Ñ5Ðà	×	Ñ	Ð/¸¿¹Ð	Ò	DÛ÷ 
E×	DÖ	Dürð   c              #  ó>  #   • [        U R                  5      (       d  Sv •  gU R                  R                  R                  [        S5      nU(       d  Sv •  gUR
                  nUR                  SU R                  S9   Sv •  SSS5        g! , (       d  f       g= f7f)z?Trace test teardown phase if --logfire-trace-phases is enabled.Nzteardown: {nodeid}rë   rì   rî   s      r   Úpytest_runtest_teardownrô      st   é € ô   §¡×,Ñ,ÛØà—K‘K×%Ñ%×)Ñ)¬+°tÓ<€MÞãØà$×5Ñ5Ðà	×	Ñ	Ð3¸D¿K¹KÐ	Ò	HÛ÷ 
I×	HÖ	Hürð   c                óŒ   • [        U 5      (       d  gU R                  R                  [        S5      nU(       d  gUR                  $ )rG   FN)r2   r_   r;   r
   r   )r1   r´   s     r   rí   rí     s8   € ä�v×ÑØà—L‘L×$Ñ$¤[°$Ó7€MÞØà×%Ñ%Ð%r   c                óX  • [        U R                  5      (       d  gU R                  R                  R                  [        S5      nU(       d  gUR
                  nU R                  R                  [        S5      nU(       a]  UR                  SU5        UR                  SU R                  5        UR                  SU R                  5        UR                  SSS5        U R                  R                  [        S5      nU(       a  SSKJn  UR                  U5        UR                  SS9  g)	z&End the session span and flush traces.Nzpytest.exitstatuszpytest.testscollectedzpytest.testsfailedr   r¢   iˆ  )Útimeout_millis)r2   r1   r_   r;   r
   r   r   r   ÚtestscollectedÚtestsfailedÚ__exit__r   r”   r£   ÚdetachÚforce_flush)rŸ   Ú
exitstatusr´   r   r€   Úcontext_tokenrµ   s          r   Úpytest_sessionfinishrÿ     sí   € ä�w—~‘~×&Ñ&Øà—N‘N×(Ñ(×,Ñ,¬[¸$Ó?€MÞàà$×5Ñ5Ðð �=‰=×ÑÔ.°Ó5€DÞà×ÑÐ.°
Ô;Ø×ÑÐ2°G×4JÑ4JÔKØ×ÑÐ/°×1DÑ1DÔEØ�‰�d˜D $Ô'ð —M‘M×%Ñ%Ô&8¸$Ó?€MÞÝ8à×Ñ˜=Ô)ð × Ñ °Ð Ò5r   )Úscopec                óª   • U R                   nUR                  R                  [        S5      nU(       a  UR                  $ SSKnUR                  SSSS9$ )a²  Provide a Logfire instance configured for the pytest plugin.

This fixture provides a Logfire instance that sends spans to Logfire when the
pytest plugin is enabled (via `--logfire` flag). Use this instead of the global
`logfire` module when you want spans created in tests to be sent to Logfire
as part of your test traces.

When the plugin is not enabled, this fixture returns a local-only instance
that doesn't send data anywhere.
Nr   TF)rX   rY   Úconsole)r1   r_   r;   r
   r   r,   r]   )Úrequestr1   r´   Úlogfire_modules       r   Úlogfire_pytestr  ?  sX   € ð �^‰^€FØ—L‘L×$Ñ$¤[°$Ó7€Mæà×-Ñ-Ð-ó %à×#Ñ#ØØØð $ð ð r   c              #  ól  ^^^^#   • SSK n[        U R                  5      (       d  Sv •  gU R                  R	                  [
        S5      mTb   UR                  U R                  5      (       d  Sv •  gSSKnSSK	J
mJm  U R                  mUR                  T5      SUUUU4S jj5       nX0l        Sv •  g7f)aJ  Re-attach the per-test span context for async test functions.

The ``pytest_runtest_protocol`` hook creates a span per test and attaches it
to the OTel context via ``context_api.attach()`` in the **synchronous** hook
thread.  However, when tests are async (e.g. with anyio/pytest-asyncio), they
may run inside an event-loop task whose ``contextvars`` snapshot was taken
before the per-test span was attached (e.g. when ``asyncio.Runner`` reuses a
saved context on Python 3.11+).  As a result, ``logfire.get_context()`` inside
an async test can return a stale traceparent from a previous test (or no
context at all).

This hook wraps async test functions so that ``context_api.attach()`` is called
*inside* the coroutine body, making the span visible to the test and any
callbacks (e.g. httpx event hooks) that call ``logfire.get_context()``.
r   N)r£   r¼   c               Ÿ  óÄ   >#   • TR                  T5      nTR                  U5      n T" U 0 UD6I S h  v•N TR                  U5        $  N! TR                  U5        f = f7fr   )Úset_span_in_contextrª   rû   )r¯   ÚkwargsÚctxr¶   rµ   ÚoriginalÚ	otel_spanr¼   s       €€€€r   Ú_wrappedÚ$pytest_pyfunc_call.<locals>._wrapped~  s]   øé € à×'Ñ'¨	Ó2ˆØ×"Ñ" 3Ó'ˆð	&Ù! 4Ð2¨6Ñ2×2à×Ñ˜uÕ%ñ 3øà×Ñ˜uÕ%üs+   ƒ#A §A
 ²A³A
 ¶A ÁA
 Á
AÁA )r¯   r   r	  r   r   r   )Úinspectr2   r1   r_   r;   r   ÚiscoroutinefunctionÚobjÚ	functoolsr”   r£   r¼   Úwraps)Ú
pyfuncitemr  r  r  rµ   r  r  r¼   s       @@@@r   Úpytest_pyfunc_callr  \  s“   ûé € ó" ä�z×(Ñ(×)Ñ)ÛØà× Ñ ×$Ñ$¤Y°Ó5€IØÑ × ;Ñ ;¸J¿N¹N× KÑ KÛØãç;à�~‰~€Hà‡_�_�XÓ÷&ñ &ó ð&ð „NÜ	ùs   †B.B4)r1   úpytest.Configr   r   )r   r   )r1   r  r   r   )rT   zpytest.Parserr   r   )r1   r  r   r   )r€   r	   r   r   )r   r   )r   r   )r1   r   rš   r   r   r   )r   z
str | None)rŸ   úpytest.Sessionr   r   )rÍ   úpytest.ItemrÎ   zpytest.Item | Noner   úGenerator[None])rÍ   r  rÔ   zpytest.CallInfo[Any]r   z(Generator[None, pytest.TestReport, None])rÍ   r  r   r  )rŸ   r  rý   r±   r   r   )r  zpytest.FixtureRequestr   r   )r  zpytest.Functionr   r  )4r$   Ú
__future__r   ÚbuiltinsÚ@py_builtinsÚ_pytest.assertion.rewriteÚ	assertionÚrewriteÚ
@pytest_arr9   Úcollections.abcr   Útypingr   r   Úopentelemetry.tracer   rA   r,   r   r	   ÚStashKeyr
   Ú__annotations__r   r   r   ÚImportErrorr   r2   r/   rE   rJ   rV   r`   r…   r}   r—   Úhookimplr›   rž   r¹   rÒ   ré   rï   rò   rô   rí   rÿ   Úfixturer  r  r&   r   r   Ú<module>r)     s  ðòõ #ç  „ ƒ	Ý %ß %å *æÛç,ð	Ûà8>¿ºÓ8I€KÐ5ÓIØ6<·o²oÓ6GÐÐ3ÓGØ&,§o¢oÓ&7€IÐ#Ó7Ø/5¯ªÓ/@ÐÐ,Ó@÷
)ñ )ôô*ôô*7ô[ôBô4H3ôVô9ð  ‡‚˜dÑ#óó $ðô$1ô
H,ðV ‡‚˜TÑ"ðA3Ø
ðA3à ðA3ð óA3ó #ðA3ðH ‡‚˜TÑ"ð'<Ø
ð'<à
ð'<ð .ó'<ó #ð'<ðT ‡‚˜TÑ"óó #ðð$ ‡‚˜TÑ"óó #ðð$ ‡‚˜TÑ"óó #ðô$	&ô6ð@ ‡‚�iÑ óó !ðð8 ‡‚˜TÑ"ó+
ó #ñ+
øðA ó 	Úð	ús   ÁAF7 Æ7GÇ G