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