Class: Jac::Configuration::ProfileResolver

Inherits:
Object
  • Object
show all
Defined in:
lib/jac/configuration.rb

Overview

Describes profile resolving strategy

Instance Attribute Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(config) ⇒ ProfileResolver

Returns a new instance of ProfileResolver.



285
286
287
288
# File 'lib/jac/configuration.rb', line 285

def initialize(config)
  @config = config
  @merger = Merger.new
end

Instance Attribute Details

#configObject (readonly)

Returns the value of attribute config.



283
284
285
# File 'lib/jac/configuration.rb', line 283

def config
  @config
end

#mergerObject (readonly)

Returns the value of attribute merger.



283
284
285
# File 'lib/jac/configuration.rb', line 283

def merger
  @merger
end

Instance Method Details

#find_generic_profile(profile_name) ⇒ Object

TODO:

print warning if other matching generic profiles found



338
339
340
341
342
343
344
# 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) ⇒ Object

Raises:

  • (ArgumentError)


317
318
319
320
321
322
323
324
# 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) ⇒ Object



326
327
328
329
330
331
332
333
334
335
# 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) ⇒ Object



346
347
348
349
350
351
352
# 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) ⇒ Array

Fetches list of parent profile

Parameters:

  • values (Hash)

    current profile values

Returns:

  • (Array)

    of profile names



309
310
311
312
313
314
315
# 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 = []) ⇒ Object



290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
# 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