class PuppetLint

Public: The public interface to puppet-lint.

Constants

VERSION

Attributes

code[RW]

Public: Gets/Sets the String manifest code to be checked.

manifest[R]

Public: Gets the String manifest with the errors fixed.

path[RW]

Public: Gets/Sets the String path to the manifest to be checked.

problems[R]

Public: Returns an Array of Hashes describing the problems found in the manifest.

Each Hash will contain *at least*:

:check   - The Symbol name of the check that generated the problem.
:kind    - The Symbol kind of the problem (:error, :warning, or
           :fixed).
:line    - The Integer line number of the location of the problem in
           the manifest.
:column  - The Integer column number of the location of the problem in
           the manifest.
:message - The String message describing the problem that was found.
statistics[R]

Public: Returns a Hash of linter statistics

:error   - An Integer count of errors found in the manifest.
:warning - An Integer count of warnings found in the manifest.
:fixed   - An Integer count of problems found in the manifest that were
           automatically fixed.

Public Class Methods

configuration() click to toggle source

Public: Access PuppetLint's configuration from outside the class.

Returns a PuppetLint::Configuration object.

# File lib/puppet-lint.rb, line 67
def self.configuration
  @configuration ||= PuppetLint::Configuration.new
end
new() click to toggle source

Public: Initialise a new PuppetLint object.

# File lib/puppet-lint.rb, line 58
def initialize
  @code = nil
  @statistics = { :error => 0, :warning => 0, :fixed => 0, :ignored => 0 }
  @manifest = ''
end
new_check(name, &block) click to toggle source

Public: Define a new check.

name - A unique name for the check as a Symbol. block - The check logic. This must contain a `check` method and optionally

a `fix` method.

Returns nothing.

Examples

PuppetLint.new_check(:foo) do
  def check
  end
end
# File lib/puppet-lint.rb, line 231
def self.new_check(name, &block)
  class_name = name.to_s.split('_').map(&:capitalize).join
  klass = PuppetLint.const_set("Check#{class_name}", Class.new(PuppetLint::CheckPlugin))
  klass.const_set('NAME', name)
  klass.class_exec(&block)
  PuppetLint.configuration.add_check(name, klass)
  PuppetLint::Data.ignore_overrides[name] ||= {}
end

Public Instance Methods

configuration() click to toggle source

Public: Access PuppetLint's configuration from inside the class.

Returns a PuppetLint::Configuration object.

# File lib/puppet-lint.rb, line 74
def configuration
  self.class.configuration
end
errors?() click to toggle source

Public: Determine if PuppetLint found any errors in the manifest.

Returns true if errors were found, otherwise returns false.

# File lib/puppet-lint.rb, line 178
def errors?
  @statistics[:error] != 0
end
file=(path) click to toggle source

Public: Set the path of the manifest file to be tested and read the contents of the file.

Returns nothing.

# File lib/puppet-lint.rb, line 82
def file=(path)
  return unless File.exist?(path)

  @path = path
  File.open(path, 'rb:UTF-8') do |f|
    @code = f.read
  end

  # Check if the input is an SE Linux policy package file (which also use
  # the .pp extension), which all have the first 4 bytes 0xf97cff8f.
  @code = '' if @code[0..3].unpack('V').first == 0xf97cff8f
end
format_message(message) click to toggle source

Internal: Format a problem message and print it to STDOUT.

message - A Hash containing all the information about a problem.

Returns nothing.

# File lib/puppet-lint.rb, line 116
def format_message(message)
  format = log_format
  puts format % message

  puts "  #{message[:reason]}" if message[:kind] == :ignored && !message[:reason].nil?
end
get_context(message) click to toggle source

Internal: Get the line of the manifest on which the problem was found

message - A Hash containing all the information about a problem.

Returns the problematic line as a string.

# File lib/puppet-lint.rb, line 128
def get_context(message)
  PuppetLint::Data.manifest_lines[message[:line] - 1].strip
end
log_format() click to toggle source

Internal: Retrieve the format string to be used when writing problems to STDOUT. If the user has not specified a custom log format, build one for them.

Returns a format String to be used with String#%.

# File lib/puppet-lint.rb, line 100
def log_format
  if configuration.log_format.nil? || configuration.log_format.empty?
    format = '%{KIND}: %{message} on line %{line}'
    format.prepend('%{path} - ') if configuration.with_filename
    format.concat(' (check: %{check})')
    configuration.log_format = format
  end

  configuration.log_format
end
print_context(message) click to toggle source

Internal: Print out the line of the manifest on which the problem was found as well as a marker pointing to the location on the line.

message - A Hash containing all the information about a problem.

Returns nothing.

print_problems() click to toggle source

Public: Print any problems that were found out to stdout.

Returns nothing.

report(problems) click to toggle source

Internal: Print the reported problems with a manifest to stdout.

problems - An Array of problem Hashes as returned by

PuppetLint::Checks#run.

Returns nothing.

# File lib/puppet-lint.rb, line 153
def report(problems)
  json = []
  problems.each do |message|
    next if message[:kind] == :ignored && !PuppetLint.configuration.show_ignored

    message[:KIND] = message[:kind].to_s.upcase

    if message[:kind] == :fixed || [message[:kind], :all].include?(configuration.error_level)
      if configuration.json
        message['context'] = get_context(message) if configuration.with_context
        json << message
      else
        format_message(message)
        print_context(message) if configuration.with_context
      end
    end
  end
  puts JSON.pretty_generate(json) if configuration.json

  $stderr.puts 'Try running `puppet parser validate <file>`' if problems.any? { |p| p[:check] == :syntax }
end
run() click to toggle source

Public: Run the loaded manifest code through the lint checks and print the results of the checks to stdout.

Returns nothing. Raises PuppetLint::NoCodeError if no manifest code has been loaded.

# File lib/puppet-lint.rb, line 194
def run
  raise PuppetLint::NoCodeError if @code.nil?

  if @code.empty?
    @problems = []
    @manifest = ''
    return
  end

  linter = PuppetLint::Checks.new
  @problems = linter.run(@path, @code)
  @problems.each { |problem| @statistics[problem[:kind]] += 1 }

  @manifest = linter.manifest if PuppetLint.configuration.fix
end
warnings?() click to toggle source

Public: Determine if PuppetLint found any warnings in the manifest.

Returns true if warnings were found, otherwise returns false.

# File lib/puppet-lint.rb, line 185
def warnings?
  @statistics[:warning] != 0
end