§
    y›jøf  ã                  óV  — d dl mZ d dlZd dlZd dlmZmZ d dlm	Z	 d dl
mZmZmZ d dlmZmZmZmZmZmZ d dlmZ d dlmZmZ d d	lmZ d d
lmZ 	 d dlmZ n# e$ r dCd„ZY nw xY wdZ  G d„ de¦  «        Z! G d„ de¦  «        Z" G d„ de¦  «        Z# G d„ de¦  «        Z$ G d„ de¦  «        Z% G d„ de¦  «        Z& G d„ de¦  «        Z' G d „ d!e¦  «        Z( ed"ee!e"z  e#z  e$z  e%z  e&z  e'z  e(z   ed#¦  «        f         ¦  «        Z)ee* ed$¬%¦  «         ed&d'i¦  «        f         Z+	  G d(„ d)e¦  «        Z, G d*„ d+e¦  «        Z- G d,„ d-e¦  «        Z. G d.„ d/e¦  «        Z/ G d0„ d1e¦  «        Z0 G d2„ d3e¦  «        Z1 G d4„ d5e¦  «        Z2dDd;„Z3 G d<„ d=e¦  «        Z4dEd@„Z5dFdB„Z6dS )Gé    )ÚannotationsN)ÚMappingÚSequence)Úcached_property)Ú	AnnotatedÚAnyÚLiteral)Ú	BaseModelÚFieldÚValidationErrorÚWithJsonSchemaÚfield_validatorÚmodel_validator)ÚTypeAliasType)ÚLocalVariablesOptionsÚVariablesOptions)ÚResolvedVariable)ÚVariable)ÚDiscriminatorÚargsr   ÚkwargsÚreturnc                 ó   — d S ©N© )r   r   s     úU/home/lighthouse/health/venv/lib/python3.11/site-packages/logfire/variables/config.pyr   r      s   € Øˆó    )ÚKeyIsNotPresentÚKeyIsPresentÚLabeledValueÚLabelRefÚLatestVersionr   ÚRolloutÚRolloutOverrideÚValueDoesNotEqualÚValueDoesNotMatchRegexÚValueEqualsÚ	ValueIsInÚValueIsNotInÚValueMatchesRegexÚVariableConfigÚVariablesConfigÚVariableTypeConfigc                  óD   — e Zd ZU dZded<   	 ded<   	 dZded<   	 dd„ZdS )r'   zACondition that matches when an attribute equals a specific value.ÚstrÚ	attributer   Úvaluezvalue-equalszLiteral['value-equals']ÚkindÚ
attributesúMapping[str, Any]r   Úboolc                ób   — |                      | j        t          ¦   «         ¦  «        | j        k    S )z1Check if the attribute equals the expected value.©Úgetr0   Úobjectr1   ©Úselfr3   s     r   ÚmatcheszValueEquals.matches:   s#   € à�~Š~˜dœn­f©h¬hÑ7Ô7¸4¼:ÒEÐEr   N©r3   r4   r   r5   ©Ú__name__Ú
__module__Ú__qualname__Ú__doc__Ú__annotations__r2   r<   r   r   r   r'   r'   0   sb   € € € € € € ØKÐKà€N€N�NØ-Ø€J€J�JØ-Ø$2€DÐ2Ð2Ð2Ñ2Ø1ðFð Fð Fð Fð Fð Fr   r'   c                  óD   — e Zd ZU dZded<   	 ded<   	 dZded<   	 dd„ZdS )r%   zICondition that matches when an attribute does not equal a specific value.r/   r0   r   r1   zvalue-does-not-equalzLiteral['value-does-not-equal']r2   r3   r4   r   r5   c                ób   — |                      | j        t          ¦   «         ¦  «        | j        k    S )z:Check if the attribute does not equal the specified value.r7   r:   s     r   r<   zValueDoesNotEqual.matchesI   s%   € ð �~Š~˜dœn­f©h¬hÑ7Ô7¸4¼:ÒEÐEr   Nr=   r>   r   r   r   r%   r%   ?   sb   € € € € € € ØSÐSà€N€N�NØ-Ø€J€J�JØ1Ø,B€DÐBÐBÐBÑBØ1ðFð Fð Fð Fð Fð Fr   r%   c                  óD   — e Zd ZU dZded<   	 ded<   	 dZded<   	 dd„ZdS )r(   zECondition that matches when an attribute value is in a set of values.r/   r0   úSequence[Any]Úvalueszvalue-is-inzLiteral['value-is-in']r2   r3   r4   r   r5   c                ób   — |                      | j        t          ¦   «         ¦  «        }|| j        v S )z3Check if the attribute value is in the allowed set.©r8   r0   r9   rH   ©r;   r3   r1   s      r   r<   zValueIsIn.matchesY   s(   € à—’˜tœ~­v©x¬xÑ8Ô8ˆØ˜œÐ#Ð#r   Nr=   r>   r   r   r   r(   r(   O   s_   € € € € € € ØOÐOà€N€N�NØ-ØÐÐÑØ5Ø#0€DÐ0Ð0Ð0Ñ0Ø1ð$ð $ð $ð $ð $ð $r   r(   c                  óD   — e Zd ZU dZded<   	 ded<   	 dZded<   	 dd„ZdS )r)   zICondition that matches when an attribute value is not in a set of values.r/   r0   rG   rH   zvalue-is-not-inzLiteral['value-is-not-in']r2   r3   r4   r   r5   c                ób   — |                      | j        t          ¦   «         ¦  «        }|| j        vS )z8Check if the attribute value is not in the excluded set.rJ   rK   s      r   r<   zValueIsNotIn.matchesi   s*   € ð —’˜tœ~­v©x¬xÑ8Ô8ˆØ˜DœKÐ'Ð'r   Nr=   r>   r   r   r   r)   r)   _   s_   € € € € € € ØSÐSà€N€N�NØ-ØÐÐÑØ9Ø'8€DÐ8Ð8Ð8Ñ8Ø1ð(ð (ð (ð (ð (ð (r   r)   c                  óD   — e Zd ZU dZded<   	 ded<   	 dZded<   	 dd„ZdS )r*   zGCondition that matches when an attribute value matches a regex pattern.r/   r0   ústr | re.Pattern[str]Úpatternzvalue-matches-regexzLiteral['value-matches-regex']r2   r3   r4   r   r5   c                ó²   — |                      | j        ¦  «        }t          |t          ¦  «        sdS t	          t          j        | j        |¦  «        ¦  «        S )z7Check if the attribute value matches the regex pattern.F)r8   r0   Ú
isinstancer/   r5   ÚreÚsearchrP   rK   s      r   r<   zValueMatchesRegex.matchesz   sH   € à—’˜tœ~Ñ.Ô.ˆÝ˜%¥Ñ%Ô%ð 	Ø�5Ý•B”I˜dœl¨EÑ2Ô2Ñ3Ô3Ð3r   Nr=   r>   r   r   r   r*   r*   p   s_   € € € € € € ØQÐQà€N€N�NØ-Ø"Ð"Ð"Ñ"Ø;Ø+@€DÐ@Ð@Ð@Ñ@Ø1ð4ð 4ð 4ð 4ð 4ð 4r   r*   c                  óD   — e Zd ZU dZded<   	 ded<   	 dZded<   	 dd„ZdS )r&   zNCondition that matches when an attribute value does not match a regex pattern.r/   r0   rO   rP   zvalue-does-not-match-regexz%Literal['value-does-not-match-regex']r2   r3   r4   r   r5   c                óš   — |                      | j        ¦  «        }t          |t          ¦  «        sdS t	          j        | j        |¦  «         S )z>Check if the attribute value does not match the regex pattern.T)r8   r0   rR   r/   rS   rT   rP   rK   s      r   r<   zValueDoesNotMatchRegex.matchesŒ   sE   € à—’˜tœ~Ñ.Ô.ˆÝ˜%¥Ñ%Ô%ð 	ð �4Ý”9˜Tœ\¨5Ñ1Ô1Ð1Ð1r   Nr=   r>   r   r   r   r&   r&   ‚   s_   € € € € € € ØXÐXà€N€N�NØ-Ø"Ð"Ð"Ñ"Ø?Ø2N€DÐNÐNÐNÑNØ1ð2ð 2ð 2ð 2ð 2ð 2r   r&   c                  ó8   — e Zd ZU dZded<   	 dZded<   	 dd„ZdS )r   z8Condition that matches when an attribute key is present.r/   r0   zkey-is-presentzLiteral['key-is-present']r2   r3   r4   r   r5   c                ó   — | j         |v S )z4Check if the attribute key exists in the attributes.©r0   r:   s     r   r<   zKeyIsPresent.matchesž   s   € àŒ~ Ð+Ð+r   Nr=   r>   r   r   r   r   r   –   sP   € € € € € € ØBÐBà€N€N�NØ=Ø&6€DÐ6Ð6Ð6Ñ6Ø1ð,ð ,ð ,ð ,ð ,ð ,r   r   c                  ó8   — e Zd ZU dZded<   	 dZded<   	 dd„ZdS )r   z<Condition that matches when an attribute key is not present.r/   r0   zkey-is-not-presentzLiteral['key-is-not-present']r2   r3   r4   r   r5   c                ó   — | j         |vS )z<Check if the attribute key does not exist in the attributes.rY   r:   s     r   r<   zKeyIsNotPresent.matches«   s   € àŒ~ ZÐ/Ð/r   Nr=   r>   r   r   r   r   r   £   sP   € € € € € € ØFÐFà€N€N�NØAØ*>€DÐ>Ð>Ð>Ñ>Ø1ð0ð 0ð 0ð 0ð 0ð 0r   r   Ú	Conditionr2   z^[a-zA-Z_][a-zA-Z0-9_]*$)rP   ÚtypeÚstringc                  ó*   — e Zd ZU dZded<   	 ded<   dS )r    z>A label pointing to a version with an inline serialized value.ÚintÚversionr/   Úserialized_valueN©r?   r@   rA   rB   rC   r   r   r   r    r    Æ   s0   € € € € € € ØHÐHà€L€L�LØ2ØÐÐÑØ5Ð5r   r    c                  ó.   — e Zd ZU dZdZded<   	 ded<   dS )r!   z\A label pointing to a version via a reference to another label, 'latest', or 'code_default'.Nz
int | Nonera   r/   Úref)r?   r@   rA   rB   ra   rC   r   r   r   r!   r!   Ï   s5   € € € € € € ØfÐfà€GÐÐÐÑØ`Ø€H€H�HØBÐBr   r!   c                  ó*   — e Zd ZU dZded<   	 ded<   dS )r"   z-The latest (highest) version of the variable.r`   ra   r/   rb   Nrc   r   r   r   r"   r"   Ø   s0   € € € € € € Ø7Ð7à€L€L�LØ3ØÐÐÑØ:Ð:r   r"   c                  ó~   — e Zd ZU dZi Zded<   	 edd„¦   «         Z ed¦  «        e	dd„¦   «         ¦   «         Z
dd„ZdS )r#   z>Configuration for label selection with weighted probabilities.údict[str, float]Úlabelsr   ú$tuple[list[str | None], list[float]]c                ó(  — g }g }| j                              ¦   «         D ]/\  }}|                     |¦  «         |                     |¦  «         Œ0dt          |¦  «        z
  }|dk    r*|                     d ¦  «         |                     |¦  «         ||fS )Né   r   )ri   ÚitemsÚappendÚsum)r;   Ú
