Skip to content

Commit

Permalink
user to_s function + oneline logging in rolloutevaluator
Browse files Browse the repository at this point in the history
  • Loading branch information
kp-cat committed Mar 29, 2022
1 parent 2085608 commit 6f0e812
Show file tree
Hide file tree
Showing 4 changed files with 149 additions and 115 deletions.
234 changes: 122 additions & 112 deletions lib/configcat/rolloutevaluator.rb
Original file line number Diff line number Diff line change
Expand Up @@ -39,132 +39,142 @@ def self.evaluate(key, user, default_value, default_variation_id, config)
return return_value, return_variation_id
end

ConfigCat.logger.info("User object:\n%s" % user.to_s)

# Evaluate targeting rules
for rollout_rule in rollout_rules
comparison_attribute = rollout_rule.fetch(COMPARISON_ATTRIBUTE)
comparison_value = rollout_rule.fetch(COMPARISON_VALUE, nil)
comparator = rollout_rule.fetch(COMPARATOR, nil)

user_value = user.get_attribute(comparison_attribute)
if user_value === nil || !user_value
ConfigCat.logger.info(format_no_match_rule(comparison_attribute, user_value, comparator, comparison_value))
next
end
log_entries = ["Evaluating get_value('%s')." % key, "User object:\n%s" % user.to_s]

begin
# Evaluate targeting rules
for rollout_rule in rollout_rules
comparison_attribute = rollout_rule.fetch(COMPARISON_ATTRIBUTE)
comparison_value = rollout_rule.fetch(COMPARISON_VALUE, nil)
comparator = rollout_rule.fetch(COMPARATOR, nil)

user_value = user.get_attribute(comparison_attribute)
if user_value === nil || !user_value
log_entries.push(format_no_match_rule(comparison_attribute, user_value, comparator, comparison_value))
next
end

value = rollout_rule.fetch(VALUE, nil)
variation_id = rollout_rule.fetch(VARIATION_ID, default_variation_id)
value = rollout_rule.fetch(VALUE, nil)
variation_id = rollout_rule.fetch(VARIATION_ID, default_variation_id)

