class Sfn::Lint::RuleSet

Named collection of rules

Attributes

name[R]

@return [Symbol] name

provider[R]

@return [Symbol] target provider

rules[R]

@return [Array<Rule>] rules of set

Public Class Methods

build(name, provider = :aws, &block) click to toggle source

RuleSet generator helper for quickly building simple rule sets

@param name [String] name of rule set @param provider [String, Symbol] target provider @yieldblock rule set content

# File lib/sfn/lint/rule_set.rb, line 47
def build(name, provider = :aws, &block)
  provider = Bogo::Utility.snake(provider).to_sym
  rs = Creator::RuleSet.new(provider)
  rs.instance_exec(&block)
  self.new(name, provider, rs.items)
end
get(name, provider = :aws) click to toggle source

Get registered rule set

@param name [String] name of rule set @param provider [String] target provider @return [RuleSet, NilClass]

# File lib/sfn/lint/rule_set.rb, line 68
def get(name, provider = :aws)
  provider = Bogo::Utility.snake(provider)
  @@_rule_set_registry.get(provider, name)
end
get_all(provider = :aws) click to toggle source

Get all rule sets for specified provider

@param provider [String] target provider @return [Array<RuleSet>]

# File lib/sfn/lint/rule_set.rb, line 77
def get_all(provider = :aws)
  @@_rule_set_registry.fetch(provider, {}).values
end
new(name, provider = :aws, rules = []) click to toggle source

Create new rule set

@param name [String, Symbol] name of rule set @param provider [String, Symbol] name of target provider @param rules [Array<Rule>] list of rules defining this set @return [self]

# File lib/sfn/lint/rule_set.rb, line 97
def initialize(name, provider = :aws, rules = [])
  @name = name.to_sym
  @provider = Bogo::Utility.snake(provider).to_sym
  @rules = rules.dup.uniq.freeze
  validate_rules!
end
register(rule_set) click to toggle source

Register a rule set

@param rule_set [RuleSet] @return [TrueClass]

# File lib/sfn/lint/rule_set.rb, line 58
def register(rule_set)
  @@_rule_set_registry.set(rule_set.provider, rule_set.name, rule_set)
  true
end

Public Instance Methods

add_rule(rule) click to toggle source

Add a new rule to the collection

@param rule [Rule] new rule to add @return [self]

# File lib/sfn/lint/rule_set.rb, line 108
def add_rule(rule)
  new_rules = rules.dup
  new_rules << rule
  @rules = new_rules.uniq.freeze
  validate_rules!
  self
end
apply(template) click to toggle source

Apply rule set to template.

@param template [Hash] @return [TrueClass, Array<String>] true on success, list failure messages on failure

# File lib/sfn/lint/rule_set.rb, line 131
def apply(template)
  failures = collect_failures(template)
  if failures.empty?
    true
  else
    failures.map do |failure|
      failure[:rule].generate_fail_message(failure[:result])
    end
  end
end
collect_failures(template) click to toggle source

Process template through rules defined in this set and store failure information

@param template [Hash] @return [Array<Rule>] list of failures

# File lib/sfn/lint/rule_set.rb, line 147
def collect_failures(template)
  results = rules.map do |rule|
    result = rule.apply(template)
    result == true ? true : Smash.new(:rule => rule, :result => result)
  end
  results.delete_if { |i| i == true }
  results
end
remove_rule(rule) click to toggle source

Remove a rule from the collection

@param rule [Rule] rule to remove @return [self]

# File lib/sfn/lint/rule_set.rb, line 120
def remove_rule(rule)
  new_rules = rules.dup
  new_rules.delete(rule)
  @rules = new_rules.uniq.freeze
  self
end
validate_rules!() click to toggle source

Check that provided rules provider match rule set defined provider

# File lib/sfn/lint/rule_set.rb, line 157
def validate_rules!
  non_match = rules.find_all do |rule|
    rule.provider != provider
  end
  unless non_match.empty?
    raise ArgumentError.new "Rule set defines `#{provider}` as provider but includes rules for " \
                            "non matching providers. (#{non_match.map(&:provider).map(&:to_s).uniq.sort.join(", ")})"
  end
end