populationÚweightsÚkÚvÚp_nones         r   Ú_population_and_weightszRollout._population_and_weightsè   s¢   € ð (*ˆ
Ø!ˆØ”K×%Ò%Ñ'Ô'ð 	ð 	‰DˆAˆqØ×Ò˜aÑ Ô Ð Ø�NŠN˜1ÑÔÐÐà•S˜‘\”\Ñ!ˆØ�AŠ:ˆ:Ø×Ò˜dÑ#Ô#Ð#Ø�NŠN˜6Ñ"Ô"Ð"Ø˜7Ð"Ð"r   rs   c                óâ   — t          d„ |                     ¦   «         D ¦   «         ¦  «        rt          d¦  «        ‚t          |                     ¦   «         ¦  «        dk    rt          d¦  «        ‚|S )Nc              3  ó"   K  — | ]
}|d k     V — ŒdS )r   Nr   )Ú.0Úweights     r   ú	<genexpr>z6Rollout._validate_label_proportions.<locals>.<genexpr>ü   s&   è è € Ð3Ð3˜fˆv˜ŠzÐ3Ð3Ð3Ð3Ð3Ð3r   z'Label proportions must not be negative.g0¸D   ð?z.Label proportions must not sum to more than 1.)ÚanyrH   Ú
ValueErrorro   )Úclsrs   s     r   Ú_validate_label_proportionsz#Rollout._validate_label_proportions÷   sh   € õ
 Ð3Ð3¨¯ª©
