#
# Copyright (c) 2013-2021 Hal Brodigan (postmodern.mod3 at gmail.com)
#
# bundler-audit is free software: you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation, either version 3 of the License, or
# (at your option) any later version.
#
# bundler-audit is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with bundler-audit. If not, see .
#
require 'yaml'
require 'set'
module Bundler
module Audit
#
# Class for storing and validating configuration for running the auditor.
#
# @since 0.8.0
#
class Configuration
class InvalidConfigurationError < StandardError
end
class FileNotFound < StandardError
end
#
# A constructor method for loading configuration from a YAML file.
#
# @param [String] file_path
# Path to the YAML file holding the configuration.
#
# @raise [FileNotFound]
# Will raise a file not found error when the path to the
# configuration YAML file does not exist.
#
# @raise [InvalidConfigurationError]
# Will raise an invalid configuration error indicating what in the
# YAML file is invalid for the configuration.
#
# @return [Configuration]
# A Configuration object containing the config hash loaded from the
# file passed.
#
def self.load(file_path)
raise(FileNotFound,"Configuration file '#{file_path}' does not exist") unless File.exist?(file_path)
doc = YAML.parse(File.new(file_path))
unless doc.kind_of?(YAML::Nodes::Document)
raise(InvalidConfigurationError,"Configuration found in '#{file_path}' is not YAML")
end
unless doc.root.kind_of?(YAML::Nodes::Mapping)
raise(InvalidConfigurationError,"Configuration found in '#{file_path}' is not a Hash")
end
config = {}
doc.root.children.each_slice(2) do |key,value|
case key.value
when 'ignore'
unless value.is_a?(YAML::Nodes::Sequence)
raise(InvalidConfigurationError,"'ignore' key found in config file, but is not an Array")
end
unless value.children.all? { |node| node.is_a?(YAML::Nodes::Scalar) }
raise(InvalidConfigurationError,"'ignore' array in config file contains a non-String")
end
config[:ignore] = value.children.map(&:value)
end
end
new(config)
end
#
# The list of advisory IDs to ignore.
#
# @return [Set]
#
attr_reader :ignore
#
# Initializes the configuration.
#
# @param [Hash] config
# The configuration hash.
#
# @option config [Array] :ignore
# The list of advisory IDs to ignore.
#
def initialize(config={})
@ignore = Set.new(config[:ignore])
end
end
end
end