puppet-lint-strict_indent-check 2.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +7 -0
- data/LICENSE +3 -0
- data/README.md +44 -0
- data/lib/puppet-lint/plugins/check_strict_indent.rb +154 -0
- data/spec/fixtures/fail/1.pp +9 -0
- data/spec/fixtures/pass/1.pp +55 -0
- data/spec/puppet-lint/plugins/check_strict_indent_spec.rb +62 -0
- data/spec/spec_helper.rb +3 -0
- metadata +125 -0
checksums.yaml
ADDED
@@ -0,0 +1,7 @@
|
|
1
|
+
---
|
2
|
+
SHA1:
|
3
|
+
metadata.gz: feb8dee2777ebf6abdfc11c8d5369963d316b7aa
|
4
|
+
data.tar.gz: 972df005087cfd211b697829aeee989906113543
|
5
|
+
SHA512:
|
6
|
+
metadata.gz: 51b9ceeef1fc715949bba52f2533783b5b4f286383621a4c43922ea048b83bbf6d962aadf91fb867e9699ec21daa9751150d9ac40770fc4efa1e69004a2c34a2
|
7
|
+
data.tar.gz: 3c8b2a98562412ea40ca184ccfe27890c073cf642bb5e19c2c0ad5c18a2fea375abc1af98c8adce906b600425c4a035518987f1445fe4293fcce2a44ed4b735c
|
data/LICENSE
ADDED
data/README.md
ADDED
@@ -0,0 +1,44 @@
|
|
1
|
+
Installation
|
2
|
+
===
|
3
|
+
|
4
|
+
<pre>
|
5
|
+
gem install puppet-lint-strict_indent-check
|
6
|
+
</pre>
|
7
|
+
|
8
|
+
Usage
|
9
|
+
===
|
10
|
+
|
11
|
+
This plugin provides an indentation check for puppet-lint `strict_indent`. The check has a strict expectation for all indentation, except comments and whitespace/blank lines.
|
12
|
+
|
13
|
+
supports --fix flag
|
14
|
+
|
15
|
+
Check will raise a warning for any files that don't have 2-space indent, and follow specific guidelines for increase/decrease of indent.
|
16
|
+
|
17
|
+
Alternate Indentation
|
18
|
+
===
|
19
|
+
|
20
|
+
Indentation defaults to 2 spaces. To use a different number of spaces, use the `-l` option to load ruby file changing the `chars_per_indent` config.
|
21
|
+
|
22
|
+
config file `chars_per_indent_4.rb`:
|
23
|
+
<pre>
|
24
|
+
# This could also be set in your Rakefile
|
25
|
+
PuppetLint.configuration.chars_per_indent = 4
|
26
|
+
</pre>
|
27
|
+
|
28
|
+
lint command:
|
29
|
+
<pre>
|
30
|
+
puppet-lint -l chars_per_indent_4.rb puppet-mysql/manifests/init.pp
|
31
|
+
</pre>
|
32
|
+
|
33
|
+
Acceptable Identation
|
34
|
+
===
|
35
|
+
|
36
|
+
* indent should increase by one step the line after each opened brace (square, curly, paren)
|
37
|
+
* indent should decrease by one step the line of every closed brace.
|
38
|
+
* indent should increase by one step the line after a resource title, unless it already increased due to a bracket.
|
39
|
+
* indent should decrease by one step the line after the end of a resource due to semicolon, if it was indented for resource title.
|
40
|
+
* indent should decrease by one step the line of the end of a resource due to right curly brace, if it was indented for resource title, and not ended by a semicolon.
|
41
|
+
* indent should increase by one step the line after an equals `=` or farrow `=>` that ends a line, but only for that one line.
|
42
|
+
|
43
|
+
see `spec/fixtures/pass/` for good indentation examples
|
44
|
+
see `spec/fixtures/fail/` for bad indentation examples
|
@@ -0,0 +1,154 @@
|
|
1
|
+
# Public: Check the manifest tokens for correct indent levels and
|
2
|
+
# record a warning for each instance found.
|
3
|
+
|
4
|
+
PuppetLint.new_check(:'strict_indent') do
|
5
|
+
def match(tokens)
|
6
|
+
open = {
|
7
|
+
:LBRACE => [],
|
8
|
+
:LBRACK => [],
|
9
|
+
:LPAREN => [],
|
10
|
+
}
|
11
|
+
|
12
|
+
matches = {}
|
13
|
+
|
14
|
+
tokens.each do |token|
|
15
|
+
if [:LBRACE, :LBRACK, :LPAREN].include?(token.type)
|
16
|
+
open[token.type] << token
|
17
|
+
elsif [:RBRACE, :RBRACK, :RPAREN].include?(token.type)
|
18
|
+
match = open[("L" + token.type[1..-1]).to_sym].pop
|
19
|
+
if not match.nil?
|
20
|
+
matches[token] = match
|
21
|
+
matches[match] = token
|
22
|
+
end
|
23
|
+
end
|
24
|
+
end
|
25
|
+
|
26
|
+
matches
|
27
|
+
end
|
28
|
+
|
29
|
+
def check
|
30
|
+
chars_per_indent = PuppetLint.configuration.chars_per_indent || 2
|
31
|
+
indent = 0
|
32
|
+
colon_indent = nil
|
33
|
+
|
34
|
+
matches = match(tokens)
|
35
|
+
|
36
|
+
tokens.select { |token|
|
37
|
+
token.type == :NEWLINE
|
38
|
+
}.reject { |token|
|
39
|
+
# ignore newline at end of code
|
40
|
+
token.next_token.nil?
|
41
|
+
}.each do |token|
|
42
|
+
temp_indent = 0
|
43
|
+
|
44
|
+
# indent for open groups in the previous line
|
45
|
+
open_groups = 0
|
46
|
+
prev_token = token.prev_token
|
47
|
+
while not prev_token.nil? and prev_token.type != :NEWLINE
|
48
|
+
if [:LBRACE, :LBRACK, :LPAREN].include?(prev_token.type)
|
49
|
+
if matches[prev_token].nil? or matches[prev_token].line > prev_token.line
|
50
|
+
# left braces not matched in the same line increase indent
|
51
|
+
open_groups += 1
|
52
|
+
end
|
53
|
+
end
|
54
|
+
prev_token = prev_token.prev_token
|
55
|
+
end
|
56
|
+
indent += open_groups
|
57
|
+
|
58
|
+
# reset prev_token to last non-whitespace token on previous line
|
59
|
+
prev_token = token.prev_token
|
60
|
+
while not prev_token.nil? and prev_token.type == :WHITESPACE
|
61
|
+
prev_token = prev_token.prev_token
|
62
|
+
end
|
63
|
+
|
64
|
+
# get type if available
|
65
|
+
prev_type = prev_token.nil? ? nil : prev_token.type
|
66
|
+
|
67
|
+
# handle change in indent based on last token
|
68
|
+
case prev_type
|
69
|
+
when :COLON
|
70
|
+
if open_groups == 0
|
71
|
+
if colon_indent.nil?
|
72
|
+
# only indent for a colon when you haven't indented yet
|
73
|
+
colon_indent = prev_token.line
|
74
|
+
indent += 1
|
75
|
+
else
|
76
|
+
# you probably missed a semicolon two lines ago
|
77
|
+
end
|
78
|
+
end
|
79
|
+
when :SEMIC
|
80
|
+
if not colon_indent.nil?
|
81
|
+
# only unindent for a semicolon when we've indented for a colon
|
82
|
+
colon_indent = nil
|
83
|
+
indent -= 1
|
84
|
+
end
|
85
|
+
when :EQUALS, :FARROW
|
86
|
+
temp_indent += 1
|
87
|
+
end
|
88
|
+
|
89
|
+
# unindent for closing brackets in the current line
|
90
|
+
next_token = token.next_token
|
91
|
+
while not next_token.nil? and next_token.type != :NEWLINE
|
92
|
+
if [:RBRACE, :RBRACK, :RPAREN].include?(next_token.type)
|
93
|
+
if not matches[next_token].nil? and matches[next_token].line < next_token.line
|
94
|
+
# right braces matched in a previous line decrease indent
|
95
|
+
indent -= 1
|
96
|
+
end
|
97
|
+
if next_token.type == :RBRACE and not colon_indent.nil?
|
98
|
+
if not matches[next_token].nil? and matches[next_token].line < colon_indent
|
99
|
+
# unindent at the end of resources if needed
|
100
|
+
indent -= 1
|
101
|
+
colon_indent = nil
|
102
|
+
end
|
103
|
+
end
|
104
|
+
end
|
105
|
+
next_token = next_token.next_token
|
106
|
+
end
|
107
|
+
|
108
|
+
# obviously we have a problem
|
109
|
+
if indent < 0
|
110
|
+
notify :error, {
|
111
|
+
:message => 'Error calculating indent. Please file an issue at https://github.com/relud/puppet-lint-indent-check/issues',
|
112
|
+
:line => token.next_token.line,
|
113
|
+
:column => token.next_token.column,
|
114
|
+
}
|
115
|
+
# stop parsing indent
|
116
|
+
break
|
117
|
+
end
|
118
|
+
|
119
|
+
# get actual indent
|
120
|
+
actual = 0
|
121
|
+
if token.next_token.type == :INDENT
|
122
|
+
actual = token.next_token.value.length
|
123
|
+
else
|
124
|
+
actual = 0
|
125
|
+
end
|
126
|
+
|
127
|
+
# expected indent
|
128
|
+
expected = (indent + temp_indent) * chars_per_indent
|
129
|
+
|
130
|
+
# oh no! incorrect indent!
|
131
|
+
if actual != expected
|
132
|
+
# no one cares if blank lines and comments are indented correctly
|
133
|
+
if not [:COMMENT, :NEWLINE].include?(token.next_token.type)
|
134
|
+
notify :warning, {
|
135
|
+
:message => "indent should be #{expected} chars and is #{actual}",
|
136
|
+
:line => token.line,
|
137
|
+
:column => token.column,
|
138
|
+
:token => token,
|
139
|
+
:indent => expected,
|
140
|
+
}
|
141
|
+
end
|
142
|
+
end
|
143
|
+
end
|
144
|
+
end
|
145
|
+
|
146
|
+
def fix(problem)
|
147
|
+
char_for_indent = ' '
|
148
|
+
if problem[:token].next_token.type == :INDENT
|
149
|
+
problem[:token].next_token.value = char_for_indent * problem[:indent]
|
150
|
+
else
|
151
|
+
problem[:token].next_token.value = char_for_indent * problem[:indent] + problem[:token].next_token.value
|
152
|
+
end
|
153
|
+
end
|
154
|
+
end
|
@@ -0,0 +1,55 @@
|
|
1
|
+
# passing manifest 1
|
2
|
+
class 1 (
|
3
|
+
$arg1 = 1,
|
4
|
+
$arg2 =
|
5
|
+
2,
|
6
|
+
$arg3 = [
|
7
|
+
1,
|
8
|
+
2,
|
9
|
+
],
|
10
|
+
$arg4 = {
|
11
|
+
1 => 2,
|
12
|
+
3 => 4,
|
13
|
+
},
|
14
|
+
$arg5 = (
|
15
|
+
1 + 1
|
16
|
+
),
|
17
|
+
) {
|
18
|
+
file { '/abc':
|
19
|
+
ensure => 'file',
|
20
|
+
content =>
|
21
|
+
file('abc'),
|
22
|
+
require => [
|
23
|
+
File['def'],
|
24
|
+
],
|
25
|
+
}
|
26
|
+
|
27
|
+
file {
|
28
|
+
[
|
29
|
+
'/def',
|
30
|
+
]:
|
31
|
+
ensure => 'directory';
|
32
|
+
|
33
|
+
'ghi':
|
34
|
+
ensure => 'file',
|
35
|
+
content => file('ghi');
|
36
|
+
|
37
|
+
'jkl':
|
38
|
+
ensure => 'file'
|
39
|
+
content => $::osfamily ? {
|
40
|
+
'RedHat' => 'jkl',
|
41
|
+
default => 'jklol',
|
42
|
+
};
|
43
|
+
|
44
|
+
[
|
45
|
+
'mno',
|
46
|
+
'pqr',
|
47
|
+
]:
|
48
|
+
ensure => (
|
49
|
+
'file'
|
50
|
+
),
|
51
|
+
content => (
|
52
|
+
'stuff'
|
53
|
+
);
|
54
|
+
}
|
55
|
+
}
|
@@ -0,0 +1,62 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
describe 'strict_indent' do
|
4
|
+
before do
|
5
|
+
# disable all other checks
|
6
|
+
PuppetLint.configuration.checks.reject{ |check|
|
7
|
+
check == :indent
|
8
|
+
}.each do |check|
|
9
|
+
PuppetLint.configuration.send("disable_#{check}")
|
10
|
+
end
|
11
|
+
end
|
12
|
+
|
13
|
+
after do
|
14
|
+
# re-enable other checks
|
15
|
+
PuppetLint.configuration.checks.reject{ |check|
|
16
|
+
check == :indent
|
17
|
+
}.each do |check|
|
18
|
+
PuppetLint.configuration.send("enable_#{check}")
|
19
|
+
end
|
20
|
+
end
|
21
|
+
|
22
|
+
context 'on manifest' do
|
23
|
+
Dir['spec/fixtures/pass/*'].each do |manifest|
|
24
|
+
context manifest do
|
25
|
+
let(:code) { File.read(manifest) }
|
26
|
+
|
27
|
+
it 'should detect no problems' do
|
28
|
+
expect(problems).to have(0).problems
|
29
|
+
end
|
30
|
+
end
|
31
|
+
end
|
32
|
+
|
33
|
+
Dir['spec/fixtures/fail/*'].each do |manifest|
|
34
|
+
context manifest do
|
35
|
+
let(:code) { File.read(manifest) }
|
36
|
+
|
37
|
+
it 'should detect problems' do
|
38
|
+
expect(problems).to have(1).problems
|
39
|
+
end
|
40
|
+
end
|
41
|
+
end
|
42
|
+
end
|
43
|
+
|
44
|
+
context 'invalid array indent' do
|
45
|
+
let(:code) {
|
46
|
+
<<-EOF.gsub(/^ {8}/, '')
|
47
|
+
class (
|
48
|
+
) {
|
49
|
+
file { 'this':
|
50
|
+
ensure => 'present',
|
51
|
+
require => [ 'abc',
|
52
|
+
'def', ],
|
53
|
+
}
|
54
|
+
}
|
55
|
+
EOF
|
56
|
+
}
|
57
|
+
|
58
|
+
it 'should detect 1 problems' do
|
59
|
+
expect(problems).to have(1).problems
|
60
|
+
end
|
61
|
+
end
|
62
|
+
end
|
data/spec/spec_helper.rb
ADDED
metadata
ADDED
@@ -0,0 +1,125 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: puppet-lint-strict_indent-check
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 2.0.0
|
5
|
+
platform: ruby
|
6
|
+
authors:
|
7
|
+
- Daniel Thornton
|
8
|
+
autorequire:
|
9
|
+
bindir: bin
|
10
|
+
cert_chain: []
|
11
|
+
date: 2014-12-02 00:00:00.000000000 Z
|
12
|
+
dependencies:
|
13
|
+
- !ruby/object:Gem::Dependency
|
14
|
+
name: puppet-lint
|
15
|
+
requirement: !ruby/object:Gem::Requirement
|
16
|
+
requirements:
|
17
|
+
- - "~>"
|
18
|
+
- !ruby/object:Gem::Version
|
19
|
+
version: '1.0'
|
20
|
+
type: :runtime
|
21
|
+
prerelease: false
|
22
|
+
version_requirements: !ruby/object:Gem::Requirement
|
23
|
+
requirements:
|
24
|
+
- - "~>"
|
25
|
+
- !ruby/object:Gem::Version
|
26
|
+
version: '1.0'
|
27
|
+
- !ruby/object:Gem::Dependency
|
28
|
+
name: rspec
|
29
|
+
requirement: !ruby/object:Gem::Requirement
|
30
|
+
requirements:
|
31
|
+
- - "~>"
|
32
|
+
- !ruby/object:Gem::Version
|
33
|
+
version: '3.0'
|
34
|
+
type: :development
|
35
|
+
prerelease: false
|
36
|
+
version_requirements: !ruby/object:Gem::Requirement
|
37
|
+
requirements:
|
38
|
+
- - "~>"
|
39
|
+
- !ruby/object:Gem::Version
|
40
|
+
version: '3.0'
|
41
|
+
- !ruby/object:Gem::Dependency
|
42
|
+
name: rspec-its
|
43
|
+
requirement: !ruby/object:Gem::Requirement
|
44
|
+
requirements:
|
45
|
+
- - "~>"
|
46
|
+
- !ruby/object:Gem::Version
|
47
|
+
version: '1.0'
|
48
|
+
type: :development
|
49
|
+
prerelease: false
|
50
|
+
version_requirements: !ruby/object:Gem::Requirement
|
51
|
+
requirements:
|
52
|
+
- - "~>"
|
53
|
+
- !ruby/object:Gem::Version
|
54
|
+
version: '1.0'
|
55
|
+
- !ruby/object:Gem::Dependency
|
56
|
+
name: rspec-collection_matchers
|
57
|
+
requirement: !ruby/object:Gem::Requirement
|
58
|
+
requirements:
|
59
|
+
- - "~>"
|
60
|
+
- !ruby/object:Gem::Version
|
61
|
+
version: '1.0'
|
62
|
+
type: :development
|
63
|
+
prerelease: false
|
64
|
+
version_requirements: !ruby/object:Gem::Requirement
|
65
|
+
requirements:
|
66
|
+
- - "~>"
|
67
|
+
- !ruby/object:Gem::Version
|
68
|
+
version: '1.0'
|
69
|
+
- !ruby/object:Gem::Dependency
|
70
|
+
name: rake
|
71
|
+
requirement: !ruby/object:Gem::Requirement
|
72
|
+
requirements:
|
73
|
+
- - ">="
|
74
|
+
- !ruby/object:Gem::Version
|
75
|
+
version: '0'
|
76
|
+
type: :development
|
77
|
+
prerelease: false
|
78
|
+
version_requirements: !ruby/object:Gem::Requirement
|
79
|
+
requirements:
|
80
|
+
- - ">="
|
81
|
+
- !ruby/object:Gem::Version
|
82
|
+
version: '0'
|
83
|
+
description: |2
|
84
|
+
Extends puppet-lint to ensure that your manifests follow a strict indentation pattern.
|
85
|
+
email: daniel@relud.com
|
86
|
+
executables: []
|
87
|
+
extensions: []
|
88
|
+
extra_rdoc_files: []
|
89
|
+
files:
|
90
|
+
- LICENSE
|
91
|
+
- README.md
|
92
|
+
- lib/puppet-lint/plugins/check_strict_indent.rb
|
93
|
+
- spec/fixtures/fail/1.pp
|
94
|
+
- spec/fixtures/pass/1.pp
|
95
|
+
- spec/puppet-lint/plugins/check_strict_indent_spec.rb
|
96
|
+
- spec/spec_helper.rb
|
97
|
+
homepage: https://github.com/relud/puppet-lint-strict_indent-check
|
98
|
+
licenses:
|
99
|
+
- Mozilla 2.0
|
100
|
+
metadata: {}
|
101
|
+
post_install_message:
|
102
|
+
rdoc_options: []
|
103
|
+
require_paths:
|
104
|
+
- lib
|
105
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
106
|
+
requirements:
|
107
|
+
- - ">="
|
108
|
+
- !ruby/object:Gem::Version
|
109
|
+
version: '0'
|
110
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
111
|
+
requirements:
|
112
|
+
- - ">="
|
113
|
+
- !ruby/object:Gem::Version
|
114
|
+
version: '0'
|
115
|
+
requirements: []
|
116
|
+
rubyforge_project:
|
117
|
+
rubygems_version: 2.2.2
|
118
|
+
signing_key:
|
119
|
+
specification_version: 4
|
120
|
+
summary: puppet-lint strict indent check
|
121
|
+
test_files:
|
122
|
+
- spec/puppet-lint/plugins/check_strict_indent_spec.rb
|
123
|
+
- spec/fixtures/fail/1.pp
|
124
|
+
- spec/fixtures/pass/1.pp
|
125
|
+
- spec/spec_helper.rb
|