# File lib/mixlib/config.rb, line 27 def self.extended(base) class << base; attr_accessor :configuration; end class << base; attr_accessor :configurables; end class << base; attr_accessor :config_contexts; end class << base; attr_accessor :config_parent; end base.configuration = Hash.new base.configurables = Hash.new base.config_contexts = Array.new end
Get the value of a config option
The config option to return
The value of the config option
If the config option does not exist and strict mode is on.
# File lib/mixlib/config.rb, line 66 def [](config_option) internal_get(config_option.to_sym) end
Set the value of a config option
The config option to set (within the [])
The value for the config option
The new value of the config option
If the config option does not exist and strict mode is on.
# File lib/mixlib/config.rb, line 81 def []=(config_option, value) internal_set(config_option.to_sym, value) end
metaprogramming to ensure that the slot for method_symbol gets set to value after any other logic is run
Name of the method (variable setter)
logic block to run in setting slot method_symbol to value
Value to be set in config hash
# File lib/mixlib/config.rb, line 146 def config_attr_writer(method_symbol, &block) configurable(method_symbol).writes_value(&block) end
Allows you to create a new config context where you can define new options with default values.
For example:
#config_context :server_info do
configurable(:url).defaults_to("http://localhost")
end
symbol<Symbol>: the name of the context block<Block>: a block that will be run in the context of this new config class.
# File lib/mixlib/config.rb, line 209 def config_context(symbol, &block) context = Class.new context.extend(::Mixlib::Config) context.config_parent = self config_contexts << context if block context.instance_eval(&block) end configurable(symbol).defaults_to(context).writes_value do |value| raise "config context #{symbol} cannot be modified" end end
Gets or sets strict mode. When strict mode is on, only values which were specified with configurable(), default() or writes_with() may be retrieved or set. Getting or setting anything else will cause Mixlib::Config::UnknownConfigOptionError to be thrown.
If this is set to :warn, unknown values may be get or set, but a warning will be printed with Chef::Log.warn if this occurs.
pass this value to set strict mode [optional]
Current value of #config_strict_mode
if value is set to something other than true, false, or :warn
# File lib/mixlib/config.rb, line 241 def config_strict_mode(value = NOT_PASSED) if value == NOT_PASSED if @config_strict_mode.nil? if config_parent config_parent.config_strict_mode else false end else @config_strict_mode end else self.config_strict_mode = value end end
Sets strict mode. When strict mode is on, only values which were specified with configurable(), default() or writes_with() may be retrieved or set. All other values
If this is set to :warn, unknown values may be get or set, but a warning will be printed with Chef::Log.warn if this occurs.
pass this value to set strict mode [optional]
if value is set to something other than true, false, or :warn
# File lib/mixlib/config.rb, line 270 def config_strict_mode=(value) if ![ true, false, :warn, nil ].include?(value) raise ArgumentError, "config_strict_mode must be true, false, nil or :warn" end @config_strict_mode = value end
metaprogramming to set information about a config option. This may be used in one of two ways:
Block-based:
configurable(:attr) do
defaults_to 4 writes_value { |value| 10 }
end
Chain-based:
configurable(:attr).defaults_to(4).writes_value { |value| 10 }
Currently supported configuration:
defaults_to(value): value returned when configurable has no explicit value defaults_to BLOCK: block is run when the configurable has no explicit value writes_value BLOCK: block that is run to filter a value when it is being set
Name of the config option
Default value [optional]
Logic block that calculates default value [optional]
The value of the config option.
# File lib/mixlib/config.rb, line 185 def configurable(symbol, &block) unless configurables[symbol] configurables[symbol] = Configurable.new(symbol) define_attr_accessor_methods(symbol) end if block block.call(configurables[symbol]) end configurables[symbol] end
Pass #configure a block, and it will yield itself
A block that is called with self.configuration as the arugment.
# File lib/mixlib/config.rb, line 52 def configure(&block) block.call(self.configuration) end
metaprogramming to set the default value for the given config option
Name of the config option
Default value (can be unspecified)
Logic block that calculates default value
# File lib/mixlib/config.rb, line 156 def default(symbol, default_value = nil, &block) configurable(symbol).defaults_to(default_value, &block) end
Loads a given ruby file, and runs instance_eval against it in the context of the current object.
Raises an IOError if the file cannot be found, or is not readable.
A filename to read from
# File lib/mixlib/config.rb, line 44 def from_file(filename) self.instance_eval(IO.read(filename), filename, 1) end
Check if Mixlib::Config has a config option.
The config option to check for
If the config option exists
If the config option does not exist
# File lib/mixlib/config.rb, line 93 def has_key?(key) self.configuration.has_key?(key.to_sym) end
Allows for simple lookups and setting of config options via method calls on Mixlib::Config. If there any arguments to the method, they are used to set the value of the config option. Otherwise, it's a simple get operation.
The method called. Must match a config option.
Any arguments passed to the method
The value of the config option.
If the config option does not exist and strict mode is on.
# File lib/mixlib/config.rb, line 290 def method_missing(method_symbol, *args) method_symbol = $1.to_sym if method_symbol.to_s =~ /(.+)=$/ internal_get_or_set(method_symbol, *args) end
Resets all config options to their defaults.
# File lib/mixlib/config.rb, line 106 def reset self.configuration = Hash.new self.config_contexts.each { |config_context| config_context.reset } end
# File lib/mixlib/config.rb, line 339 def define_attr_accessor_methods(symbol) # When Ruby 1.8.7 is no longer supported, this stuff can be done with define_singleton_method! meta = class << self; self; end # Setter meta.send :define_method, "#{symbol.to_s}=".to_sym do |value| internal_set(symbol, value) end # Getter meta.send :define_method, symbol do |*args| internal_get_or_set(symbol, *args) end end
# File lib/mixlib/config.rb, line 315 def internal_get(symbol) if configurables.has_key?(symbol) configurables[symbol].get(self.configuration) else if config_strict_mode == :warn Chef::Log.warn("Reading unsupported config value #{symbol}.") elsif config_strict_mode raise UnknownConfigOptionError, "Reading unsupported config value #{symbol}." end configuration[symbol] end end
# File lib/mixlib/config.rb, line 328 def internal_get_or_set(symbol,*args) num_args = args.length # Setting if num_args > 0 internal_set(symbol, num_args == 1 ? args[0] : args) end # Returning internal_get(symbol) end
Internal dispatch setter for config values.
Name of the method (variable setter)
Value to be set in config hash
# File lib/mixlib/config.rb, line 302 def internal_set(symbol,value) if configurables.has_key?(symbol) configurables[symbol].set(self.configuration, value) else if config_strict_mode == :warn Chef::Log.warn("Setting unsupported config value #{method_name}..") elsif config_strict_mode raise UnknownConfigOptionError, "Cannot set unsupported config value #{method_name}." end configuration[symbol] = value end end