# IS ONE OF
if comparator == 0
if comparison_value.to_s.split(",").map { |x| x.strip() }.include?(user_value.to_s)
ConfigCat.logger.info(format_match_rule(comparison_attribute, user_value, comparator, comparison_value, value))
return value, variation_id
end
# IS NOT ONE OF
elsif comparator == 1
if !comparison_value.to_s.split(",").map { |x| x.strip() }.include?(user_value.to_s)
ConfigCat.logger.info(format_match_rule(comparison_attribute, user_value, comparator, comparison_value, value))
return value, variation_id
end
# CONTAINS
elsif comparator == 2
if user_value.to_s.include?(comparison_value.to_s)
ConfigCat.logger.info(format_match_rule(comparison_attribute, user_value, comparator, comparison_value, value))
return value, variation_id
end
# DOES NOT CONTAIN
elsif comparator == 3
if !user_value.to_s.include?(comparison_value.to_s)
ConfigCat.logger.info(format_match_rule(comparison_attribute, user_value, comparator, comparison_value, value))
return value, variation_id
end
# IS ONE OF, IS NOT ONE OF (Semantic version)
elsif (4 <= comparator) && (comparator <= 5)
begin
match = false
user_value_version = Semantic::Version.new(user_value.to_s.strip())
((comparison_value.to_s.split(",").map { |x| x.strip() }).reject { |c| c.empty? }).each { |x|
version = Semantic::Version.new(x)
match = (user_value_version == version) || match
}
if match && comparator == 4 || !match && comparator == 5
ConfigCat.logger.info(format_match_rule(comparison_attribute, user_value, comparator, comparison_value, value))
# IS ONE OF
if comparator == 0
if comparison_value.to_s.split(",").map { |x| x.strip() }.include?(user_value.to_s)
log_entries.push(format_match_rule(comparison_attribute, user_value, comparator, comparison_value, value))
return value, variation_id
end
rescue ArgumentError => e
ConfigCat.logger.warn(format_validation_error_rule(comparison_attribute, user_value, comparator, comparison_value, e.to_s))
next
end
# LESS THAN, LESS THAN OR EQUALS TO, GREATER THAN, GREATER THAN OR EQUALS TO (Semantic version)
elsif (6 <= comparator) && (comparator <= 9)
begin
user_value_version = Semantic::Version.new(user_value.to_s.strip())
comparison_value_version = Semantic::Version.new(comparison_value.to_s.strip())
if (comparator == 6 && user_value_version < comparison_value_version) ||
(comparator == 7 && user_value_version <= comparison_value_version) ||
(comparator == 8 && user_value_version > comparison_value_version) ||
(comparator == 9 && user_value_version >= comparison_value_version)
ConfigCat.logger.info(format_match_rule(comparison_attribute, user_value, comparator, comparison_value, value))
# IS NOT ONE OF
elsif comparator == 1
if !comparison_value.to_s.split(",").map { |x| x.strip() }.include?(user_value.to_s)
log_entries.push(format_match_rule(comparison_attribute, user_value, comparator, comparison_value, value))
return value, variation_id
end
rescue ArgumentError => e
ConfigCat.logger.warn(format_validation_error_rule(comparison_attribute, user_value, comparator, comparison_value, e.to_s))
next
end
elsif (10 <= comparator) && (comparator <= 15)
begin
user_value_float = Float(user_value.to_s.gsub(",", "."))
comparison_value_float = Float(comparison_value.to_s.gsub(",", "."))
if (comparator == 10 && user_value_float == comparison_value_float) ||
(comparator == 11 && user_value_float != comparison_value_float) ||
(comparator == 12 && user_value_float < comparison_value_float) ||
(comparator == 13 && user_value_float <= comparison_value_float) ||
(comparator == 14 && user_value_float > comparison_value_float) ||
(comparator == 15 && user_value_float >= comparison_value_float)
ConfigCat.logger.info(format_match_rule(comparison_attribute, user_value, comparator, comparison_value, value))
# CONTAINS
elsif comparator == 2
if user_value.to_s.include?(comparison_value.to_s)
log_entries.push(format_match_rule(comparison_attribute, user_value, comparator, comparison_value, value))
return value, variation_id
end
# DOES NOT CONTAIN
elsif comparator == 3
if !user_value.to_s.include?(comparison_value.to_s)
log_entries.push(format_match_rule(comparison_attribute, user_value, comparator, comparison_value, value))
return value, variation_id
end
# IS ONE OF, IS NOT ONE OF (Semantic version)
elsif (4 <= comparator) && (comparator <= 5)
begin
match = false
user_value_version = Semantic::Version.new(user_value.to_s.strip())
((comparison_value.to_s.split(",").map { |x| x.strip() }).reject { |c| c.empty? }).each { |x|
version = Semantic::Version.new(x)
match = (user_value_version == version) || match
}
if match && comparator == 4 || !match && comparator == 5
log_entries.push(format_match_rule(comparison_attribute, user_value, comparator, comparison_value, value))
return value, variation_id
end
rescue ArgumentError => e
message = format_validation_error_rule(comparison_attribute, user_value, comparator, comparison_value, e.to_s)
ConfigCat.logger.warn(message)
log_entries.push(message)
next
end
# LESS THAN, LESS THAN OR EQUALS TO, GREATER THAN, GREATER THAN OR EQUALS TO (Semantic version)
elsif (6 <= comparator) && (comparator <= 9)
begin
user_value_version = Semantic::Version.new(user_value.to_s.strip())
comparison_value_version = Semantic::Version.new(comparison_value.to_s.strip())
if (comparator == 6 && user_value_version < comparison_value_version) ||
(comparator == 7 && user_value_version <= comparison_value_version) ||
(comparator == 8 && user_value_version > comparison_value_version) ||
(comparator == 9 && user_value_version >= comparison_value_version)
log_entries.push(format_match_rule(comparison_attribute, user_value, comparator, comparison_value, value))
return value, variation_id
end
rescue ArgumentError => e
message = format_validation_error_rule(comparison_attribute, user_value, comparator, comparison_value, e.to_s)
ConfigCat.logger.warn(message)
log_entries.push(message)
next
end
elsif (10 <= comparator) && (comparator <= 15)
begin
user_value_float = Float(user_value.to_s.gsub(",", "."))
comparison_value_float = Float(comparison_value.to_s.gsub(",", "."))
if (comparator == 10 && user_value_float == comparison_value_float) ||
(comparator == 11 && user_value_float != comparison_value_float) ||
(comparator == 12 && user_value_float < comparison_value_float) ||
(comparator == 13 && user_value_float <= comparison_value_float) ||
(comparator == 14 && user_value_float > comparison_value_float) ||
(comparator == 15 && user_value_float >= comparison_value_float)
log_entries.push(format_match_rule(comparison_attribute, user_value, comparator, comparison_value, value))
return value, variation_id
end
rescue Exception => e
message = format_validation_error_rule(comparison_attribute, user_value, comparator, comparison_value, e.to_s)
ConfigCat.logger.warn(message)
log_entries.push(message)
next
end
# IS ONE OF (Sensitive)
elsif comparator == 16
if comparison_value.to_s.split(",").map { |x| x.strip() }.include?(Digest::SHA1.hexdigest(user_value).to_s)
log_entries.push(format_match_rule(comparison_attribute, user_value, comparator, comparison_value, value))
return value, variation_id
end
# IS NOT ONE OF (Sensitive)
elsif comparator == 17
if !comparison_value.to_s.split(",").map { |x| x.strip() }.include?(Digest::SHA1.hexdigest(user_value).to_s)
log_entries.push(format_match_rule(comparison_attribute, user_value, comparator, comparison_value, value))
return value, variation_id
end
rescue Exception => e
ConfigCat.logger.warn(format_validation_error_rule(comparison_attribute, user_value, comparator, comparison_value, e.to_s))
next
end
# IS ONE OF (Sensitive)
elsif comparator == 16
if comparison_value.to_s.split(",").map { |x| x.strip() }.include?(Digest::SHA1.hexdigest(user_value).to_s)
ConfigCat.logger.info(format_match_rule(comparison_attribute, user_value, comparator, comparison_value, value))
return value, variation_id
end
# IS NOT ONE OF (Sensitive)
elsif comparator == 17
if !comparison_value.to_s.split(",").map { |x| x.strip() }.include?(Digest::SHA1.hexdigest(user_value).to_s)
ConfigCat.logger.info(format_match_rule(comparison_attribute, user_value, comparator, comparison_value, value))
return value, variation_id
end
log_entries.push(format_no_match_rule(comparison_attribute, user_value, comparator, comparison_value))
end
ConfigCat.logger.info(format_no_match_rule(comparison_attribute, user_value, comparator, comparison_value))
end

