
    \jX                     P   d dl mZ d dlmZmZ d dlmZ d dlmZm	Z	 d dl
 d dlZd dlZd dlmZmZmZmZmZmZ  ej(                  d      Z ed	      Zg d
Z G d d      Z G d de      Z G d d      ZdedededefdZ dededefdZ!dede"dededef
dZ#dede"dedeee   e$f   fdZ%dee   dedee&   de&de&dee'   defd Z(dee&   fd!Z)dedee&   d"e*e&   de$f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$fd)Z/d&e-d*e$de$fd+Z0d,e1de&fd-Z2ded.edefd/Z3d0e&defd1Z4y)2    )Context)BigSegmentsStatusEvaluationDetail)	operators)EventFactoryEventInputEvaluation)*N)AnyCallableDictListOptionalTuplezldclient.flagl   )
key	secondaryipcountryemail	firstNamelastNameavatarname	anonymousc                   2    e Zd Zg dZd ZdefdZdefdZy)
EvalResultdetaileventsbig_segments_statusbig_segments_membershiporiginal_flag_keyprereq_stacksegment_stackc                 f    d | _         d | _        d | _        d | _        d | _        d | _        d | _        y Nr   selfs    A/root/env/lib/python3.12/site-packages/ldclient/impl/evaluator.py__init__zEvalResult.__init__   s8    #' '+$!% !    eventc                 `    | j                   g | _         | j                   j                  |       y r%   )r   append)r'   r+   s     r(   	add_eventzEvalResult.add_event&   s%    ;;DK5!r*   returnc                 <    d| j                   d| j                  dS )NzEvalResult(detail=z	, events=))r   r   r&   s    r(   __repr__zEvalResult.__repr__+   s    59[[$++NNr*   N)	__name__
__module____qualname__	__slots__r)   r   r.   strr2    r*   r(   r   r      s)    >I""3 "
O# Or*   r   c                   J    e Zd ZddedefdZedefd       Zedefd       Zy)	EvaluationExceptionmessage
error_kindc                      || _         || _        y r%   )_message_error_kind)r'   r;   r<   s      r(   r)   zEvaluationException.__init__0   s    %r*   r/   c                     | j                   S r%   )r>   r&   s    r(   r;   zEvaluationException.message4   s    }}r*   c                     | j                   S r%   )r?   r&   s    r(   r<   zEvaluationException.error_kind8   s    r*   N)MALFORMED_FLAG)r3   r4   r5   r7   r)   propertyr;   r<   r8   r*   r(   r:   r:   /   sK    & & &     C    r*   r:   c                      e Zd ZdZ	 ddeegee   f   deegee   f   deege	ee
   ef   f   deej                     fdZded	ed
edefdZded	eded
edef
dZded	eded
edee
   f
dZded	edee   fdZded	ededefdZded	ededefdZded	ededefdZded	edededef
dZded	ededededefdZded	ededefdZy)	Evaluatora  
    Encapsulates the feature flag evaluation logic. The Evaluator has no knowledge of the rest of the SDK environment;
    if it needs to retrieve flags or segments that are referenced by a flag, it does so through a read-only interface
    that is provided in the constructor. It also produces feature events as appropriate for any referenced prerequisite
    flags, but does not send them.
    Nget_flagget_segmentget_big_segments_membershiploggerc                 <    || _         || _        || _        || _        y)a  
        :param get_flag: function provided by LDClient that takes a flag key and returns either the flag or None
        :param get_segment: same as get_flag but for segments
        :param get_big_segments_membership: takes a context key (not a context hash) and returns a tuple of
            (membership, status) where membership is as defined in BigSegmentStore, and status is one
            of the BigSegmentStoreStatus constants
        N)_Evaluator__get_flag_Evaluator__get_segment'_Evaluator__get_big_segments_membership_Evaluator__logger)r'   rF   rG   rH   rI   s        r(   r)   zEvaluator.__init__D   s"     #(-H*r*   flagcontextevent_factoryr/   c                    t               }|j                  |_        	 | j                  ||||      |_        |j                  #|j                  |j                  j                  d<   |S # t
        $ rl}| j                  5| j                  j                  d|j                  d|j                         t        d d d|j                  d      |_        |cY d }~S d }~ww xY w)NzCould not evaluate flag "z": ERRORkind	errorKindbigSegmentsStatus)r   r   r!   	_evaluater   r:   rN   errorr;   r   r<   r   reason)r'   rO   rP   rQ   statees         r(   evaluatezEvaluator.evaluateW   s    "&((	>>$NEL $$07<7P7PELL 34 # 	}}(##$((TUT]T]$^_+D$WXWcWc8deELL		s   A' '	C0A!CCCr[   c           
         |j                   st        |ddi      S | j                  ||||      }|t        ||      S | j                  ||      }||S t	        |j
                        D ]@  \  }}| j                  |||      st        ||j                  |d||j                  d      c S  t        ||j                  |ddi      S )NrU   OFF