¬
Ð3Ñ3Ô3Ñ3Ô3ð 	HÝÐFÑGÔGÐGÝˆq�xŠx‰zŒz‰?Œ?˜ZÒ'Ð'ÝÐMÑNÔNÐNØˆr   Úseedú
str | Nonec                óˆ   — | j         sdS t          j        |¦  «        }| j        \  }}|                     ||¦  «        d         S )a—  Select a label based on configured weights using optional seeded randomness.

        Args:
            seed: Optional seed for deterministic label selection. If provided, the same seed
                will always select the same label.

        Returns:
            The name of the selected label, or None if no label is selected
            (when labels is empty or weights sum to less than 1.0).
        Nr   )ri   ÚrandomÚRandomru   Úchoices)r;   r   Úrandrp   rq   s        r   Úselect_labelzRollout.select_label  sH   € ð Œ{ð 	Ø�4ÝŒ}˜TÑ"Ô"ˆØ"Ô:Ñˆ
�GØ�|Š|˜J¨Ñ0Ô0°Ô3Ð3r   N)r   rj   )rs   rh   )r   r€   r   r€   )r?   r@   rA   rB   ri   rC   r   ru   r   Úclassmethodr~   r†   r   r   r   r#   r#   á   s›   € € € € € € ØHÐHà!€FÐ!Ð!Ð!Ñ!ð/ð ð#ð #ð #ñ „_ð#ð €_�XÑÔØðð ð ñ „[ñ Ôðð4ð 4ð 4ð 4ð 4ð 4r   r#   c                  ó*   — e Zd ZU dZded<   	 ded<   dS )r$   zDAn override of the default rollout when specific conditions are met.úlist[Condition]Ú
conditionsr#   ÚrolloutNrc   r   r   r   r$   r$     s3   € € € € € € ØNÐNàÐÐÑØLØÐÐÑØEÐEr   r$   c                  óþ   — e Zd ZU dZded<   	 dZded<   	 i Zded<   	 d	ed
<   	 ded<   	 dZded<   	 dZded<   	 dZ	ded<   	 dZ
ded<   	 dZded<   	  ed¬¦  «        d„ ¦   «         Z	 d'd(d„Z	 	 d'ddœd)d „Z	 d*d+d&„ZdS ),r+   zZConfiguration for a single managed variable including labels, versions, and rollout rules.ÚVariableNameÚnameNr€   Údescriptionz"dict[str, LabeledValue | LabelRef]ri   r#   r‹   zlist[RolloutOverride]Ú	overrideszLatestVersion | NoneÚlatest_versionzdict[str, Any] | NoneÚjson_schemaÚ	type_namezlist[VariableName] | NoneÚaliasesÚexampleÚafter©Úmodec           	     ó¸  — | j         j        D ]}|| j        vrt          d|›d�¦  «        ‚Œt          | j        ¦  «        D ]3\  }}|j         j        D ]!}|| j        vrt          d|›d|› d�¦  «        ‚Œ"Œ4| j                             ¦   «         D ]L\  }}t          |t          ¦  «        r2|j        dvr)|j        | j        vrt          d|›d|j        ›d�¦  «        ‚ŒM| S )NzLabel z8 present in `rollout.labels` is not present in `labels`.z present in `overrides[z&].rollout` is not present in `labels`.)ÚlatestÚcode_defaultz	 has ref z" which is not present in `labels`.)	r‹   ri   r|   Ú	enumerater�   rm   rR   r!   re   )r;   rr   ÚiÚoverrideÚlabeled_values        r   Ú_validate_labelszVariableConfig._validate_labels:  s:  € ð ”Ô$ð 	ið 	iˆAØ˜œÐ#Ð#Ý Ð!g¨!Ð!gÐ!gÐ!gÑhÔhÐhð $õ % T¤^Ñ4Ô4ð 	uð 	u‰KˆAˆxØÔ%Ô,ð uð u�Ø˜DœKÐ'Ð'Ý$Ð%s¨aÐ%sÐ%sÈ!Ð%sÐ%sÐ%sÑtÔtÐtð (ðuð
 !%¤× 1Ò 1Ñ 3Ô 3ð 	uð 	uÑˆAˆ}Ý˜-­Ñ2Ô2ð u°}Ô7HÐPjÐ7jÐ7jØ Ô$¨D¬KÐ7Ð7Ý$Ð%s¨aÐ%sÐ%s¸MÔ<MÐ%sÐ%sÐ%sÑtÔtÐtøàˆr   Útargeting_keyr3   úMapping[str, Any] | Noner   c                óº   — |€i }| j         }| j        }|}|D ] }t          |j        |¦  «        r	|j         } nŒ!|€dn| j        ›d|›�}|                     |¦  «        S )a¾  Evaluate rollout rules and return the selected label name.

        The resolution process:
        1. Evaluate overrides in order; the first match takes precedence
        2. Select a label based on the rollout weights (deterministic if targeting_key is provided)

        Args:
            targeting_key: A string identifying the subject of evaluation (e.g., user ID).
                When provided, ensures deterministic label selection for the same key.
            attributes: Additional attributes for condition matching in override rules.

        Returns:
            The name of the selected label, or None if no label is selected (empty rollout
            means 'use code default').
        Nú:)r‹   r�   Ú_matches_all_conditionsrŠ   rŽ   r†   )r;   r¡   r3   Úbase_rolloutÚbase_overridesÚselected_rolloutrž   r   s           r   Úresolve_labelzVariableConfig.resolve_labelO  s’   € ð$ ÐØˆJð ”|ˆØœˆð (ÐØ&ð 	ð 	ˆHÝ& xÔ':¸JÑGÔGð Ø#+Ô#3Ð Ø�ðð %Ð,ˆtˆt°T´YÐ2TÐ2TÀ=Ð2TÐ2TˆØ×,Ò,¨TÑ2Ô2Ð2r   ©Úlabelr«   ú)tuple[str | None, str | None, int | None]c               ó  — |�9| j                              |¦  «        }|�|                      |¦  «        \  }}|||fS |                      ||¦  «        }|�9| j                              |¦  «        }|�|                      |¦  «        \  }}|||fS dS )a3  Resolve the serialized value for this variable.

        Resolution order:
        1. If explicit label requested, look up in labels, follow refs
        2. If rollout selects a label, look up, follow refs
        3. If no label selected (empty rollout or remainder probability), use code default

        Following refs: if a LabeledValue has a `ref`, look up that label's value.
        If ref == 'latest', use latest_version.
        If ref == 'code_default', return (None, None, None) to trigger code default fallthrough.

        Args:
            targeting_key: A string identifying the subject of evaluation (e.g., user ID).
            attributes: Additional attributes for condition matching in override rules.
            label: Optional explicit label to select, bypassing rollout.

        Returns:
            A tuple of (serialized_value, label, version) where:
            - serialized_value is the JSON-serialized value or None
            - label is the name of the label that was selected or None
            - version is the version number or None
        N)NNN)ri   r8   Ú