if rollout_percentage_items.size > 0
user_key = user.get_identifier()
hash_candidate = ("%s%s" % [key, user_key]).encode("utf-8")
hash_val = Digest::SHA1.hexdigest(hash_candidate)[0...7].to_i(base=16) % 100
bucket = 0
for rollout_percentage_item in rollout_percentage_items || []
bucket += rollout_percentage_item.fetch(PERCENTAGE, 0)
if hash_val < bucket
percentage_value = rollout_percentage_item.fetch(VALUE, nil)
variation_id = rollout_percentage_item.fetch(VARIATION_ID, default_variation_id)
ConfigCat.logger.info("Evaluating %% options. Returning %s" % percentage_value)
return percentage_value, variation_id
if rollout_percentage_items.size > 0
user_key = user.get_identifier()
hash_candidate = ("%s%s" % [key, user_key]).encode("utf-8")
hash_val = Digest::SHA1.hexdigest(hash_candidate)[0...7].to_i(base=16) % 100
bucket = 0
for rollout_percentage_item in rollout_percentage_items || []
bucket += rollout_percentage_item.fetch(PERCENTAGE, 0)
if hash_val < bucket
percentage_value = rollout_percentage_item.fetch(VALUE, nil)
variation_id = rollout_percentage_item.fetch(VARIATION_ID, default_variation_id)
log_entries.push("Evaluating %% options. Returning %s" % percentage_value)
return percentage_value, variation_id
end
end
end
return_value = setting_descriptor.fetch(VALUE, default_value)
return_variation_id = setting_descriptor.fetch(VARIATION_ID, default_variation_id)
log_entries.push("Returning %s" % return_value)
return return_value, return_variation_id
ensure
ConfigCat.logger.info(log_entries.join("\n"))
end
return_value = setting_descriptor.fetch(VALUE, default_value)
return_variation_id = setting_descriptor.fetch(VARIATION_ID, default_variation_id)
ConfigCat.logger.info("Returning %s" % return_value)
return return_value, return_variation_id
end

private
Expand Down
19 changes: 19 additions & 0 deletions lib/configcat/user.rb
Original file line number Diff line number Diff line change
Expand Up @@ -32,6 +32,25 @@ def get_attribute(attribute)
end
return nil
end

def to_s()
r = %Q({\n "Identifier": "#{@__identifier}")
if !@__data["Email"].equal?(nil)
r += %Q(,\n "Email": "#{@__data["Email"]}")
end
if !@__data["Country"].equal?(nil)
r += %Q(,\n "Country": "#{@__data["Country"]}")
end
if !@__custom.equal?(nil)
r += %Q(,\n "Custom": {)
for customField in @__custom
r += %Q(\n "#{customField}": "#{@__custom[customField]}",)
end
r += "\n }"
end
r += "\n}"
return r
end
end

end
4 changes: 4 additions & 0 deletions samples/consolesample.rb
Original file line number Diff line number Diff line change
@@ -1,5 +1,9 @@
require 'configcat'

# Info level logging helps to inspect the feature flag evaluation process.
# Use the default warning level to avoid too detailed logging in your application.
ConfigCat.logger.level = Logger::INFO

# Initialize the ConfigCatClient with an SDK Key.
client = ConfigCat.create_client("PKDVCLf-Hq-h-kCzMp-L7Q/psuH7BGHoUmdONrzzUOY7A")

Expand Down
7 changes: 4 additions & 3 deletions samples/consolesample2.rb
Original file line number Diff line number Diff line change
@@ -1,11 +1,12 @@
require 'configcat'

# Info level logging helps to inspect the feature flag evaluation process.
# Use the default warning level to avoid too detailed logging in your application.
ConfigCat.logger.level = Logger::INFO

# Initializing the ConfigCatClient with an SDK Key.
client = ConfigCat.create_client("PKDVCLf-Hq-h-kCzMp-L7Q/HhOWfwVtZ0mb30i9wi17GQ")

# Setting the log level to Info to show detailed feature flag evaluation.
ConfigCat.logger.level = Logger::INFO

# Creating a user object to identify your user (optional).
userObject = ConfigCat::User.new("Some UserID", email: "configcat@example.com", custom: {
'version': '1.0.0'
Expand Down

0 comments on commit 6f0e812

Please sign in to comment.