RULE_MATCH)rU   	ruleIndexruleIdFALLTHROUGH)on_get_off_value_check_prerequisites_check_targets	enumeraterules_rule_matches_context#_get_value_for_variation_or_rolloutvariation_or_rolloutidfallthrough)	r'   rO   rP   r[   rQ   prereq_failure_reasontarget_resultindexrules	            r(   rX   zEvaluator._evaluatee   s    ww!$88 $ 9 9$P] ^ ,!$(=>> ++D':$   %TZZ0 	SKE4))$?:4AZAZ\c)QS S	S 349I9I7U[]jTkllr*   c                 b   d }d }|j                   j                  dk(  ry 	 |j                  }||j                  k7  r.|j                  g |_        |j                  j                  |       |j                   D ]1  }|j                  }	|	|j                  k(  s$|j                  &|j                  |j                  v rt        d|	z        | j                  |	      }
|
t        j                  d|	z          |}na| j                  |
|||      }|
j                  r|j                  |j                  k7  r|}|j                  |
||d |      }|j                  |       |sd|j                  dc |j                  4t!        |j                        dk7  r|j                  j#                          S S S  	 |j                  4t!        |j                        dk7  r|j                  j#                          y y y # |j                  4t!        |j                        dk7  r|j                  j#                          w w w xY w)Nr   zprerequisite relationship to "%s" caused a circular reference; this is probably a temporary condition due to an incomplete updatezMissing prereq flag: PREREQUISITE_FAILED)rU   prerequisiteKey)prerequisitescountr   r!   r"   r-   r:   rK   logwarningrX   rd   variation_index	variationnew_eval_eventr.   lenpop)r'   rO   rP   r[   rQ   failed_prereq
prereq_resflag_keyprereq
prereq_keyprereq_flagr+   s               r(   rf   zEvaluator._check_prerequisites{   s!   
##q(#	)
 xxH5222%%-)+E&""))(3,, a#ZZ
%"9"99''3

eFXFX8X- 0^ak/l m m #ooj9&KK 7* DE$*M!%We]![J (NNz/I/IVM]M]/](.)88gz[_aefEOOE* $9mN_N_`` !!-#e6H6H2IQ2N""&&( 3O-/a* !!-#e6H6H2IQ2N""&&( 3O-u!!-#e6H6H2IQ2N""&&( 3O-s   D7G, G, )G, ,AH.c                    |j                   }|j                  }t        |      dk(  rjt        |      dk7  r[|j                  t        j
                        }|y |j                  }|D ](  }||j                  v st        ||j                        c S  y |D ]  }|j                  xs t        j
                  }|j                  }	|j                  |      }
|
A|
j                  }|t        j
                  k(  r7|D ]1  }|j                  |	k(  s||j                  v rt        ||	      c c S  n ||j                  v st        ||	      c S  y )Nr   )targetscontext_targetsr}   get_individual_contextr   DEFAULT_KINDr   values_target_match_resultr{   context_kind)r'   rO   rP   user_targetsr   user_contextr   trU   varactual_contextuts               r(   rg   zEvaluator._check_targets   sC   ||..1$< A%&==g>R>RS ("&&% GAahh3D!++FFG   	7A>>9W%9%9D++C$;;DAN% $$Cw+++& B||s*"))+#7c#BB	
 ahh+D#66	7  r*   rr   c                 P    |j                   D ]  }| j                  |||      r y yNFT)clauses_clause_matches_context)r'   rr   rP   r[   clauses        r(   rj   zEvaluator._rule_matches_context   s/    ll 	F//G	 r*   r   c                 l   |j                   dk(  rR|j                  D ]7  }| j                  |      }|| j                  |||      s+t	        |d      c S  t	        |d      S |j
                  }|y|j                  dk(  r|d   dk(  rt	        |t        ||            S |j                  |j                  xs t        j                        }|yt        ||      }|yt        |t        t        f      r-|D ]  }	t!        ||	      st	        |d      c S  t	        |d      S t	        |t!        ||            S )NsegmentMatchTF   r   rU   )opr   rL   _segment_matches_context_maybe_negate	attributedepth_match_clause_by_kindr   r   r   r   _get_context_value_by_attr_ref