follow_refr©   )r;   r¡   r3   r«   rŸ   Ú
serializedra   Úselected_labels           r   Úresolve_valuezVariableConfig.resolve_valuer  s§   € ð< ÐØ œKŸOšO¨EÑ2Ô2ˆMØÐ(Ø&*§o¢o°mÑ&DÔ&DÑ#�
˜GØ! 5¨'Ð1Ð1ð ×+Ò+¨M¸:ÑFÔFˆàÐ%Ø œKŸOšO¨NÑ;Ô;ˆMØÐ(Ø&*§o¢o°mÑ&DÔ&DÑ#�
˜GØ! >°7Ð:Ð:ð  Ðr   rŸ   úLabeledValue | LabelRefÚ_visitedúset[str] | Noneútuple[str | None, int | None]c                óÀ  — t          |t          ¦  «        r¼|j        dk    rdS |j        dk    r(| j        �| j        j        | j        j        fS d|j        fS |€t          ¦   «         }|j        |v r	d|j        fS |                     |j        ¦  «         | j         	                    |j        ¦  «        }|€	d|j        fS |  
                    ||¦  «        S |j        |j        fS )a   Follow ref chains to get the actual serialized value.

        Args:
            labeled_value: The LabeledValue or LabelRef to resolve.
            _visited: Set of already-visited ref names to detect cycles.

        Returns:
            A tuple of (serialized_value, version).
        r›   ©NNrš   N)rR   r!   re   r‘   rb   ra   ÚsetÚaddri   r8   r®   )r;   rŸ   r³   Útargets       r   r®   zVariableConfig.follow_ref£  sõ   € õ �m¥XÑ.Ô.ð 	5ØÔ  NÒ2Ð2Ø!�zàÔ  HÒ,Ð,àÔ&Ð2ØÔ.Ô?ÀÔATÔA\Ð\Ð\Ø˜]Ô2Ð2Ð2ð ÐÝ™5œ5�ØÔ  HÐ,Ð,à˜]Ô2Ð2Ð2Ø�LŠL˜Ô*Ñ+Ô+Ð+à”[—_’_ ]Ô%6Ñ7Ô7ˆFØˆ~Ø˜]Ô2Ð2Ð2Ø—?’? 6¨8Ñ4Ô4Ð4àÔ-¨}Ô/DÐDÐDr   r·   )r¡   r€   r3   r¢   r   r€   )r¡   r€   r3   r¢   r«   r€   r   r¬   r   )rŸ   r²   r³   r´   r   rµ   )r?   r@   rA   rB   rC   r�   ri   r‘   r’   r“   r”   r•   r   r    r©   r±   r®   r   r   r   r+   r+     sy  € € € € € € ØdÐdð
 ÐÐÑØ0Ø"€KÐ"Ð"Ð"Ñ"Ø&Ø13€FÐ3Ð3Ð3Ñ3Ø9ØÐÐÑØ<Ø$Ð$Ð$Ñ$ØQØ+/€NÐ/Ð/Ð/Ñ/ØNØ)-€KÐ-Ð-Ð-Ñ-ØMØ €IÐ Ð Ð Ñ ØEØ)-€GÐ-Ð-Ð-Ñ-ØVØ€GÐÐÐÑØið €_˜'Ð"Ñ"Ô"ðð ñ #Ô"ðð* X\ð!3ð !3ð !3ð !3ð !3ðJ %)Ø/3ð/ ð
 !ð/ ð / ð / ð / ð / ð / ðd SWð#Eð #Eð #Eð #Eð #Eð #Eð #Er   r+   c                  ó®   — e Zd ZU dZded<   	  ed¬¦  «        d„ ¦   «         Zedd	„¦   «         Zd d„Z		 	 d!ddœd"d„Z
