halyard-puppet-lint 1.2.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +7 -0
- data/.gitignore +9 -0
- data/.travis.yml +10 -0
- data/Gemfile +3 -0
- data/LICENSE +20 -0
- data/README.md +210 -0
- data/Rakefile +7 -0
- data/bin/puppet-lint +7 -0
- data/lib/puppet-lint.rb +214 -0
- data/lib/puppet-lint/bin.rb +79 -0
- data/lib/puppet-lint/checkplugin.rb +176 -0
- data/lib/puppet-lint/checks.rb +91 -0
- data/lib/puppet-lint/configuration.rb +153 -0
- data/lib/puppet-lint/data.rb +521 -0
- data/lib/puppet-lint/lexer.rb +373 -0
- data/lib/puppet-lint/lexer/token.rb +101 -0
- data/lib/puppet-lint/monkeypatches.rb +2 -0
- data/lib/puppet-lint/monkeypatches/string_percent.rb +52 -0
- data/lib/puppet-lint/monkeypatches/string_prepend.rb +13 -0
- data/lib/puppet-lint/optparser.rb +118 -0
- data/lib/puppet-lint/plugins.rb +74 -0
- data/lib/puppet-lint/plugins/check_classes.rb +285 -0
- data/lib/puppet-lint/plugins/check_comments.rb +55 -0
- data/lib/puppet-lint/plugins/check_conditionals.rb +65 -0
- data/lib/puppet-lint/plugins/check_documentation.rb +31 -0
- data/lib/puppet-lint/plugins/check_nodes.rb +29 -0
- data/lib/puppet-lint/plugins/check_resources.rb +194 -0
- data/lib/puppet-lint/plugins/check_strings.rb +174 -0
- data/lib/puppet-lint/plugins/check_variables.rb +19 -0
- data/lib/puppet-lint/plugins/check_whitespace.rb +170 -0
- data/lib/puppet-lint/tasks/puppet-lint.rb +91 -0
- data/lib/puppet-lint/version.rb +3 -0
- data/puppet-lint.gemspec +24 -0
- data/spec/fixtures/test/manifests/fail.pp +2 -0
- data/spec/fixtures/test/manifests/ignore.pp +1 -0
- data/spec/fixtures/test/manifests/ignore_multiple_block.pp +6 -0
- data/spec/fixtures/test/manifests/ignore_multiple_line.pp +2 -0
- data/spec/fixtures/test/manifests/ignore_reason.pp +1 -0
- data/spec/fixtures/test/manifests/init.pp +3 -0
- data/spec/fixtures/test/manifests/malformed.pp +1 -0
- data/spec/fixtures/test/manifests/url_interpolation.pp +12 -0
- data/spec/fixtures/test/manifests/warning.pp +2 -0
- data/spec/puppet-lint/bin_spec.rb +326 -0
- data/spec/puppet-lint/configuration_spec.rb +56 -0
- data/spec/puppet-lint/ignore_overrides_spec.rb +109 -0
- data/spec/puppet-lint/lexer/token_spec.rb +18 -0
- data/spec/puppet-lint/lexer_spec.rb +783 -0
- data/spec/puppet-lint/plugins/check_classes/autoloader_layout_spec.rb +105 -0
- data/spec/puppet-lint/plugins/check_classes/class_inherits_from_params_class_spec.rb +35 -0
- data/spec/puppet-lint/plugins/check_classes/inherits_across_namespaces_spec.rb +33 -0
- data/spec/puppet-lint/plugins/check_classes/names_containing_dash_spec.rb +45 -0
- data/spec/puppet-lint/plugins/check_classes/nested_classes_or_defines_spec.rb +76 -0
- data/spec/puppet-lint/plugins/check_classes/parameter_order_spec.rb +73 -0
- data/spec/puppet-lint/plugins/check_classes/right_to_left_relationship_spec.rb +25 -0
- data/spec/puppet-lint/plugins/check_classes/variable_scope_spec.rb +196 -0
- data/spec/puppet-lint/plugins/check_comments/slash_comments_spec.rb +45 -0
- data/spec/puppet-lint/plugins/check_comments/star_comments_spec.rb +84 -0
- data/spec/puppet-lint/plugins/check_conditionals/case_without_default_spec.rb +98 -0
- data/spec/puppet-lint/plugins/check_conditionals/selector_inside_resource_spec.rb +36 -0
- data/spec/puppet-lint/plugins/check_documentation/documentation_spec.rb +52 -0
- data/spec/puppet-lint/plugins/check_nodes/unquoted_node_name_spec.rb +146 -0
- data/spec/puppet-lint/plugins/check_resources/duplicate_params_spec.rb +100 -0
- data/spec/puppet-lint/plugins/check_resources/ensure_first_param_spec.rb +55 -0
- data/spec/puppet-lint/plugins/check_resources/ensure_not_symlink_target_spec.rb +89 -0
- data/spec/puppet-lint/plugins/check_resources/file_mode_spec.rb +113 -0
- data/spec/puppet-lint/plugins/check_resources/unquoted_file_mode_spec.rb +45 -0
- data/spec/puppet-lint/plugins/check_resources/unquoted_resource_title_spec.rb +216 -0
- data/spec/puppet-lint/plugins/check_strings/double_quoted_strings_spec.rb +199 -0
- data/spec/puppet-lint/plugins/check_strings/only_variable_string_spec.rb +114 -0
- data/spec/puppet-lint/plugins/check_strings/puppet_url_without_modules_spec.rb +62 -0
- data/spec/puppet-lint/plugins/check_strings/quoted_booleans_spec.rb +129 -0
- data/spec/puppet-lint/plugins/check_strings/single_quote_string_with_variables_spec.rb +17 -0
- data/spec/puppet-lint/plugins/check_strings/variables_not_enclosed_spec.rb +73 -0
- data/spec/puppet-lint/plugins/check_variables/variable_contains_dash_spec.rb +37 -0
- data/spec/puppet-lint/plugins/check_whitespace/2sp_soft_tabs_spec.rb +21 -0
- data/spec/puppet-lint/plugins/check_whitespace/80chars_spec.rb +54 -0
- data/spec/puppet-lint/plugins/check_whitespace/arrow_alignment_spec.rb +524 -0
- data/spec/puppet-lint/plugins/check_whitespace/hard_tabs_spec.rb +45 -0
- data/spec/puppet-lint/plugins/check_whitespace/trailing_whitespace_spec.rb +101 -0
- data/spec/puppet-lint_spec.rb +20 -0
- data/spec/spec_helper.rb +129 -0
- metadata +229 -0
checksums.yaml
ADDED
@@ -0,0 +1,7 @@
|
|
1
|
+
---
|
2
|
+
SHA1:
|
3
|
+
metadata.gz: 01fe54bcdc38ef4f85ced7628c9d5f4d28d2e240
|
4
|
+
data.tar.gz: df094f8c06d3a2a22e9eb99063492ceb2e763f90
|
5
|
+
SHA512:
|
6
|
+
metadata.gz: ab7971281f359ae1857082889fadec2abaa9e3f637a22e2d8ffb10c512df7d669a86cb04a34f53eccc05a5190d092360075f0935f3b6861cf252c87ddbf34b1c
|
7
|
+
data.tar.gz: 4db71bcab370a27e3602188477626594e8ab8ee1044550a4d92c3da67181414c7c45d636f94fdf93c33dcc9a42e08c605fbb5023515c4b310cb00726205ae030
|
data/.gitignore
ADDED
data/.travis.yml
ADDED
data/Gemfile
ADDED
data/LICENSE
ADDED
@@ -0,0 +1,20 @@
|
|
1
|
+
Copyright (c) 2011 Tim Sharpe
|
2
|
+
|
3
|
+
Permission is hereby granted, free of charge, to any person obtaining
|
4
|
+
a copy of this software and associated documentation files (the
|
5
|
+
"Software"), to deal in the Software without restriction, including
|
6
|
+
without limitation the rights to use, copy, modify, merge, publish,
|
7
|
+
distribute, sublicense, and/or sell copies of the Software, and to
|
8
|
+
permit persons to whom the Software is furnished to do so, subject to
|
9
|
+
the following conditions:
|
10
|
+
|
11
|
+
The above copyright notice and this permission notice shall be
|
12
|
+
included in all copies or substantial portions of the Software.
|
13
|
+
|
14
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
15
|
+
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
16
|
+
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
|
17
|
+
IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
|
18
|
+
CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
|
19
|
+
TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
|
20
|
+
SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
data/README.md
ADDED
@@ -0,0 +1,210 @@
|
|
1
|
+
# Puppet-lint
|
2
|
+
|
3
|
+
[![Build Status](https://secure.travis-ci.org/rodjek/puppet-lint.png)](http://travis-ci.org/rodjek/puppet-lint)
|
4
|
+
[![Inline docs](http://inch-ci.org/github/rodjek/puppet-lint.png?branch=master)](http://inch-ci.org/github/rodjek/puppet-lint)
|
5
|
+
|
6
|
+
**Notice:** This is a forked release of puppet-lint, which has been released to RubyGems as `halyard-puppet-lint`. It is [upstream hammerspace](https://github.com/airbnb/hammerspace)'s master branch, released to allow me to use the newer changes than the upstream 1.1.0 release.
|
7
|
+
|
8
|
+
The goal of this project is to implement as many of the recommended Puppet
|
9
|
+
style guidelines from the [Puppet Labs style
|
10
|
+
guide](http://docs.puppetlabs.com/guides/style_guide.html) as practical. It is not meant to validate syntax. Please use `puppet parser validate` for that.
|
11
|
+
|
12
|
+
## Installation
|
13
|
+
|
14
|
+
gem install puppet-lint
|
15
|
+
|
16
|
+
## Testing your manifests
|
17
|
+
|
18
|
+
### By hand
|
19
|
+
|
20
|
+
You can test a single manifest file by running
|
21
|
+
|
22
|
+
puppet-lint <path to file>
|
23
|
+
|
24
|
+
### Rake task
|
25
|
+
|
26
|
+
If you want to test your entire Puppet manifest directory, you can add
|
27
|
+
`require 'puppet-lint/tasks/puppet-lint'` to your Rakefile and then run
|
28
|
+
|
29
|
+
rake lint
|
30
|
+
|
31
|
+
If you want to modify the default behaviour of the rake task, you can modify
|
32
|
+
the PuppetLint configuration by defining the task yourself.
|
33
|
+
|
34
|
+
PuppetLint::RakeTask.new :lint do |config|
|
35
|
+
# Pattern of files to check, defaults to `**/*.pp`
|
36
|
+
config.pattern = 'modules'
|
37
|
+
|
38
|
+
# Pattern of files to ignore
|
39
|
+
config.ignore_paths = ['modules/apt', 'modules/stdlib']
|
40
|
+
|
41
|
+
# List of checks to disable
|
42
|
+
config.disable_checks = ['documentation', '80chars']
|
43
|
+
|
44
|
+
# Should puppet-lint prefix it's output with the file being checked,
|
45
|
+
# defaults to true
|
46
|
+
config.with_filename = false
|
47
|
+
|
48
|
+
# Should the task fail if there were any warnings, defaults to false
|
49
|
+
config.fail_on_warnings = true
|
50
|
+
|
51
|
+
# Format string for puppet-lint's output (see the puppet-lint help output
|
52
|
+
# for details
|
53
|
+
config.log_format = '%{filename} - %{message}'
|
54
|
+
|
55
|
+
# Print out the context for the problem, defaults to false
|
56
|
+
config.with_context = true
|
57
|
+
|
58
|
+
# Enable automatic fixing of problems, defaults to false
|
59
|
+
config.fix = true
|
60
|
+
|
61
|
+
# Show ignored problems in the output, defaults to false
|
62
|
+
config.show_ignored = true
|
63
|
+
|
64
|
+
# Compare module layout relative to the module root
|
65
|
+
config.relative = true
|
66
|
+
end
|
67
|
+
|
68
|
+
## Implemented tests
|
69
|
+
|
70
|
+
At the moment, the following tests have been implemented:
|
71
|
+
|
72
|
+
### Spacing, Indentation & Whitespace
|
73
|
+
|
74
|
+
* Must use two-space soft tabs.
|
75
|
+
* Must not use literal tab characters.
|
76
|
+
* Must not contain trailing white space.
|
77
|
+
* Should not exceed an 80 character line width
|
78
|
+
* An exception has been made for `source => 'puppet://...'` lines as
|
79
|
+
splitting these over multiple lines decreases the readability of the
|
80
|
+
manifests.
|
81
|
+
* Should align arrows (`=>`) within blocks of attributes.
|
82
|
+
|
83
|
+
### Quoting
|
84
|
+
|
85
|
+
* All strings that do not contain variables should be enclosed in single
|
86
|
+
quotes.
|
87
|
+
* An exception has been made for double quoted strings containing \n or \t.
|
88
|
+
* All strings that contain variables must be enclosed in double quotes.
|
89
|
+
* All variables should be enclosed in braces when interpolated in a string.
|
90
|
+
* Variables standing by themselves should not be quoted.
|
91
|
+
|
92
|
+
### Resources
|
93
|
+
|
94
|
+
* All resource titles should be quoted.
|
95
|
+
* An exception has been made for resource titles that consist of only
|
96
|
+
a variable standing by itself.
|
97
|
+
* If a resource declaration includes an `ensure` attribute, it should be the
|
98
|
+
first attribute specified.
|
99
|
+
* Symbolic links should be declared by using an ensure value of `link` and
|
100
|
+
explicitly specifying a value for the `target` attribute.
|
101
|
+
* File modes should be represented as a 4 digit string enclosed in single
|
102
|
+
quotes or use symbolic file modes.
|
103
|
+
|
104
|
+
### Conditionals
|
105
|
+
|
106
|
+
* You should not intermingle conditionals inside resource declarations (i.e.
|
107
|
+
selectors inside resources).
|
108
|
+
* Case statements should have a default case.
|
109
|
+
|
110
|
+
### Classes
|
111
|
+
|
112
|
+
* Relationship declarations with the chaining syntax should only be used in
|
113
|
+
the 'left to right' direction.
|
114
|
+
* Classes should not be defined inside a class.
|
115
|
+
* Defines should not be defined inside a class.
|
116
|
+
* Classes should not inherit between namespaces.
|
117
|
+
* Required parameters in class & defined type definitions should be listed
|
118
|
+
before optional parameters.
|
119
|
+
* When using top-scope variables, including facts, Puppet modules should
|
120
|
+
explicitly specify the empty namespace.
|
121
|
+
|
122
|
+
## Disabling checks
|
123
|
+
|
124
|
+
### puppet-lint
|
125
|
+
|
126
|
+
You can disable any of the checks when running the `puppet-lint` command by
|
127
|
+
adding a `--no-<check name>-check` flag to the command. For example, if you
|
128
|
+
wanted to skip the 80 character check, you would run
|
129
|
+
|
130
|
+
```
|
131
|
+
puppet-lint --no-80chars-check /path/to/my/manifest.pp
|
132
|
+
```
|
133
|
+
|
134
|
+
puppet-lint will also check for a `.puppet-lint.rc` file in the current
|
135
|
+
directory and your home directory and read in flags from there, so if you
|
136
|
+
wanted to always skip the hard tab character check, you could create
|
137
|
+
`~/.puppet-lint.rc` containing
|
138
|
+
|
139
|
+
```
|
140
|
+
--no-hard_tabs-check
|
141
|
+
```
|
142
|
+
|
143
|
+
For a list of all the flags just type:
|
144
|
+
|
145
|
+
```
|
146
|
+
puppet-lint --help
|
147
|
+
```
|
148
|
+
|
149
|
+
### Rake task
|
150
|
+
|
151
|
+
You can also disable checks when running puppet-lint through the supplied Rake
|
152
|
+
task. Simply add the following line after the `require` statement in your
|
153
|
+
`Rakefile`.
|
154
|
+
|
155
|
+
``` ruby
|
156
|
+
PuppetLint.configuration.send("disable_<check name>")
|
157
|
+
```
|
158
|
+
|
159
|
+
So, to disable the 80 character check, you would add:
|
160
|
+
|
161
|
+
``` ruby
|
162
|
+
PuppetLint.configuration.send("disable_80chars")
|
163
|
+
```
|
164
|
+
|
165
|
+
The Rake task also supports ignoring certain paths
|
166
|
+
from being linted:
|
167
|
+
|
168
|
+
``` ruby
|
169
|
+
PuppetLint.configuration.ignore_paths = ["vendor/**/*.pp"]
|
170
|
+
```
|
171
|
+
|
172
|
+
## Reporting bugs or incorrect results
|
173
|
+
|
174
|
+
If you find a bug in puppet-lint or its results, please create an issue in the
|
175
|
+
[repo issues tracker](https://github.com/rodjek/puppet-lint/issues/). Bonus
|
176
|
+
points will be awarded if you also include a patch that fixes the issue.
|
177
|
+
|
178
|
+
## Thank You
|
179
|
+
|
180
|
+
Many thanks to the following people for contributing to puppet-lint
|
181
|
+
|
182
|
+
* James Turnbull (@kartar)
|
183
|
+
* Jan Vansteenkiste (@vStone)
|
184
|
+
* Julian Simpson (@simpsonjulian)
|
185
|
+
* S. Zachariah Sprackett (@zsprackett)
|
186
|
+
|
187
|
+
As well as the many people who have reported the issues they've had!
|
188
|
+
|
189
|
+
## License
|
190
|
+
|
191
|
+
Copyright (c) 2011 Tim Sharpe
|
192
|
+
|
193
|
+
Permission is hereby granted, free of charge, to any person obtaining
|
194
|
+
a copy of this software and associated documentation files (the
|
195
|
+
"Software"), to deal in the Software without restriction, including
|
196
|
+
without limitation the rights to use, copy, modify, merge, publish,
|
197
|
+
distribute, sublicense, and/or sell copies of the Software, and to
|
198
|
+
permit persons to whom the Software is furnished to do so, subject to
|
199
|
+
the following conditions:
|
200
|
+
|
201
|
+
The above copyright notice and this permission notice shall be
|
202
|
+
included in all copies or substantial portions of the Software.
|
203
|
+
|
204
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
205
|
+
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
206
|
+
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
|
207
|
+
IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
|
208
|
+
CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
|
209
|
+
TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
|
210
|
+
SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
data/Rakefile
ADDED
data/bin/puppet-lint
ADDED
data/lib/puppet-lint.rb
ADDED
@@ -0,0 +1,214 @@
|
|
1
|
+
require 'set'
|
2
|
+
require 'puppet-lint/version'
|
3
|
+
require 'puppet-lint/lexer'
|
4
|
+
require 'puppet-lint/configuration'
|
5
|
+
require 'puppet-lint/data'
|
6
|
+
require 'puppet-lint/checks'
|
7
|
+
require 'puppet-lint/bin'
|
8
|
+
require 'puppet-lint/monkeypatches'
|
9
|
+
|
10
|
+
class PuppetLint::NoCodeError < StandardError; end
|
11
|
+
class PuppetLint::NoFix < StandardError; end
|
12
|
+
|
13
|
+
# Public: The public interface to puppet-lint.
|
14
|
+
class PuppetLint
|
15
|
+
# Public: Gets/Sets the String manifest code to be checked.
|
16
|
+
attr_accessor :code
|
17
|
+
|
18
|
+
# Public: Gets the String manifest with the errors fixed.
|
19
|
+
attr_reader :manifest
|
20
|
+
|
21
|
+
# Public: Returns an Array of Hashes describing the problems found in the
|
22
|
+
# manifest.
|
23
|
+
#
|
24
|
+
# Each Hash will contain *at least*:
|
25
|
+
# :check - The Symbol name of the check that generated the problem.
|
26
|
+
# :kind - The Symbol kind of the problem (:error, :warning, or
|
27
|
+
# :fixed).
|
28
|
+
# :line - The Integer line number of the location of the problem in
|
29
|
+
# the manifest.
|
30
|
+
# :column - The Integer column number of the location of the problem in
|
31
|
+
# the manifest.
|
32
|
+
# :message - The String message describing the problem that was found.
|
33
|
+
attr_reader :problems
|
34
|
+
|
35
|
+
# Public: Gets/Sets the String path to the manifest to be checked.
|
36
|
+
attr_accessor :path
|
37
|
+
|
38
|
+
# Public: Returns a Hash of linter statistics
|
39
|
+
#
|
40
|
+
# :error - An Integer count of errors found in the manifest.
|
41
|
+
# :warning - An Integer count of warnings found in the manifest.
|
42
|
+
# :fixed - An Integer count of problems found in the manifest that were
|
43
|
+
# automatically fixed.
|
44
|
+
attr_reader :statistics
|
45
|
+
|
46
|
+
# Public: Initialise a new PuppetLint object.
|
47
|
+
def initialize
|
48
|
+
@code = nil
|
49
|
+
@statistics = {:error => 0, :warning => 0, :fixed => 0, :ignored => 0}
|
50
|
+
@manifest = ''
|
51
|
+
end
|
52
|
+
|
53
|
+
# Public: Access PuppetLint's configuration from outside the class.
|
54
|
+
#
|
55
|
+
# Returns a PuppetLint::Configuration object.
|
56
|
+
def self.configuration
|
57
|
+
@configuration ||= PuppetLint::Configuration.new
|
58
|
+
end
|
59
|
+
|
60
|
+
# Public: Access PuppetLint's configuration from inside the class.
|
61
|
+
#
|
62
|
+
# Returns a PuppetLint::Configuration object.
|
63
|
+
def configuration
|
64
|
+
self.class.configuration
|
65
|
+
end
|
66
|
+
|
67
|
+
# Public: Set the path of the manifest file to be tested and read the
|
68
|
+
# contents of the file.
|
69
|
+
#
|
70
|
+
# Returns nothing.
|
71
|
+
def file=(path)
|
72
|
+
if File.exist? path
|
73
|
+
@path = path
|
74
|
+
@code = File.read(path)
|
75
|
+
end
|
76
|
+
end
|
77
|
+
|
78
|
+
# Internal: Retrieve the format string to be used when writing problems to
|
79
|
+
# STDOUT. If the user has not specified a custom log format, build one for
|
80
|
+
# them.
|
81
|
+
#
|
82
|
+
# Returns a format String to be used with String#%.
|
83
|
+
def log_format
|
84
|
+
if configuration.log_format == ''
|
85
|
+
## recreate previous old log format as far as thats possible.
|
86
|
+
format = '%{KIND}: %{message} on line %{line}'
|
87
|
+
if configuration.with_filename
|
88
|
+
format.prepend '%{path} - '
|
89
|
+
end
|
90
|
+
configuration.log_format = format
|
91
|
+
end
|
92
|
+
return configuration.log_format
|
93
|
+
end
|
94
|
+
|
95
|
+
# Internal: Format a problem message and print it to STDOUT.
|
96
|
+
#
|
97
|
+
# message - A Hash containing all the information about a problem.
|
98
|
+
#
|
99
|
+
# Returns nothing.
|
100
|
+
def format_message(message)
|
101
|
+
format = log_format
|
102
|
+
puts format % message
|
103
|
+
if message[:kind] == :ignored && !message[:reason].nil?
|
104
|
+
puts " #{message[:reason]}"
|
105
|
+
end
|
106
|
+
end
|
107
|
+
|
108
|
+
# Internal: Print out the line of the manifest on which the problem was found
|
109
|
+
# as well as a marker pointing to the location on the line.
|
110
|
+
#
|
111
|
+
# message - A Hash containing all the information about a problem.
|
112
|
+
#
|
113
|
+
# Returns nothing.
|
114
|
+
def print_context(message)
|
115
|
+
return if message[:check] == 'documentation'
|
116
|
+
return if message[:kind] == :fixed
|
117
|
+
line = PuppetLint::Data.manifest_lines[message[:line] - 1]
|
118
|
+
offset = line.index(/\S/) || 1
|
119
|
+
puts "\n #{line.strip}"
|
120
|
+
printf "%#{message[:column] + 2 - offset}s\n\n", '^'
|
121
|
+
end
|
122
|
+
|
123
|
+
# Internal: Print the reported problems with a manifest to stdout.
|
124
|
+
#
|
125
|
+
# problems - An Array of problem Hashes as returned by
|
126
|
+
# PuppetLint::Checks#run.
|
127
|
+
#
|
128
|
+
# Returns nothing.
|
129
|
+
def report(problems)
|
130
|
+
problems.each do |message|
|
131
|
+
next if message[:kind] == :ignored && !PuppetLint.configuration.show_ignored
|
132
|
+
|
133
|
+
message[:KIND] = message[:kind].to_s.upcase
|
134
|
+
message[:linenumber] = message[:line]
|
135
|
+
|
136
|
+
if message[:kind] == :fixed || [message[:kind], :all].include?(configuration.error_level)
|
137
|
+
format_message message
|
138
|
+
print_context(message) if configuration.with_context
|
139
|
+
end
|
140
|
+
end
|
141
|
+
end
|
142
|
+
|
143
|
+
# Public: Determine if PuppetLint found any errors in the manifest.
|
144
|
+
#
|
145
|
+
# Returns true if errors were found, otherwise returns false.
|
146
|
+
def errors?
|
147
|
+
@statistics[:error] != 0
|
148
|
+
end
|
149
|
+
|
150
|
+
# Public: Determine if PuppetLint found any warnings in the manifest.
|
151
|
+
#
|
152
|
+
# Returns true if warnings were found, otherwise returns false.
|
153
|
+
def warnings?
|
154
|
+
@statistics[:warning] != 0
|
155
|
+
end
|
156
|
+
|
157
|
+
# Public: Run the loaded manifest code through the lint checks and print the
|
158
|
+
# results of the checks to stdout.
|
159
|
+
#
|
160
|
+
# Returns nothing.
|
161
|
+
# Raises PuppetLint::NoCodeError if no manifest code has been loaded.
|
162
|
+
def run
|
163
|
+
if @code.nil?
|
164
|
+
raise PuppetLint::NoCodeError
|
165
|
+
end
|
166
|
+
|
167
|
+
if @code.empty?
|
168
|
+
@problems = []
|
169
|
+
@manifest = []
|
170
|
+
return
|
171
|
+
end
|
172
|
+
|
173
|
+
linter = PuppetLint::Checks.new
|
174
|
+
@problems = linter.run(@path, @code)
|
175
|
+
@problems.each { |problem| @statistics[problem[:kind]] += 1 }
|
176
|
+
|
177
|
+
@manifest = linter.manifest if PuppetLint.configuration.fix
|
178
|
+
end
|
179
|
+
|
180
|
+
# Public: Print any problems that were found out to stdout.
|
181
|
+
#
|
182
|
+
# Returns nothing.
|
183
|
+
def print_problems
|
184
|
+
report @problems
|
185
|
+
end
|
186
|
+
|
187
|
+
# Public: Define a new check.
|
188
|
+
#
|
189
|
+
# name - A unique name for the check as a Symbol.
|
190
|
+
# block - The check logic. This must contain a `check` method and optionally
|
191
|
+
# a `fix` method.
|
192
|
+
#
|
193
|
+
# Returns nothing.
|
194
|
+
#
|
195
|
+
# Examples
|
196
|
+
#
|
197
|
+
# PuppetLint.new_check(:foo) do
|
198
|
+
# def check
|
199
|
+
# end
|
200
|
+
# end
|
201
|
+
def self.new_check(name, &block)
|
202
|
+
class_name = name.to_s.split('_').map(&:capitalize).join
|
203
|
+
klass = PuppetLint.const_set("Check#{class_name}", Class.new(PuppetLint::CheckPlugin))
|
204
|
+
klass.const_set('NAME', name)
|
205
|
+
klass.class_exec(&block)
|
206
|
+
PuppetLint.configuration.add_check(name, klass)
|
207
|
+
PuppetLint::Data.ignore_overrides[name] ||= {}
|
208
|
+
end
|
209
|
+
end
|
210
|
+
|
211
|
+
# Default configuration options
|
212
|
+
PuppetLint.configuration.defaults
|
213
|
+
|
214
|
+
require 'puppet-lint/plugins'
|