ó
    Ð]jœ(  ã                  ór  • S SK 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rS SKJ	r	J
r
  S SKJr  S SKJr  S SKJrJr  S SKrS SKJr  SS	KJrJrJr  SS
KJrJr  SSKJr  \" SS9 " S S5      5       r\ " S S\R>                  5      5       r  " S S\	5      r! " S S\"5      r#\RH                  " SS9SS j5       r%g)é    )ÚannotationsN)ÚABCÚabstractmethod)ÚIterator)Ú	dataclass)ÚAnyÚcast)Útypesé   )ÚATTRIBUTES_MESSAGE_TEMPLATE_KEYÚATTRIBUTES_SAMPLE_RATE_KEYÚATTRIBUTES_TAGS_KEY)Ú	StackInfoÚget_filepath_attribute)Úuniquify_sequenceT)Úfrozenc                  óJ   • \ rS rSr% SrS\S'   S\S'   SrS\S	'   SrS\S
'   Srg)ÚLogfireArgsé   zÁValues passed to `logfire.instrument` and/or values stored in a logfire instance as basic configuration.

These determine the arguments passed to the method calls added by the AST transformer.
ztuple[str, ...]Útagszfloat | NoneÚsample_rateNz
str | NoneÚmsg_templateÚ	span_name© )	Ú__name__Ú
__module__Ú__qualname__Ú__firstlineno__Ú__doc__Ú__annotations__r   r   Ú__static_attributes__r   ó    ÚX/home/mande/repo/quber/.venv/lib/python3.13/site-packages/logfire/_internal/ast_utils.pyr   r      s)   ‡ ñð
 ÓØÓØ#€L�*Ó#Ø €IˆzÖ r"   r   c                  ó„   • \ rS rSr% SrS\S'   S\S'   S\S'   S\S'   S	 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Srg)ÚBaseTransformeré'   zXHelper for rewriting ASTs to wrap function bodies in `with {logfire_method_name}(...):`.r   Úlogfire_argsÚstrÚlogfire_method_nameÚfilenameÚmodule_namec                ó   • / U l         g ©N©Úqualname_stack©Úselfs    r#   Ú__post_init__ÚBaseTransformer.__post_init__0   s   € ð *,ˆÕr"   c                óÖ   • U R                   R                  UR                  5        [        [        R
                  U R                  U5      5      nU R                   R                  5         U$ r-   )r/   ÚappendÚnamer	   ÚastÚClassDefÚgeneric_visitÚpop©r1   Únodes     r#   Úvisit_ClassDefÚBaseTransformer.visit_ClassDef5   sL   € Ø×Ñ×"Ñ" 4§9¡9Ô-ä”C—L‘L $×"4Ñ"4°TÓ":Ó;ˆØ×Ñ×ÑÔ!Øˆr"   c                ód  • U R                   R                  UR                  5        SR                  U R                   5      nU R                   R                  S5        U R	                  U5        U R                   R                  5         U R                   R                  5         U R                  X5      $ )NÚ.z<locals>)r/   r5   r6   Újoinr9   r:   Úrewrite_function©r1   r<   Úqualnames      r#   Úvisit_FunctionDefÚ!BaseTransformer.visit_FunctionDef<   s…   € Ø×Ñ×"Ñ" 4§9¡9Ô-Ø—8‘8˜D×/Ñ/Ó0ˆØ×Ñ×"Ñ" :Ô.à×Ñ˜4Ô Ø×Ñ×ÑÔ!Ø×Ñ×ÑÔ!à×$Ñ$ TÓ4Ð4r"   c                ó$   • U R                  U5      $ r-   )rE   r;   s     r#   Úvisit_AsyncFunctionDefÚ&BaseTransformer.visit_AsyncFunctionDefG   s   € Ø×%Ñ% dÓ+Ð+r"   c           	     ó  • UR                   R                  5       n/ nU(       aš  [        US   [        R                  5      (       ax  [        US   R
                  [        R                  5      (       aL  [        US   R
                  R
                  [        5      (       a   UR                  UR                  S5      5        U(       a  [        U5      S:X  ar  [        US   [        R                  5      (       dN  [        US   [        R                  5      (       a.  [        US   R
                  [        R                  5      (       a  U$ [        R                  " [        R                  " U R                  X5      S9/UUR                  S9nUR                  U5        UR                    Vs0 s H  of[#        XS 5      _M     nnXGS'   [%        U5      " S0 UD6n[        R&                  " [        R(                  " X�5      5      $ s  snf )Nr   r   )Úcontext_expr)ÚitemsÚbodyÚtype_commentrM   r   )rM   ÚcopyÚ
isinstancer7   ÚExprÚvalueÚConstantr(   r5   r:   ÚlenÚPassÚWithÚwithitemÚlogfire_method_call_noderN   Ú_fieldsÚgetattrÚtypeÚfix_missing_locationsÚcopy_location)	r1   r<   rD   rM   Únew_bodyÚspanr6   ÚkwargsÚnew_nodes	            r#   rB   Ú BaseTransformer.rewrite_functionJ   s|  € ð �y‰y�~‰~ÓˆØ#%ˆæÜ˜4 ™7¤C§H¡H×-Ñ-Ü˜4 ™7Ÿ=™=¬#¯,©,×7Ñ7Ü˜4 ™7Ÿ=™=×.Ñ.´×4Ñ4ð
 �O‰O˜DŸH™H Q›KÔ(ö Ü�‹I˜‹Nä˜4 ™7¤C§H¡H×-Ñ-Ü˜t A™w¬¯©×1Ñ1´jÀÀaÁÇÁÔPS×P\ÑP\×6]Ñ6]ð ˆKä�xŠxä—’Ø!%×!>Ñ!>¸tÓ!Nñðð
 Ø×*Ñ*ñ
ˆð 	�‰˜ÔàNRÏlÊlÓ![ÊlÀd¬°¸DÓ(AÒ"AÉlˆÐ![Ø!ˆv‰Ü˜”:Ñ' Ñ'ˆÜ×(Ò(¬×):Ò):¸8Ó)JÓKÐKùò "\s   Æ'G>c                ó   • [        5       er-   )ÚNotImplementedErrorrC   s      r#   rX   Ú(BaseTransformer.logfire_method_call_nodex   s   € Ü!Ó#Ð#r"   c                ór  • 0 [        U R                  5      EUUS.En0 UEnU R                  nUR                  =(       d    SU R                   SU 3nXd[
        '   UR                  =(       d    UnUR                  (       a  [        UR                  5      U[        '   UR                  nUS;  a  X„[        '   Xt4$ )N)zcode.linenozcode.functionzCalling r@   )Nr   )r   r*   r'   r   r+   r   r   r   r   r   r   r   )	r1   rD   ÚlinenoÚ
stack_infoÚ
attributesr'   r   r   r   s	            r#   Úlogfire_method_arg_valuesÚ)BaseTransformer.logfire_method_arg_values{   sÀ   € ð!
Ü$ T§]¡]Ó3ð!
à!Ø%ò!
ˆ
ð
 <J¸j¸>ˆ
à×(Ñ(ˆØ#×0Ñ0×\°h¸t×?OÑ?OÐ>PÐPQÐRZÐQ[Ð4\ˆØ6BÔ2Ñ3à ×*Ñ*×:¨lˆ	à××Ü.?À×@QÑ@QÓ.RˆJÔ*Ñ+à"×.Ñ.ˆØ˜iÓ'Ø5@Ô1Ñ2àÐ$Ð$r"   r.   N)r<   zast.ClassDef)r<   ú&ast.FunctionDef | ast.AsyncFunctionDef)r<   zast.AsyncFunctionDef)r<   rl   rD   r(   Úreturnúast.AST)r<   rl   rD   r(   rm   úast.Call)rD   r(   rg   Úintrm   z0tuple[str, dict[str, otel_types.AttributeValue]])r   r   r   r   r   r    r2   r=   rE   rH   rB   rX   rj   r!   r   r"   r#   r%   r%   '   sA   ‡ ábàÓØÓØƒMØÓò,ô
ô	5ô,ô,Lô\$÷%r"   r%   c                  óx   • \ rS rSrSrSS jrSS jr\SS j5       r\SS j5       r	\SS j5       r
SS jrS	 rS
rg)ÚCallNodeFinderé“   a�  Base class for finding the `ast.Call` node corresponding to a function call in a given frame.

Uses `executing`, then falls back to a heuristic if that fails.
The heuristic is defined by subclasses which depends on what we're looking for,
but in general `executing` is expected to work.
Warns appropriately when things don't work.
Only used when `inspect_arguments=True` in `logfire.configure()`.
c                ó¸   • Xl         [        R                  R                  U5      U l        U R                  R                  U l        U R                  5       U l        g r-   )ÚframeÚ	executingÚSourceÚexÚsourceÚ_get_call_noder<   )r1   ru   s     r#   Ú__init__ÚCallNodeFinder.__init__�   s>   € ØŒ
ä×"Ñ"×,Ñ,¨UÓ3ˆŒØ—g‘g—n‘nˆŒØ×'Ñ'Ó)ˆ�	r"   c           	     ót  • [        U R                  R                  [        R                  5      (       a  U R                  R                  $ U R
                  R                  (       d  U R                  S5        g Sn[        R                  S S S:  a  US-  nU R                  5        VVs/ s H\  n[        R                  " U5        H>  n[        U[        R                  5      (       d  M$  U R                  U5      (       d  M<  UPM@     M^     nnn[        U5      S:w  a  U R                  U5        g US   $ s  snnf )NzŽNo source code available. This happens when running in an interactive shell, using exec(), or running .pyc files without the source .py files.z"`executing` failed to find a node.é   )é   é   zM This may be caused by a combination of using Python < 3.11 and auto-tracing.r   r   )rP   rx   r<   r7   ÚCallry   ÚtextÚwarn_inspect_argumentsÚsysÚversion_infoÚheuristic_main_nodesÚwalkÚheuristic_call_node_filterrT   )r1   ÚmsgÚ	main_noder<   Ú
call_nodess        r#   rz   ÚCallNodeFinder._get_call_node¤   s  € Ü�d—g‘g—l‘l¤C§H¡H×-Ñ-Ø—7‘7—<‘<Ðð
 �{‰{××ð ×'Ñ'ðTôð
 à2ˆÜ×Ñ˜B˜QÐ 'Ó)ð
 ÐbÑbˆCð
 "×6Ñ6Ô8ô
â8�	ÜŸš ×+�Ü˜$¤§¡×)ó ð ×.Ñ.¨t×4÷	 á+ñ Ù8ð 	ñ 
ô ˆz‹?˜aÓØ×'Ñ'¨Ô,Øà˜!‰}Ðùó
s   Â(=D4Ã)D4Ä
D4c                ó   • g)zFAST nodes (e.g. statements) to search for potential call nodes inside.Nr   r0   s    r#   r†   Ú#CallNodeFinder.heuristic_main_nodesÌ   ó   � r"   c                ó   • g)zKCondition that a potential call node must satisfy to be considered a match.Nr   r;   s     r#   rˆ   Ú)CallNodeFinder.heuristic_call_node_filterÐ   r�   r"   c                ó   • g)zsMiddle part of the warning message for `warn_inspect_arguments`.

Should describe the consequences of the failure.
Nr   r0   s    r#   Úwarn_inspect_arguments_middleÚ,CallNodeFinder.warn_inspect_arguments_middleÔ   r�   r"   c                óª   • SS K nSU R                  5        SU 3n[        R                  " U[        U R                  5       S9  UR                  U5        g )Nr   zHFailed to introspect calling code. Please report this issue to Logfire. z_ Set inspect_arguments=False in logfire.configure() to suppress this warning. The problem was:
)Ú
stacklevel)Úlogfirer“   ÚwarningsÚwarnÚInspectArgumentsFailedWarningÚget_stacklevel)r1   r‰   r—   s      r#   rƒ   Ú%CallNodeFinder.warn_inspect_argumentsÛ   sW   € Ûð WØ×1Ñ1Ó3Ð4ð 5nàˆeðð 	ô 	�Š�cÔ8ÀT×EXÑEXÓEZÒ[Ø�‰�SÕr"   c                óš   • [         R                  " 5       nSnU(       a,  XR                  :X  a   U$ US-  nUR                  nU(       a  M,  U$ )Nr   r   )ÚinspectÚcurrentframeru   Úf_back)r1   Úcurrent_framer–   s      r#   r›   ÚCallNodeFinder.get_stacklevelç   sT   € ô  ×,Ò,Ó.ˆØˆ
ÞØ§
¡
Ó*Øð Ðð ˜!‰OˆJØ)×0Ñ0ˆM÷	 ˆmð
 Ðr"   )rx   ru   r<   ry   N)ru   ztypes.FrameType)rm   zast.Call | None)rm   zIterator[ast.AST])r<   ro   rm   Úbool)rm   r(   )r‰   r(   )r   r   r   r   r   r{   rz   r   r†   rˆ   r“   rƒ   r›   r!   r   r"   r#   rr   rr   “   s\   † ñô*ô&ðP óUó ðUð óZó ðZð óó ðô
õ
r"   rr   c                  ó   • \ rS rSrSrg)rš   éô   r   N)r   r   r   r   r!   r   r"   r#   rš   rš   ô   s   † Úr"   rš   i   )Úmaxsizec                ó  • [         R                  " U 5      n[         R                  " UR                  U 5      =(       d    Sn [         R                  " [         R                  " USS95      nX$:X  a  U$ U$ ! [
         a    Sn Nf = f)aI  Returns some Python source code representing `node`.

Preferably the actual original code given by `ast.get_source_segment`,
but falling back to `ast.unparse(node)` if the former is incorrect.
This happens sometimes due to Python bugs (especially for older Python versions)
in the source positions of AST nodes inside f-strings.
Ú Úeval)Úmode)r7   ÚunparseÚget_source_segmentr‚   ÚparseÚ	Exception)r<   Ú	ex_sourceÚsource_unparsedÚsource_segmentÚsource_segment_unparseds        r#   Úget_node_source_textr³   ø   su   € ô —k’k $Ó'€OÜ×+Ò+¨I¯N©N¸DÓA×GÀR€Nð%ä"%§+¢+¬c¯iªi¸ÈVÑ.TÓ"UÐð -ÓGˆ>Ð\È_Ð\øô ó %Ø"$Òð%ús   Á)A4 Á4BÂB)r<   rn   r¯   zexecuting.Source)&Ú
__future__r   r7   Ú	functoolsrž   r„   r
   r˜   Úabcr   r   Úcollections.abcr   Údataclassesr   Útypingr   r	   rv   Úopentelemetry.utilÚ
otel_typesÚ	constantsr   r   r   rh   r   r   Úutilsr   r   ÚNodeTransformerr%   rr   ÚWarningrš   Ú	lru_cacher³   r   r"   r#   Ú<module>rÁ      s½   ðÝ "ã 
Û Û Û 
Û Û ß #Ý $Ý !ß ã Ý 2÷ñ ÷
 :Ý $ñ �$Ñ÷	!ð 	!ó ð	!ð ôh%�c×)Ñ)ó h%ó ðh%ôV^�Sô ^ôB	 Gô 	ð ×Ò˜TÑ"ó]ó #ñ]r"   