d#d„Zd$d„Zed%d„¦   «         Zd&d„ZdS )'r,   z2Container for all managed variable configurations.z"dict[VariableName, VariableConfig]Ú	variablesr–   r—   c                ó�   — | j                              ¦   «         D ]+\  }}|j        |k    rt          d|›d|j        ›d�¦  «        ‚Œ,| S )Nz#`variables` has invalid lookup key z for value with name ú.)r¼   rm   rŽ   r|   )r;   rr   rs   s      r   Ú_validate_variablesz#VariablesConfig._validate_variablesÏ  sb   € ð ”N×(Ò(Ñ*Ô*ð 	nð 	n‰DˆAˆqØŒv˜Š{ˆ{Ý Ð!lÀqÐ!lÐ!lÐabÔagÐ!lÐ!lÐ!lÑmÔmÐmð àˆr   r   údict[VariableName, str]c                óx   — i }| j                              ¦   «         D ]}|j        r|j        D ]}|j        ||<   ŒŒ|S r   )r¼   rH   r”   rŽ   )r;   Ú	alias_mapÚ
var_configÚaliass       r   Ú
_alias_mapzVariablesConfig._alias_map×  sY   € ð 79ˆ	Øœ.×/Ò/Ñ1Ô1ð 	7ð 	7ˆJØÔ!ð 7Ø'Ô/ð 7ð 7�EØ'1¤�I˜eÑ$Ð$øØÐr   ÚNonec                ó<   — | j                              dd¦  «         dS )zBInvalidate the cached alias map so it gets rebuilt on next access.rÅ   N)Ú__dict__Úpop)r;   s    r   Ú_invalidate_alias_mapz%VariablesConfig._invalidate_alias_mapá  s    € àŒ×Ò˜,¨Ñ-Ô-Ð-Ð-Ð-r   Nrª   rŽ   r�   r¡   r€   r3   r¢   r«   úResolvedVariable[str | None]c               ó¾   — |                       |¦  «        }|€t          |dd¬¦  «        S |                     |||¬¦  «        \  }}}t          |j        |||d¬¦  «        S )aÙ  Evaluate a managed variable configuration and resolve the selected value.

        Args:
            name: The name of the variable to resolve.
            targeting_key: Optional key for deterministic label selection.
            attributes: Optional attributes for condition matching.
            label: Optional explicit label to select, bypassing rollout.

        Returns:
            A ResolvedVariable containing the serialized value (or None if not found).
        NÚunrecognized_variable)rŽ   r1   Úreasonrª   Úresolved)rŽ   r1   r«   ra   rÎ   )Ú_get_variable_configr   r±   rŽ   )	r;   rŽ   r¡   r3   r«   Úvariable_configrb   r°   ra   s	            r   Úresolve_serialized_valuez(VariablesConfig.resolve_serialized_valueå  sˆ   € ð& ×3Ò3°DÑ9Ô9ˆØÐ"Ý#¨°TÐBYÐZÑZÔZÐZà4C×4QÒ4QØ˜:¨Uð 5Rñ 5
ô 5
Ñ1Ð˜.¨'õ  Ø Ô%Ø"Ø ØØð
ñ 
ô 
ð 	
r   úVariableConfig | Nonec                óž   — | j                              |¦  «        }|�|S || j        v r%| j                              | j        |         ¦  «        S d S r   )r¼   r8   rÅ   )r;   rŽ   Úconfigs      r   rÐ   z$VariablesConfig._get_variable_config  sS   € à”×#Ò# DÑ)Ô)ˆØÐØˆMð �4”?Ð"Ð"Ø”>×%Ò% d¤o°dÔ&;Ñ<Ô<Ð<àˆtr   úlist[Variable[Any]]ú&dict[str, dict[str | None, Exception]]c                óÄ  — i }|D �]Y}	 |                       |j        ¦  «        }|€t          d|j        ›�¦  «        ‚|j                             ¦   «         D ]p\  }}t          |t          ¦  «        rV	 |j                             |j	        ¦  «         Œ;# t          $ r(}||                     |j        i ¦  «        |<   Y d}~Œhd}~ww xY wŒq|j        �[	 |j                             |j        j	        ¦  «         n5# t          $ r(}||                     |j        i ¦  «        d<   Y d}~nd}~ww xY w�Œ%# t          $ r)}||                     |j        i ¦  «        d<   Y d}~�ŒSd}~ww xY w|S )aF  Validate that all variable label values can be deserialized to their expected types.

        Args:
            variables: List of Variable instances to validate against this configuration.

        Returns:
            A dict mapping variable names to dicts of label names (or None for general errors) to exceptions.
        Nz!No config for variable with name rš   )rÐ   rŽ   r|   ri   rm   rR   r    Útype_adapterÚvalidate_jsonrb   r   Ú
