lib/datadog/core/configuration/option.rb in datadog-2.0.0 vs lib/datadog/core/configuration/option.rb in datadog-2.1.0
- old
+ new
@@ -12,11 +12,11 @@
# The definition object that matches this option.
# @return [Configuration::OptionDefinition]
# @!attribute [r] precedence_set
# When this option was last set, what was the value precedence used?
# @return [Precedence::Value]
- attr_reader :definition, :precedence_set
+ attr_reader :definition, :precedence_set, :resolved_env
# Option setting precedence.
module Precedence
# Represents an Option precedence level.
# Each precedence has a `numeric` value; higher values means higher precedence.
@@ -48,10 +48,11 @@
def initialize(definition, context)
@definition = definition
@context = context
@value = nil
@is_set = false
+ @resolved_env = nil
# One value is stored per precedence, to allow unsetting a higher
# precedence value and falling back to a lower precedence one.
@value_per_precedence = Hash.new(UNSET)
@@ -63,11 +64,11 @@
# the previously set value.
# The first call to `#set` will always store the value regardless of precedence.
#
# @param value [Object] the new value to be associated with this option
# @param precedence [Precedence] from what precedence order this new value comes from
- def set(value, precedence: Precedence::PROGRAMMATIC)
+ def set(value, precedence: Precedence::PROGRAMMATIC, resolved_env: nil)
# Is there a higher precedence value set?
if @precedence_set > precedence
# This should be uncommon, as higher precedence values tend to
# happen later in the application lifecycle.
Datadog.logger.info do
@@ -82,11 +83,11 @@
@value_per_precedence[precedence] = value
return @value
end
- internal_set(value, precedence)
+ internal_set(value, precedence, resolved_env)
end
def unset(precedence)
@value_per_precedence[precedence] = UNSET
@@ -100,11 +101,11 @@
next unless p < precedence
# Look for value that is set.
# The hash `@value_per_precedence` has a custom default value of `UNSET`.
if (value = @value_per_precedence[p]) != UNSET
- internal_set(value, p)
+ internal_set(value, p, nil)
return nil
end
end
# If no value is left to fall back on, reset this option
@@ -258,15 +259,16 @@
raise ArgumentError, "The option #{@definition.name} is using an unsupported type option `#{@definition.type}`"
end
end
# Directly manipulates the current value and currently set precedence.
- def internal_set(value, precedence)
+ def internal_set(value, precedence, resolved_env)
old_value = @value
(@value = context_exec(validate_type(value), old_value, &definition.setter)).tap do |v|
@is_set = true
@precedence_set = precedence
+ @resolved_env = resolved_env
# Store original value to ensure we can always safely call `#internal_set`
# when restoring a value from `@value_per_precedence`, and we are only running `definition.setter`
# on the original value, not on a valud that has already been processed by `definition.setter`.
@value_per_precedence[precedence] = value
context_exec(v, old_value, precedence, &definition.after_set) if definition.after_set
@@ -282,34 +284,39 @@
end
def set_value_from_env_or_default
value = nil
precedence = nil
- effective_env = nil
+ resolved_env = nil
- if definition.env && ENV[definition.env]
- effective_env = definition.env
- value = coerce_env_variable(ENV[definition.env])
- precedence = Precedence::PROGRAMMATIC
+ if definition.env
+ Array(definition.env).each do |env|
+ next if ENV[env].nil?
+
+ resolved_env = env
+ value = coerce_env_variable(ENV[env])
+ precedence = Precedence::PROGRAMMATIC
+ break
+ end
end
if value.nil? && definition.deprecated_env && ENV[definition.deprecated_env]
- effective_env = definition.deprecated_env
+ resolved_env = definition.deprecated_env
value = coerce_env_variable(ENV[definition.deprecated_env])
precedence = Precedence::PROGRAMMATIC
Datadog::Core.log_deprecation do
"#{definition.deprecated_env} environment variable is deprecated, use #{definition.env} instead."
end
end
option_value = value.nil? ? default_value : value
- set(option_value, precedence: precedence || Precedence::DEFAULT)
+ set(option_value, precedence: precedence || Precedence::DEFAULT, resolved_env: resolved_env)
rescue ArgumentError
raise ArgumentError,
- "Expected environment variable #{effective_env} to be a #{@definition.type}, " \
- "but '#{ENV[effective_env]}' was provided"
+ "Expected environment variable #{resolved_env} to be a #{@definition.type}, " \
+ "but '#{ENV[resolved_env]}' was provided"
end
# Anchor object that represents a value that is not set.
# This is necessary because `nil` is a valid value to be set.
UNSET = Object.new