isinstancelisttuple_match_single_context_value)
r'   r   rP   r[   seg_keysegmentattrr   context_valuevs
             r(   r   z!Evaluator._clause_matches_context   s=   99&!== 7,,W5&4+H+HRY[`+a(667 !//<::?tAw&0 )>vw)OPP 778K8K8cwOcOcd!6~tL  mdE]3" 7.vq9(667 !//V%@%WXXr*   r   c                     |j                   0|j                  |j                   v rt        d|j                  z        |j                  r| j	                  |||      S | j                  |||d      S )Nzsegment rule referencing segment "%s" caused a circular reference; this is probably a temporary condition due to an incomplete updateT)r#   r   r:   	unbounded_big_segment_match_context_simple_segment_match_context)r'   r   rP   r[   s       r(   r   z"Evaluator._segment_matches_context   sx    *w{{e>Q>Q/Q% (VY`YdYd'e f f227GUKK11'7E4PPr*   use_includes_and_excludesc                    |rt        |d |j                        ry|j                  D ]%  }t        ||j                  |j                        s% y t        |d |j
                        ry|j                  D ]%  }t        ||j                  |j                        s% y |j                  j                  dk7  r|j                  g |_	        |j                  j                  |j                         	 |j                  D ]G  }| j                  ||||j                  |j                        s- |j                  j                          y 	 |j                  j                          yy# |j                  j                          w xY w)NTFr   )_context_key_is_in_target_listincludedincluded_contextsr   r   excludedexcluded_contextsri   rw   r#   r-   r   _segment_rule_matches_contextsaltr~   )r'   r   rP   r[   r   r   rr   s          r(   r   z'Evaluator._simple_segment_match_context   sN   $-gtW=M=MN..  1'1>>188T  .gtW=M=MN.. !1'1>>188T ! ==!# ""*&(#&&w{{3*#MM $D99$PWP[P[]d]i]ij# ##'')$ ##'') ##'')s   -8E  &E  E   E<segment_keyr   c                     |j                   D ]  }| j                  |||      r y |j                  yt        d ||j                  |||j
                        }|j                  dz  }||k  S )NFT     j@)r   r   weight_bucket_contextrollout_context_kind	bucket_by)	r'   rr   rP   r[   r   r   r   bucketr   s	            r(   r   z'Evaluator._segment_rule_matches_context  su    ll 	F//G	
 ;; !w0I0I;X\^b^l^lmx'r*   c                 P   |j                   }|t        j                  |_        y|j	                  |j
                  xs t        j                        }|y|j                  }d }d}|j                  ||j                  v rd}|j                  |   }|s_| j                  t        j                  |_        y| j                  |      }	|	\  }|_        |j                  i |_	        ||j                  |<   |d n|j                  t        |      d       }