setdefaultr‘   Ú	Exception)r;   r¼   ÚerrorsÚvariablerÕ   rr   rŸ   Úes           r   Úget_validation_errorsz%VariablesConfig.get_validation_errors  sÍ  € ð :<ˆØ!ð 	?ñ 	?ˆHð?Ø×2Ò2°8´=ÑAÔA�Ø�>Ý$Ð%ZÈÌÐ%ZÐ%ZÑ[Ô[Ð[à(.¬×(;Ò(;Ñ(=Ô(=ð Hð HÑ$�A�}Ý! -µÑ>Ô>ð HðHØ$Ô1×?Ò?ÀÔ@^Ñ_Ô_Ð_Ð_øÝ.ð Hð Hð HØFG˜F×-Ò-¨h¬m¸RÑ@Ô@ÀÑCÐCÐCÐCÐCÐCøøøøðHøøøðHð Ô(Ð4ðKØ Ô-×;Ò;¸FÔ<QÔ<bÑcÔcÐcÐcøÝ*ð Kð Kð KØIJ˜×)Ò)¨(¬-¸Ñ<Ô<¸XÑFÐFÐFÐFÐFÐFøøøøðKøøøùøåð ?ð ?ð ?Ø=>�×!Ò! (¤-°Ñ4Ô4°TÑ:Ð:Ð:Ð:Ð:Ñ:øøøøð?øøøàˆsl   ‰A&D*Á0BÂD*Â
CÂB=Â8D*Â=CÃD*Ã$C3Ã2D*Ã3
D%Ã=D ÄD*Ä D%Ä%D*Ä*
EÄ4EÅEc           
     óf  — ddl m} i }| D ]—}|j                             ¦   «         }d} ||j        ¦  «        s2|j                             |j        ¦  «                             d¦  «        }t          |j        |j	        i t          i ¬¦  «        g ||¬¦  «        }|||j        <   Œ˜t          |¬¦  «        S )a¾  Create a VariablesConfig from a list of Variable instances.

        This creates a minimal config with just the name, schema, and example for each variable.
        No labels or versions are created - use this to generate a template config that can be edited.

        Args:
            variables: List of Variable instances to create configs from.

        Returns:
            A VariablesConfig with minimal configs for each variable.
        r   )Úis_resolve_functionNzutf-8)ri   )rŽ   r�   ri   r‹   r�   r’   r•   ©r¼   )Úlogfire.variables.variablerâ   rÙ   r’   ÚdefaultÚ	dump_jsonÚdecoder+   rŽ   r�   r#   r,   )r¼   râ   Úvariable_configsrÞ   r’   r•   rÕ   s          r   Úfrom_variableszVariablesConfig.from_variables3  sã   € ð 	CÐBÐBÐBÐBÐBà?AÐØ!ð 	5ð 	5ˆHà"Ô/×;Ò;Ñ=Ô=ˆKð #'ˆGØ&Ð& xÔ'7Ñ8Ô8ð \Ø"Ô/×9Ò9¸(Ô:JÑKÔK×RÒRÐSZÑ[Ô[�å#Ø”]Ø$Ô0ØÝ rÐ*Ñ*Ô*ØØ'Øðñ ô ˆFð /5Ð˜Xœ]Ñ+Ð+åÐ)9Ð:Ñ:Ô:Ð:r   Úotherc                ó~   — t          | j        ¦  «        }|                     |j        ¦  «         t          |¬¦  «        S )a(  Merge another VariablesConfig into this one.

        Variables in `other` will override variables with the same name in this config.

        Args:
            other: Another VariablesConfig to merge.

        Returns:
            A new VariablesConfig with variables from both configs.
        rã   )Údictr¼   Úupdater,   )r;   rê   Úmerged_variabless      r   ÚmergezVariablesConfig.mergeY  s<   € õ   ¤Ñ/Ô/ÐØ×Ò ¤Ñ0Ô0Ð0ÝÐ)9Ð:Ñ:Ô:Ð:r   )r   rÀ   )r   rÆ   r·   )
