class Jac::Configuration::ProfileResolver
Describes profile resolving strategy
Attributes
config[R]
merger[R]
Public Class Methods
new(config)
click to toggle source
# File lib/jac/configuration.rb, line 285 def initialize(config) @config = config @merger = Merger.new end
Public Instance Methods
find_generic_profile(profile_name)
click to toggle source
@todo print warning if other matching generic profiles found
# File lib/jac/configuration.rb, line 338 def find_generic_profile(profile_name) generic_profiles(config) .detect do |profile, regex| m = regex.match(profile_name) break [m, profile] if m end end
find_profile(profile_name)
click to toggle source
# File lib/jac/configuration.rb, line 317 def find_profile(profile_name) return config[profile_name] if config.key?(profile_name) # First and last chars are '/' match, matched_profile = find_generic_profile(profile_name) # Generating profile return generate_profile(match, matched_profile, profile_name) if match raise(ArgumentError, 'No such profile ' + profile_name) end
generate_profile(match, matched_profile, profile_name)
click to toggle source
# File lib/jac/configuration.rb, line 326 def generate_profile(match, matched_profile, profile_name) gen_profile = {} gen_profile['captures'] = match.captures if match.captures if match.respond_to?(:named_captures) && match.named_captures gen_profile['named_captures'] = match.named_captures end gen_profile.merge!(config[matched_profile]) config[profile_name] = gen_profile end
generic_profiles(config)
click to toggle source
# File lib/jac/configuration.rb, line 346 def generic_profiles(config) # Create generic profiles if missing @generic_profiles ||= config .keys .select { |k| k[0] == '/' && k[-1] == '/' } .map { |k| [k, Regexp.new(k[1..-2])] } end
parent_profiles(values)
click to toggle source
Fetches list of parent profile @param [Hash] values current profile values @return [Array] of profile names
# File lib/jac/configuration.rb, line 309 def parent_profiles(values) extends = *values[Configuration::EXTENDS_KEY] || [] [Configuration::TOP_PROFILE_NAME, Configuration::BASE_PROFILE_NAME].each do |implicit| raise(ArgumentError, "`#{implicit}` is not allowed here") if extends.include?(implicit) end extends end
resolve(profile, resolved = [])
click to toggle source
# File lib/jac/configuration.rb, line 290 def resolve(profile, resolved = []) profile.inject({}) do |acc, elem| if resolved.include?(elem) msg = 'Cyclic dependency found ' + (resolved + [elem]).join(' -> ') raise(ArgumentError, msg) end profile_values = find_profile(elem) # Find all parent_profiles extends = parent_profiles(profile_values) # We can do not check extends. Empty profile returns {} # Inherited values goes first inherited = merger.merge(acc, resolve(extends, resolved + [elem])) merger.merge(inherited, profile_values) end end