class Sfn::Command::Lint

Lint command

Public Instance Methods

execute!() click to toggle source

Perform linting

# File lib/sfn/command/lint.rb, line 11
def execute!
  print_only_original = config[:print_only]
  config[:print_only] = true
  file = load_template_file
  ui.info "#{ui.color("Template Linting (#{provider.connection.provider}): ", :bold)} #{config[:file].sub(Dir.pwd, "").sub(%r{^/}, "")}"
  config[:print_only] = print_only_original

  raw_template = parameter_scrub!(template_content(file))

  if config[:print_only]
    ui.puts raw_template
  else
    result = lint_template(raw_template)
    if result == true
      ui.info ui.color("  -> VALID", :green, :bold)
    else
      ui.info ui.color("  -> INVALID", :red, :bold)
      result.each do |failure|
        ui.error "Result Set: #{ui.color(failure[:rule_set].name, :red, :bold)}"
        failure[:failures].each do |f_msg|
          ui.fatal f_msg
        end
      end
      raise "Linting failure"
    end
  end
end
lint_template(template) click to toggle source

Apply linting to given template

@param template [Hash] @return [TrueClass, Array<Smash[:rule_set, :failures]>]

# File lib/sfn/command/lint.rb, line 43
def lint_template(template)
  results = rule_sets.map do |set|
    result = set.apply(template)
    unless result == true
      Smash.new(:rule_set => set, :failures => result)
    end
  end.compact
  results.empty? ? true : results
end
rule_sets() click to toggle source

@return [Array<Sfn::Lint::RuleSet>]

# File lib/sfn/command/lint.rb, line 54
def rule_sets
  sets = [config[:lint_directory]].flatten.compact.map do |directory|
    if File.directory?(directory)
      files = Dir.glob(File.join(directory, "**", "**", "*.rb"))
      files.map do |path|
        begin
          Sfn::Lint.class_eval(
            IO.read(path), path, 1
          )
        rescue
          ui.warn "Failed to load detected file: #{path}"
          nil
        end
      end
    end
  end.flatten.compact.find_all { |rs| rs.provider == provider.connection.provider }
  unless config[:local_rule_sets_only]
    sets += Sfn::Lint::RuleSet.get_all(provider.connection.provider)
  end
  if config[:disabled_rule_set]
    disabled = [config[:disabled_rule_set]].flatten.compact
    sets.delete_if { |i| disabled.include?(i.name.to_s) }
  end
  if config[:enabled_rule_set]
    enabled = [config[:enabled_rule_set]].flatten.compact
    sets.delete_if { |i| enabled.include?(i.name.to_s) }
  end
  sets
end