rŽ   r�   r¡   r€   r3   r¢   r«   r€   r   rË   )rŽ   r�   r   rÓ   )r¼   rÖ   r   r×   )r¼   rÖ   r   r,   )rê   r,   r   r,   )r?   r@   rA   rB   rC   r   r¿   r   rÅ   rÊ   rÒ   rÐ   rà   Ústaticmethodré   rï   r   r   r   r,   r,   É  s  € € € € € € Ø<Ð<à1Ð1Ð1Ñ1Ø<à€_˜'Ð"Ñ"Ô"ðð ñ #Ô"ðð ðð ð ñ „_ðð.ð .ð .ð .ð %)Ø/3ð	 
ð !ð 
ð  
ð  
ð  
ð  
ð  
ðD
ð 
ð 
ð 
ðð ð ð ð@ ð#;ð #;ð #;ñ „\ð#;ðJ;ð ;ð ;ð ;ð ;ð ;r   r,   rŠ   r‰   r3   r4   r5   c                ó@   — | D ]}|                      |¦  «        s dS ŒdS )zðCheck if all conditions match the provided attributes.

    Args:
        conditions: List of conditions to evaluate.
        attributes: Attributes to match against.

    Returns:
        True if all conditions match, False otherwise.
    FT)r<   )rŠ   r3   Ú	conditions      r   r¥   r¥   i  s:   € ð  ð ð ˆ	Ø× Ò  Ñ,Ô,ð 	Ø�5�5ð	àˆ4r   c                  óJ   — e Zd ZU dZded<   	 ded<   	 dZded<   	 dZded	<   dS )