|
|
S | j                  |||d      S r   )
generationr   NOT_CONFIGUREDr   r   unbounded_context_kindr   r   r   r    rM   get_make_big_segment_refr   )r'   r   rP   r[   r   match_contextr   
membershiphas_cached_membershipresultr   s              r(   r   z$Evaluator._big_segment_match_context  s?   ''

 ):(H(HE%  66w7U7U7mY`YmYmn 
 %((4e333(,%"::3?
 %119,=,L,L)77<F 5;1J1,,402-1;E))#.%-4:>>BWX_B`bf3gO11'7E5QQr*   r%   ) r3   r4   r5   __doc__r   r7   r   FeatureFlagSegmentr   dictloggingLoggerr)   r   r   r   r]   r   rX   rf   rg   FlagRuleboolrj   Clauser   r   r   SegmentRuler   r   r8   r*   r(   rE   rE   =   s3    ,0C5(;"778 seXg%667 &.seU8D>3;N5O.O%P	
 (&[ 7 < \f mk mG mJ m_k m  qA m,)) ))w ))z ))jv ))  |D  EI  |J ))V;  XN^E_ @( W Z \` Yf Yw Yz Y^b Y8Q Q' QR\ Qae QW w Wa   C   HL 6+  Xb qt |   EI *R' *RG *RT^ *Rcg *Rr*   rE   rO   r{   rZ   r/   c                     | j                   }|dk  s|t        |      k\  rt        d d t        d            S t        ||   ||      S )Nr   rB   )
variationsr}   r   error_reason)rO   r{   rZ   varss       r(   _get_variationr   I  sE    ??D1}	SY.dL9I,JKKDOY??r*   c                 R    | j                   }|t        d d |      S t        | ||      S r%   )off_variationr   r   )rO   rZ   off_vars      r(   re   re   O  s0      GdF33$00r*   vrrP   c                 z    t        | ||      \  }}|t        d d t        d            S |r||d<   t        | ||      S )NrB   inExperiment)_variation_index_for_contextr   r   r   )rO   r   rP   rZ   rq   r   s         r(   rk   rk   U  sK    6tRIE<}dL9I,JKK!-~$v..r*   c                    |j                   }||dfS |j                  }|y|j                  }t        |      dk(  ry|j                  rd n|j
                  }t        |j                  ||j                  | j                  | j                  |      }|j                  xr |dk\  }d}	|D ]:  }
|	|
j                  dz  z  }	||	k  s|xr |
j                   }|
j                   |fc S  |xr |d   j                   }|d   j                   |fS )NF)NFr           r   )r{   rolloutr   r}   is_experimentr   r   seedr   r   r   r   	untracked)rO   r   rP   r   r   r   r   r   r   sumwvis_experiment_partitions               r(   r   r   ]  s    
,,C
U|jjG##J
:!--73D3DI		
F ))9fkM C ;ryy8##C<&3&HBLL8H#LL"9::	; ,LJrN4L4L0LrN$$&=>>r*   r   r   r   r   r   c                 t   |j                  |xs t        j                        }|y||j                  nt	        ||      }|yt        |      }|y|}	| t        |       }
n|d|}
|
d|	}t        t        j                  |j                  d            j                         d d d      }|t        z  }|S )Nr   r   .zutf-8      )r   r   r   r   r   _bucketable_string_valuer7   inthashlibsha1encode	hexdigest__LONG_SCALE__)r   rP   r   r   r   r   r   clause_valuebucket_by_valueid_hashprefixhash_keyhash_valr   s                 r(   r   r     s     22<3W7CWCWXM(1(9=$$?]^kmv?wL.|<OGT& '*H7<< 89CCEcrJBOH&FMr*   c                 h    t        | t              ry t        | t        t        f      rt        |       S y r%   )r   r   r7   r   )u_values    r(   r   r     s*    '4 	Gc3Z	(7|r*   keysc                     |t        |      dk(  ry| j                  |xs t        j                        }|d uxr |j                  |v S )Nr   F)r}   r   r   r   r   )rP   r   r   r   s       r(   r   r     sJ    |s4yA~22<3W7CWCWXM$B):):d)BBr*   r   c                     |t        d      |j                  t        d|j                  z         |d   }|y | j                  |      }|j                  }d}||k  r0t	        |t
              sy |j                  ||         }|dz  }||k  r0|S )Nz(rule clause did not specify an attributezinvalid attribute reference: r   r   )r:   rY   r   r   r   r   )rP   r   r   valuer   is         r(   r   r     s    |!"LMMzz!"ADJJ"NOO7D|KKEJJE	A
e)%&		$q'"	Q	 e)
 Lr*   r   r   c                     t         j                  j                  | j                        }|y| j                  }t        | j                        D ]  \  }}|d n||   } ||||      s y yr   )r   opsr   r   values_preprocessedrh   r   )r   r   op_fnr  r  r   preprocesseds          r(   r   r     sq    MMfii(E} 44&--( 12:t@STU@V<0 r*   c                     t        |j                        D ].  }|j                  |      }|t        | |j                        s. y y)NTF)rangeindividual_context_countr   r   rU   )r   rP   r  cs       r(   r   r     sI     7334 **1-=8H r*   valc                 $    | j                   r| S |S r%   )negate)r   r  s     r(   r   r     s    mms7,,r*   r   c                 @    d| j                   | j                  xs dfz  S )Nz%s.g%dr   )r   r   )r   s    r(   r   r     s#     w{{G$6$6$;!<<<r*   r   c                      t        | |ddi      S )NrU   TARGET_MATCH)r   )rO   r   s     r(   r   r     s    $fn%=>>r*   r<   c                     d| dS )NrS   rT   r8   )r<   s    r(   r   r     s    *55r*   )5ldclient.contextr   ldclient.evaluationr   r   ldclient.implr   ldclient.impl.events.typesr   r   ldclient.impl.modelr   r   typingr
   r   r   r   r   r   	getLoggerrx   floatr   __BUILTINS__r   	Exceptionr:   rE   r   r   r   r   re   VariationOrRolloutrk   r   r   r7   AttributeRefr   r   Setr   r   r   r   r   r   r   r   r   r   r8   r*   r(   <module>r     sV   $ C # I !   = = g(()HO O, )  FR FRX@ @ @d @GW @1 1d 17G 1/k /?Q /\c /mq /  wG /&?{ &?8J &?U\ &?afgopsgtvzgza{ &?P
3- 3- 
	
  % 
6# CG C8C= CX[\_X` Cei CG < C $	 	s 	t 	& 7 t -& -t - -=7 =s =?{ ? ?9I ?6S 6T 6r*   