diff --git a/lib/ldclient-rb/ldclient.rb b/lib/ldclient-rb/ldclient.rb index 3b004485..9c72d2f9 100644 --- a/lib/ldclient-rb/ldclient.rb +++ b/lib/ldclient-rb/ldclient.rb @@ -5,6 +5,9 @@ require 'logger' module LaunchDarkly + + BUILTINS = [:key, :ip, :country, :email, :firstName, :lastName, :avatar, :name] + # # A client for the LaunchDarkly API. Client instances are thread-safe. Users # should create a single client instance for the lifetime of the application. @@ -221,7 +224,7 @@ def param_for_user(feature, user) def match_target?(target, user) attrib = target[:attribute].to_sym - if attrib == :key or attrib == :ip or attrib == :country + if BUILTINS.include?(attrib) if user[attrib] u_value = user[attrib] return target[:values].include? u_value @@ -247,8 +250,19 @@ def match_target?(target, user) end + def match_user?(variation, user) + if !!variation[:userTarget] + return match_target?(variation[:userTarget], user) + end + return false + end + def match_variation?(variation, user) variation[:targets].each do |target| + if !!variation[:userTarget] and target[:attribute].to_sym == :key + next + end + if match_target?(target, user) return true end @@ -267,6 +281,12 @@ def evaluate(feature, user) return nil end + feature[:variations].each do |variation| + if match_user?(variation, user) + return variation[:value] + end + end + feature[:variations].each do |variation| if match_variation?(variation, user) return variation[:value] @@ -286,7 +306,7 @@ def evaluate(feature, user) end - private :add_event, :get_flag_int, :param_for_user, :match_target?, :match_variation?, :evaluate, :create_worker + private :add_event, :get_flag_int, :param_for_user, :match_target?, :match_user?, :match_variation?, :evaluate, :create_worker end