lib/sc4ry/config.rb in sc4ry-0.2.0 vs lib/sc4ry/config.rb in sc4ry-0.2.1

- old
+ new

@@ -1,91 +1,99 @@ -# Sc4ry module +# frozen_string_literal: true + +# Sc4ry module # @note namespace module Sc4ry - # Sc4ry::Config module - # @note namespace - module Config - # Configuration validator for Sc4ry default and circuits configuration - # @private - class Validator + # Sc4ry::Config module + # @note namespace + module Config + # Configuration validator for Sc4ry default and circuits configuration + # @private + class Validator + # accessor on Circuit definition given for validation + attr_reader :input - # accessor on Circuit definition given for validation - attr_reader :input - # accessor on circuit initial definition from default config or given in construction by from keyword - # @note altered by reference to final result mapping with {#validate!} - attr_reader :config - - def result - @config - end - - include Sc4ry::Constants - include Sc4ry::Exceptions - # Validator constructor - # @param [Hash] definition the config hash to merge and validate - # @param [Hash] from config hash merged on origin (default : the Sc4ry base config from Constants ) - # @return [Validator] a new instance of Validator - def initialize(definition: , from: DEFAULT_CONFIG) - @config = from - @input = definition - end - - # Validation method, alter by reference the config attribut - # @raise ConfigError if un unknown key is given in definition to merge. - def validate! - unknown_keys = @input.keys.difference @config.keys - raise ConfigError::new("Unknown keys in config set : #{unknown_keys.to_s}") unless unknown_keys.empty? - validate_formats - @config.merge! @input - format_exceptions - end - - private - # Validation private sub method - # @raise ConfigError if proposed values haven't the good format and deeply in array - def validate_formats - @input.each do |spec,value| - raise ConfigError::new("#{spec} value #{DEFAULT_CONFIG_FORMATS[spec][:desc]}") unless DEFAULT_CONFIG_FORMATS[spec][:proc].call(value) - if DEFAULT_CONFIG_FORMATS[spec].include? :list then - value.each do |item| - raise ConfigError::new("#{spec} value must be in #{DEFAULT_CONFIG_FORMATS[spec][:list]}") unless DEFAULT_CONFIG_FORMATS[spec][:list].include? item - end - end - end - end - - # adapter for exception key in config String to Constant Class Name if need - # @note by reference - def format_exceptions - @config[:exceptions].map! {|item| item = (item.class == String)? Object.const_get(item) : item } - end - - end + # accessor on circuit initial definition from default config or given in construction by from keyword + # @note altered by reference to final result mapping with {#validate!} + attr_reader :config - # Config Data mapper for block yielding methods for configuration - # @note work for/with {Sc4ry::Circuits.configure} and {Sc4ry::Circuits.register} when block given - class ConfigMapper + def result + @config + end - include Sc4ry::Constants + include Sc4ry::Constants + include Sc4ry::Exceptions + # Validator constructor + # @param [Hash] definition the config hash to merge and validate + # @param [Hash] from config hash merged on origin (default : the Sc4ry base config from Constants ) + # @return [Validator] a new instance of Validator + def initialize(definition:, from: DEFAULT_CONFIG) + @config = from + @input = definition + end - # config from given definition passed in constructor - attr_reader :config - - # the mapping constructor from a given definition or the default From Sc4ry config (Constant) - # @param [Hash] definition a config hash - # @note creating dynamically accessors on config record given in definition - def initialize(definition: DEFAULT_CONFIG) - @config = definition - @config.each do |key,value| - self.define_singleton_method "#{key.to_s}=".to_sym do |val| - key = __method__.to_s.chop.to_sym - @config[key]=val - end - self.define_singleton_method key do - return @config[__method__] - end - end + # Validation method, alter by reference the config attribut + # @raise ConfigError if un unknown key is given in definition to merge. + def validate! + unknown_keys = @input.keys.difference @config.keys + raise ConfigError, "Unknown keys in config set : #{unknown_keys}" unless unknown_keys.empty? + + validate_formats + @config.merge! @input + format_exceptions + end + + private + + # Validation private sub method + # @raise ConfigError if proposed values haven't the good format and deeply in array + def validate_formats + @input.each do |spec, value| + unless DEFAULT_CONFIG_FORMATS[spec][:proc].call(value) + raise ConfigError, + "#{spec} value #{DEFAULT_CONFIG_FORMATS[spec][:desc]}" + end + + next unless DEFAULT_CONFIG_FORMATS[spec].include? :list + + value.each do |item| + unless DEFAULT_CONFIG_FORMATS[spec][:list].include? item + raise ConfigError, + "#{spec} value must be in #{DEFAULT_CONFIG_FORMATS[spec][:list]}" end + end end + end + # adapter for exception key in config String to Constant Class Name if need + # @note by reference + def format_exceptions + @config[:exceptions].map! { |item| item.instance_of?(String) ? Object.const_get(item) : item } + end end -end \ No newline at end of file + + # Config Data mapper for block yielding methods for configuration + # @note work for/with {Sc4ry::Circuits.configure} and {Sc4ry::Circuits.register} when block given + class ConfigMapper + include Sc4ry::Constants + + # config from given definition passed in constructor + attr_reader :config + + # the mapping constructor from a given definition or the default From Sc4ry config (Constant) + # @param [Hash] definition a config hash + # @note creating dynamically accessors on config record given in definition + def initialize(definition: DEFAULT_CONFIG) + @config = definition + @config.each do |key, _value| + define_singleton_method "#{key}=".to_sym do |val| + key = __method__.to_s.chop.to_sym + @config[key] = val + end + define_singleton_method key do + return @config[__method__] + end + end + end + end + end +end