Class: Jac::Configuration::ProfileResolver
- Inherits:
-
Object
- Object
- Jac::Configuration::ProfileResolver
- Defined in:
- lib/jac/configuration.rb
Overview
Describes profile resolving strategy
Instance Attribute Summary collapse
-
#config ⇒ Object
readonly
Returns the value of attribute config.
-
#merger ⇒ Object
readonly
Returns the value of attribute merger.
Instance Method Summary collapse
- #find_generic_profile(profile_name) ⇒ Object
- #find_profile(profile_name) ⇒ Object
- #generate_profile(match, matched_profile, profile_name) ⇒ Object
- #generic_profiles(config) ⇒ Object
-
#initialize(config) ⇒ ProfileResolver
constructor
A new instance of ProfileResolver.
-
#parent_profiles(values) ⇒ Array
Fetches list of parent profile.
- #resolve(profile, resolved = []) ⇒ Object
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
#config ⇒ Object (readonly)
Returns the value of attribute config.
283 284 285 |
# File 'lib/jac/configuration.rb', line 283 def config @config end |
#merger ⇒ Object (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
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
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 |