class OctocatalogDiff::API::V1::Config

This class interacts with the configuration file typically named `.octocatalog-diff.cfg.rb`.

Constants

DEFAULT_PATHS

Default directory paths: These are the documented default locations that will be checked for the configuration file.

Public Class Methods

config(options_in = {}) click to toggle source

Public: Find the configuration file in the specified path or one of the default paths as appropriate. Parses the configuration file and returns the hash object with its settings. Returns empty hash if the configuration file is not found anywhere.

@param :filename [String] Specified file name (default = search the default paths) @param :logger [Logger] Logger object @param :test [Boolean] Configuration file test mode (log some extra debugging, raises errors) @return [Hash] Parsed configuration file

# File lib/octocatalog-diff/api/v1/config.rb, line 30
def self.config(options_in = {})
  # Initialize the logger - if not passed, set to a throwaway object.
  options, logger = OctocatalogDiff::API::V1::Common.logger_from_options(options_in)

  # Locate the configuration file
  paths = [options.fetch(:filename, DEFAULT_PATHS)].compact
  config_file = first_file(paths)

  # Can't find the configuration file?
  if config_file.nil?
    message = "Unable to find configuration file in #{paths.join(':')}"
    raise OctocatalogDiff::Errors::ConfigurationFileNotFoundError, message if options[:test]
    logger.debug message
    return {}
  end

  # Load/parse the configuration file - this returns a hash
  settings = load_config_file(config_file, logger)

  # Debug the configuration file if requested.
  debug_config_file(settings, logger) if options[:test]

  # Return the settings hash
  logger.debug "Loaded #{settings.keys.size} settings from #{config_file}"
  settings
end
debug_config_file(settings, logger) click to toggle source

Private: Print debugging details for the configuration file.

@param settings [Hash] Parsed settings from load_config_file @param logger [Logger] Logger object

# File lib/octocatalog-diff/api/v1/config.rb, line 61
def self.debug_config_file(settings, logger)
  unless settings.is_a?(Hash)
    raise ArgumentError, "Settings must be hash not #{settings.class}"
  end

  settings.each { |key, val| logger.debug ":#{key} => (#{val.class}) #{val.inspect}" }
end
first_file(search_paths) click to toggle source

Private: Find the first element of the given array that is a file and return it. Return nil if none of the elements in the array are files.

@param search_paths [Array<String>] Paths to check

# File lib/octocatalog-diff/api/v1/config.rb, line 116
def self.first_file(search_paths)
  search_paths.flatten.compact.each do |path|
    return path if File.file?(path)
  end
  nil
end
load_config_file(filename, logger) click to toggle source

Private: Load the configuration file from a given path. Returns the settings hash.

@param filename [String] File name to load @param logger [Logger] Logger object @return [Hash] Settings

# File lib/octocatalog-diff/api/v1/config.rb, line 74
def self.load_config_file(filename, logger)
  # This should never happen unless somebody calls this method directly outside of
  # the published `.config` method. Check for problems anyway.
  raise Errno::ENOENT, "File #{filename} doesn't exist" unless File.file?(filename)

  # Attempt to require in the file. Problems here will fall through to the rescued
  # exception below.
  logger.debug "Loading octocatalog-diff configuration from #{filename}"
  load filename

  # The required file should contain `OctocatalogDiff::Config` with `.config` method.
  # If this is undefined, raise an exception.
  begin
    loaded_class = Kernel.const_get(:OctocatalogDiff).const_get(:Config)
  rescue NameError
    message = 'Configuration must define OctocatalogDiff::Config!'
    raise OctocatalogDiff::Errors::ConfigurationFileContentError, message
  end

  unless loaded_class.respond_to?(:config)
    message = 'Configuration must define OctocatalogDiff::Config.config!'
    raise OctocatalogDiff::Errors::ConfigurationFileContentError, message
  end

  # The configuration file looks like it defines the correct method, so read it.
  # Make sure it's a hash.
  options = loaded_class.config
  unless options.is_a?(Hash)
    message = "Configuration must be Hash not #{options.class}!"
    raise OctocatalogDiff::Errors::ConfigurationFileContentError, message
  end

  options
rescue Exception => exc # rubocop:disable Lint/RescueException
  logger.fatal "#{exc.class} error with #{filename}: #{exc.message}\n#{exc.backtrace}"
  raise exc
end