@@ -114,7 +114,7 @@ class EvaluationError < StandardError
114114 # generated during prerequisite evaluation. Raises EvaluationError if the flag is not well-formed
115115 # Will return nil, but not raise an exception, indicating that the rules (including fallthrough) did not match
116116 # In that case, the caller should return the default value.
117- def evaluate ( flag , user , store )
117+ def evaluate ( flag , user , store , logger )
118118 if flag . nil?
119119 raise EvaluationError , "Flag does not exist"
120120 end
@@ -126,20 +126,23 @@ def evaluate(flag, user, store)
126126 events = [ ]
127127
128128 if flag [ :on ]
129- res = eval_internal ( flag , user , store , events )
130-
131- return { value : res , events : events } if !res . nil?
129+ res = eval_internal ( flag , user , store , events , logger )
130+ if !res . nil?
131+ res [ :events ] = events
132+ return res
133+ end
132134 end
133135
134- if !flag [ :offVariation ] . nil? && flag [ :offVariation ] < flag [ :variations ] . length
135- value = flag [ :variations ] [ flag [ :offVariation ] ]
136- return { value : value , events : events }
136+ offVariation = flag [ :offVariation ]
137+ if !offVariation . nil? && offVariation < flag [ :variations ] . length
138+ value = flag [ :variations ] [ offVariation ]
139+ return { variation : offVariation , value : value , events : events }
137140 end
138141
139- { value : nil , events : events }
142+ { variation : nil , value : nil , events : events }
140143 end
141144
142- def eval_internal ( flag , user , store , events )
145+ def eval_internal ( flag , user , store , events , logger )
143146 failed_prereq = false
144147 # Evaluate prerequisites, if any
145148 ( flag [ :prerequisites ] || [ ] ) . each do |prerequisite |
@@ -149,14 +152,23 @@ def eval_internal(flag, user, store, events)
149152 failed_prereq = true
150153 else
151154 begin
152- prereq_res = eval_internal ( prereq_flag , user , store , events )
153- variation = get_variation ( prereq_flag , prerequisite [ :variation ] )
154- events . push ( kind : "feature" , key : prereq_flag [ :key ] , value : prereq_res , version : prereq_flag [ :version ] , prereqOf : flag [ :key ] )
155- if prereq_res . nil? || prereq_res != variation
155+ prereq_res = eval_internal ( prereq_flag , user , store , events , logger )
156+ event = {
157+ kind : "feature" ,
158+ key : prereq_flag [ :key ] ,
159+ variation : prereq_res . nil? ? nil : prereq_res [ :variation ] ,
160+ value : prereq_res . nil? ? nil : prereq_res [ :value ] ,
161+ version : prereq_flag [ :version ] ,
162+ prereqOf : flag [ :key ] ,
163+ trackEvents : prereq_flag [ :trackEvents ] ,
164+ debugEventsUntilDate : prereq_flag [ :debugEventsUntilDate ]
165+ }
166+ events . push ( event )
167+ if prereq_res . nil? || prereq_res [ :variation ] != prerequisite [ :variation ]
156168 failed_prereq = true
157169 end
158170 rescue => exn
159- @config . logger . error { "[LDClient] Error evaluating prerequisite: #{ exn . inspect } " }
171+ logger . error { "[LDClient] Error evaluating prerequisite: #{ exn . inspect } " }
160172 failed_prereq = true
161173 end
162174 end
@@ -175,7 +187,9 @@ def eval_rules(flag, user, store)
175187 # Check user target matches
176188 ( flag [ :targets ] || [ ] ) . each do |target |
177189 ( target [ :values ] || [ ] ) . each do |value |
178- return get_variation ( flag , target [ :variation ] ) if value == user [ :key ]
190+ if value == user [ :key ]
191+ return { variation : target [ :variation ] , value : get_variation ( flag , target [ :variation ] ) }
192+ end
179193 end
180194 end
181195
@@ -245,15 +259,17 @@ def clause_match_user_no_segments(clause, user)
245259
246260 def variation_for_user ( rule , user , flag )
247261 if !rule [ :variation ] . nil? # fixed variation
248- return get_variation ( flag , rule [ :variation ] )
262+ return { variation : rule [ :variation ] , value : get_variation ( flag , rule [ :variation ] ) }
249263 elsif !rule [ :rollout ] . nil? # percentage rollout
250264 rollout = rule [ :rollout ]
251265 bucket_by = rollout [ :bucketBy ] . nil? ? "key" : rollout [ :bucketBy ]
252266 bucket = bucket_user ( user , flag [ :key ] , bucket_by , flag [ :salt ] )
253267 sum = 0 ;
254268 rollout [ :variations ] . each do |variate |
255269 sum += variate [ :weight ] . to_f / 100000.0
256- return get_variation ( flag , variate [ :variation ] ) if bucket < sum
270+ if bucket < sum
271+ return { variation : variate [ :variation ] , value : get_variation ( flag , variate [ :variation ] ) }
272+ end
257273 end
258274 nil
259275 else # the rule isn't well-formed
0 commit comments