Class: PuppetLint

Inherits:
Object
  • Object
show all
Defined in:
lib/puppet-lint.rb,
lib/puppet-lint/lexer.rb,
lib/puppet-lint/plugins.rb,
lib/puppet-lint/version.rb,
lib/puppet-lint/lexer/token.rb,
lib/puppet-lint/configuration.rb,
lib/puppet-lint/tasks/puppet-lint.rb

Overview

Public: The public interface to puppet-lint.

Defined Under Namespace

Classes: Bin, CheckPlugin, Checks, Configuration, Data, Lexer, LexerError, NoCodeError, NoFix, OptParser, Plugins, RakeTask

Constant Summary collapse

VERSION =
'1.1.0.1'

Instance Attribute Summary collapse

Class Method Summary collapse

Instance Method Summary collapse

Constructor Details

#initializePuppetLint

Public: Initialise a new PuppetLint object.


47
48
49
50
51
# File 'lib/puppet-lint.rb', line 47

def initialize
  @code = nil
  @statistics = {:error => 0, :warning => 0, :fixed => 0, :ignored => 0}
  @manifest = ''
end

Instance Attribute Details

#codeObject

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


16
17
18
# File 'lib/puppet-lint.rb', line 16

def code
  @code
end

#manifestObject (readonly)

Public: Gets the String manifest with the errors fixed.


19
20
21
# File 'lib/puppet-lint.rb', line 19

def manifest
  @manifest
end

#pathObject

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


36
37
38
# File 'lib/puppet-lint.rb', line 36

def path
  @path
end

#problemsObject (readonly)

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.

33
34
35
# File 'lib/puppet-lint.rb', line 33

def problems
  @problems
end

#statisticsObject (readonly)

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.

44
45
46
# File 'lib/puppet-lint.rb', line 44

def statistics
  @statistics
end

Class Method Details

.configurationObject

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

Returns a PuppetLint::Configuration object.


56
57
58
# File 'lib/puppet-lint.rb', line 56

def self.configuration
  @configuration ||= PuppetLint::Configuration.new
end

.new_check(name, &block) ⇒ Object

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

201
202
203
204
205
206
207
208
# File 'lib/puppet-lint.rb', line 201

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

Instance Method Details

#configurationObject

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

Returns a PuppetLint::Configuration object.


63
64
65
# File 'lib/puppet-lint.rb', line 63

def configuration
  self.class.configuration
end

#errors?Boolean

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

Returns true if errors were found, otherwise returns false.

Returns:

  • (Boolean)

146
147
148
# File 'lib/puppet-lint.rb', line 146

def errors?
  @statistics[:error] != 0
end

#file=(path) ⇒ Object

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

Returns nothing.


71
72
73
74
75
76
# File 'lib/puppet-lint.rb', line 71

def file=(path)
  if File.exist? path
    @path = path
    @code = File.read(path)
  end
end

#format_message(message) ⇒ Object

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

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

Returns nothing.


100
101
102
103
104
105
106
# File 'lib/puppet-lint.rb', line 100

def format_message(message)
  format = log_format
  puts format % message
  if message[:kind] == :ignored && !message[:reason].nil?
    puts "  #{message[:reason]}"
  end
end

#log_formatObject

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#%.


83
84
85
86
87
88
89
90
91
92
93
# File 'lib/puppet-lint.rb', line 83

def log_format
  if configuration.log_format == ''
    ## recreate previous old log format as far as thats possible.
    format = '%{KIND}: %{message} on line %{line}'
    if configuration.with_filename
      format.prepend '%{path} - '
    end
    configuration.log_format = format
  end
  return 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.


114
115
116
117
118
119
120
121
# File 'lib/puppet-lint.rb', line 114

def print_context(message)
  return if message[:check] == 'documentation'
  return if message[:kind] == :fixed
  line = PuppetLint::Data.manifest_lines[message[:line] - 1]
  offset = line.index(/\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.


183
184
185
# File 'lib/puppet-lint.rb', line 183

def print_problems
  report @problems
end

#report(problems) ⇒ Object

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

problems - An Array of problem Hashes as returned by

PuppetLint::Checks#run.

Returns nothing.


129
130
131
132
133
134
135
136
137
138
139
140
141
# File 'lib/puppet-lint.rb', line 129

def report(problems)
  problems.each do |message|
    next if message[:kind] == :ignored && !PuppetLint.configuration.show_ignored

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

    if message[:kind] == :fixed || [message[:kind], :all].include?(configuration.error_level)
      format_message message
      print_context(message) if configuration.with_context
    end
  end
end

#runObject

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.


162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
# File 'lib/puppet-lint.rb', line 162

def run
  if @code.nil?
    raise PuppetLint::NoCodeError
  end

  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?Boolean

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

Returns true if warnings were found, otherwise returns false.

Returns:

  • (Boolean)

153
154
155
# File 'lib/puppet-lint.rb', line 153

def warnings?
  @statistics[:warning] != 0
end