class PuppetLint
Public: The public interface to puppet-lint.
Constants
- VERSION
Attributes
Public: Gets/Sets the String manifest code to be checked.
Public: Gets the String manifest with the errors fixed.
Public: Gets/Sets the String path to the manifest to be checked.
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.
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
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
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
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
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
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
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
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
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
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
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.
# File lib/puppet-lint.rb, line 138 def print_context(message) return if message[:check] == 'documentation' return if message[:kind] == :fixed line = get_context(message) offset = line.index(%r{\S}) || 1 puts "\n #{line.strip}" printf("%#{message[:column] + 2 - offset}s\n\n", '^') end
Public: Print any problems that were found out to stdout.
Returns nothing.
# File lib/puppet-lint.rb, line 213 def print_problems report(@problems) end
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
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
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