r-   z?Configuration for a variable type (reusable schema definition).r/   rŽ   zdict[str, Any]r’   Nr€   r�   Úsource_hint)r?   r@   rA   rB   rC   r�   rô   r   r   r   r-   r-   y  sX   € € € € € € ØIÐIà€I€I�IØOØÐÐÑØ4Ø"€KÐ"Ð"Ð"Ñ"Ø2Ø"€KÐ"Ð"Ð"Ñ"ØfÐfr   r-   Útr/   c                óX   — t          | t          ¦  «        r| j        S t          | ¦  «        S )a?  Get the default name for a Python type.

    For regular classes, returns __name__ (e.g., 'FeatureConfig').
    For unions, generics, or other complex types, returns str(type) (e.g., 'FeatureConfig | None').

    Args:
        t: The Python type to get a name for.

    Returns:
        A string name for the type.
    )rR   r]   r?   r/   )rõ   s    r   Úget_default_type_namer÷   †  s)   € õ �!•TÑÔð ØŒzÐÝˆq‰6Œ6€Mr   r€   c                óŠ   — t          | t          ¦  «        r-t          | dd¦  «        }t          | dd¦  «        }|r	|r|› d|› �S dS )zëGet a source hint for a type based on its module and qualname.

    Args:
        t: The Python type to get a source hint for.

    Returns:
        A source hint string like 'myapp.config.FeatureConfig', or None if not available.
    r@   NrA   r¾   )rR   r]   Úgetattr)rõ   ÚmoduleÚqualnames      r   Úget_source_hintrü   —  s`   € õ �!•TÑÔð *Ý˜˜L¨$Ñ/Ô/ˆÝ˜1˜n¨dÑ3Ô3ˆØð 	*�hð 	*ØÐ)Ð)˜xÐ)Ð)Ð)Øˆ4r   )r   r   r   r   r   r   )rŠ   r‰   r3   r4   r   r5   )rõ   r   r   r/   )rõ   r   r   r€   )7Ú
__future__r   Ú_annotationsr‚   rS   Úcollections.abcr   r   Ú	functoolsr   Útypingr   r   r	   Úpydanticr
   r   r   r   r   r   Útyping_extensionsr   Úlogfire._internal.configr   r   Úlogfire.variables.abstractr   rä   r   r   ÚImportErrorÚ__all__r'   r%   r(   r)   r*   r&   r   r   r\   r/   r�   r    r!   r"   r#   r$   r+   r,   r¥   r-   r÷   rü   r   r   r   ú<module>r     s2  ðØ 2Ð 2Ð 2Ð 2Ð 2Ð 2à €€€Ø 	€	€	€	Ø -Ð -Ð -Ð -Ð -Ð -Ð -Ð -Ø %Ð %Ð %Ð %Ð %Ð %Ø *Ð *Ð *Ð *Ð *Ð *Ð *Ð *Ð *Ð *à hÐ hÐ hÐ hÐ hÐ hÐ hÐ hÐ hÐ hÐ hÐ hÐ hÐ hÐ hÐ hØ +Ð +Ð +Ð +Ð +Ð +ðð ð ð ð ð ð ð ð 8Ð 7Ð 7Ð 7Ð 7Ð 7Ø /Ð /Ð /Ð /Ð /Ð /ðØ&Ð&Ð&Ð&Ð&Ð&Ð&øØð ð ð ðð ð ð ð ð ðøøøð€ð*Fð Fð Fð Fð F�)ñ Fô Fð FðFð Fð Fð Fð F˜	ñ Fô Fð Fð $ð $ð $ð $ð $�	ñ $ô $ð $ð (ð (ð (ð (ð (�9ñ (ô (ð (ð"4ð 4ð 4ð 4ð 4˜	ñ 4ô 4ð 4ð$2ð 2ð 2ð 2ð 2˜Yñ 2ô 2ð 2ð(
,ð 
,ð 
,ð 
,ð 
,�9ñ 
,ô 
,ð 
,ð
0ð 
0ð 
0ð 
0ð 
0�iñ 
0ô 
0ð 
0ð ˆMØØØØ
ñ	à
ñ	ð ñ	ð ñ		ð
 !ñ	!ð ñ	ð ñ	ð 	ˆ�fÑÔð	ô
ñô €	ð  ˜˜e˜eÐ,GÐHÑHÔHÈ.È.ÐZ`ÐbjÐYkÑJlÔJlÐlÔm€ð8ð
6ð 6ð 6ð 6ð 6�9ñ 6ô 6ð 6ðCð Cð Cð Cð Cˆyñ Cô Cð Cð;ð ;ð ;ð ;ð ;�Iñ ;ô ;ð ;ð04ð 04ð 04ð 04ð 04ˆiñ 04ô 04ð 04ðfFð Fð Fð Fð F�iñ Fô Fð FðiEð iEð iEð iEð iE�Yñ iEô iEð iEðX];ð ];ð ];ð ];ð ];�iñ ];ô ];ð ];ð@ð ð ð ð 
gð 
gð 
gð 
gð 
g˜ñ 
gô 
gð 
gðð ð ð ð"ð ð ð ð ð s   ÁA Á	A%Á$A%