puppet-lint-class_alignment-check 0.2.2 → 0.2.3
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 +4 -4
- data/lib/puppet-lint/plugins/check_class_alignment.rb +211 -0
- metadata +2 -1
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 472da99d1199ebc852ca972b0df75171b5421ec006e03fa02af41a1eefcbbff7
|
4
|
+
data.tar.gz: eb86074f1126e1f27749f33f6d4572892efe8dfd490208e35cd1a5ea359f9357
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: b21647377367ee30cd6eaae3280e4baf6359ffb9b1b62ed27791d5ff84649b0b47f4e209d6bd6e45bd5468f719877690892c79835f12be1641a515e7abd929fa
|
7
|
+
data.tar.gz: 9175489f85c7e46de2c76d29a9ec3d0d36d9287892a88f2add6df9c5f9fc7ca6841c8b0e0d2601ee7f78d2192d218999bca97e064a9fcae99c9852a1abe2241f
|
@@ -0,0 +1,211 @@
|
|
1
|
+
# Parameters to classes or defined types must be uniformly indented in two
|
2
|
+
# spaces from the title. The equals sign should be aligned.
|
3
|
+
#
|
4
|
+
# https://puppet.com/docs/puppet/7/style_guide.html#style_guide_classes-param-indentation-alignment
|
5
|
+
|
6
|
+
def a_param?(token)
|
7
|
+
if token.prev_code_token.type == :EQUALS
|
8
|
+
false
|
9
|
+
elsif token.prev_code_token.type == :FARROW
|
10
|
+
false
|
11
|
+
elsif token.type == :VARIABLE && !%i[DQPRE DQMID].include?(token.prev_code_token.type)
|
12
|
+
true
|
13
|
+
end
|
14
|
+
end
|
15
|
+
|
16
|
+
def first_param_on_the_line?(token)
|
17
|
+
origin = token
|
18
|
+
while token&.prev_token
|
19
|
+
token = token.prev_token
|
20
|
+
|
21
|
+
break if token.type == :NEWLINE
|
22
|
+
end
|
23
|
+
|
24
|
+
while token&.next_token
|
25
|
+
token = token.next_token
|
26
|
+
|
27
|
+
break if token.type == :VARIABLE
|
28
|
+
end
|
29
|
+
|
30
|
+
origin == token
|
31
|
+
end
|
32
|
+
|
33
|
+
def the_one?(token, character)
|
34
|
+
case character
|
35
|
+
when '='
|
36
|
+
true if token.type == :EQUALS
|
37
|
+
when '$'
|
38
|
+
true if token.type == :VARIABLE && a_param?(token) && first_param_on_the_line?(token)
|
39
|
+
end
|
40
|
+
end
|
41
|
+
|
42
|
+
def get_the_first_param(token)
|
43
|
+
while token&.prev_code_token
|
44
|
+
token = token.prev_code_token
|
45
|
+
break if token.type == :CLASS
|
46
|
+
end
|
47
|
+
|
48
|
+
while token&.next_code_token
|
49
|
+
token = token.next_code_token
|
50
|
+
return token if token.type == :VARIABLE
|
51
|
+
end
|
52
|
+
end
|
53
|
+
|
54
|
+
def get_prev_code_token(token, character)
|
55
|
+
case character
|
56
|
+
when '='
|
57
|
+
token.prev_code_token
|
58
|
+
when '$'
|
59
|
+
if token.prev_code_token
|
60
|
+
if %i[CLASSREF RBRACK].include?(token.prev_code_token.type)
|
61
|
+
token.prev_code_token
|
62
|
+
elsif token.prev_code_token.type == :LPAREN
|
63
|
+
token
|
64
|
+
elsif token.prev_code_token.type == :COMMA
|
65
|
+
get_the_first_param(token)
|
66
|
+
end
|
67
|
+
end
|
68
|
+
end
|
69
|
+
end
|
70
|
+
|
71
|
+
# This function is copied & modified from puppet-lint arrow_alignment check
|
72
|
+
# https://github.com/puppetlabs/puppet-lint/blob/020143b705b023946739eb44e7c7d99fcd087527/lib/puppet-lint/plugins/check_whitespace/arrow_alignment.rb#L8
|
73
|
+
def check_for(character)
|
74
|
+
# I intentionally didn't rename `arrow` to another name, to keep the code as
|
75
|
+
# similar as the original one, to easier to update in the future.
|
76
|
+
(class_indexes + defined_type_indexes).each do |res_idx|
|
77
|
+
arrow_column = [0]
|
78
|
+
level_idx = 0
|
79
|
+
level_tokens = []
|
80
|
+
param_column = [nil]
|
81
|
+
resource_tokens = res_idx[:param_tokens]
|
82
|
+
next if resource_tokens.nil?
|
83
|
+
|
84
|
+
resource_tokens.reject! do |token|
|
85
|
+
COMMENT_TYPES.include?(token.type)
|
86
|
+
end
|
87
|
+
|
88
|
+
# If this is a single line resource, skip it
|
89
|
+
first_arrow = resource_tokens.index { |r| the_one?(r, character) }
|
90
|
+
last_arrow = resource_tokens.rindex { |r| the_one?(r, character) }
|
91
|
+
next if first_arrow.nil?
|
92
|
+
next if last_arrow.nil?
|
93
|
+
next if resource_tokens[first_arrow].line == resource_tokens[last_arrow].line
|
94
|
+
|
95
|
+
resource_tokens.each do |token|
|
96
|
+
if the_one?(token, character)
|
97
|
+
param_token = get_prev_code_token(token, character)
|
98
|
+
param_token = token if param_token.nil?
|
99
|
+
|
100
|
+
param_length = param_token.to_manifest.length
|
101
|
+
|
102
|
+
param_column[level_idx] = param_token.column if param_column[level_idx].nil?
|
103
|
+
|
104
|
+
if (level_tokens[level_idx] ||= []).any? { |t| t.line == token.line }
|
105
|
+
this_arrow_column = param_column[level_idx] + param_length + 1
|
106
|
+
elsif character == '$' && param_token.type == :VARIABLE
|
107
|
+
this_arrow_column = param_token.column
|
108
|
+
else
|
109
|
+
this_arrow_column = param_token.column + param_token.to_manifest.length
|
110
|
+
this_arrow_column += 1 if param_token.type != :INDENT
|
111
|
+
end
|
112
|
+
|
113
|
+
arrow_column[level_idx] = this_arrow_column if arrow_column[level_idx] < this_arrow_column
|
114
|
+
|
115
|
+
(level_tokens[level_idx] ||= []) << token
|
116
|
+
elsif token.prev_token.type == :LPAREN
|
117
|
+
level_idx += 1
|
118
|
+
arrow_column << 0
|
119
|
+
level_tokens[level_idx] ||= []
|
120
|
+
param_column << nil
|
121
|
+
elsif token.next_token.type == :RPAREN
|
122
|
+
if (level_tokens[level_idx] ||= []).map(&:line).uniq.length > 1
|
123
|
+
level_tokens[level_idx].each do |arrow_tok|
|
124
|
+
next if arrow_tok.column == arrow_column[level_idx] || level_tokens[level_idx].size == 1
|
125
|
+
|
126
|
+
arrows_on_line = level_tokens[level_idx].select { |t| t.line == arrow_tok.line }
|
127
|
+
notify(
|
128
|
+
:warning,
|
129
|
+
message: "indentation of #{character} is not properly aligned (expected in column #{arrow_column[level_idx]}, but found it in column #{arrow_tok.column})",
|
130
|
+
line: arrow_tok.line,
|
131
|
+
column: arrow_tok.column,
|
132
|
+
token: arrow_tok,
|
133
|
+
arrow_column: arrow_column[level_idx],
|
134
|
+
newline: arrows_on_line.index(arrow_tok) != 0,
|
135
|
+
newline_indent: param_column[level_idx] - 1
|
136
|
+
)
|
137
|
+
end
|
138
|
+
end
|
139
|
+
arrow_column[level_idx] = 0
|
140
|
+
level_tokens[level_idx].clear
|
141
|
+
param_column[level_idx] = nil
|
142
|
+
level_idx -= 1
|
143
|
+
end
|
144
|
+
end
|
145
|
+
end
|
146
|
+
end
|
147
|
+
|
148
|
+
# This function is copied & modified from puppet-lint arrow_alignment fix
|
149
|
+
# https://github.com/puppetlabs/puppet-lint/blob/020143b705b023946739eb44e7c7d99fcd087527/lib/puppet-lint/plugins/check_whitespace/arrow_alignment.rb#L94
|
150
|
+
def fix_for(problem)
|
151
|
+
if problem[:newline]
|
152
|
+
index = tokens.index(problem[:token].prev_code_token.prev_token)
|
153
|
+
|
154
|
+
# insert newline
|
155
|
+
tokens.insert(index, PuppetLint::Lexer::Token.new(:NEWLINE, "\n", 0, 0))
|
156
|
+
|
157
|
+
# indent the parameter to the correct depth
|
158
|
+
problem[:token].prev_code_token.prev_token.type = :INDENT
|
159
|
+
problem[:token].prev_code_token.prev_token.value = ' ' * problem[:newline_indent]
|
160
|
+
|
161
|
+
end_param_idx = tokens.index(problem[:token].prev_code_token)
|
162
|
+
start_param_idx = tokens.index(problem[:token].prev_token_of(%i[INDENT NEWLINE]))
|
163
|
+
param_length = tokens[start_param_idx..end_param_idx].map do |r|
|
164
|
+
r.to_manifest.length
|
165
|
+
end.reduce(0) { |sum, x| sum + x } + 1
|
166
|
+
new_ws_len = problem[:arrow_column] - param_length
|
167
|
+
else
|
168
|
+
new_ws_len = if problem[:token].prev_token.type == :WHITESPACE
|
169
|
+
problem[:token].prev_token.to_manifest.length
|
170
|
+
else
|
171
|
+
0
|
172
|
+
end
|
173
|
+
new_ws_len += (problem[:arrow_column] - problem[:token].column)
|
174
|
+
end
|
175
|
+
|
176
|
+
if new_ws_len.negative?
|
177
|
+
raise PuppetLint::NoFix if problem[:token].prev_token.type != :INDENT
|
178
|
+
|
179
|
+
new_ws = problem[:token].prev_token.to_manifest[0...new_ws_len]
|
180
|
+
problem[:token].prev_token.value = new_ws
|
181
|
+
else
|
182
|
+
new_ws = ' ' * new_ws_len
|
183
|
+
|
184
|
+
if problem[:token].prev_token.type == :WHITESPACE
|
185
|
+
problem[:token].prev_token.value = new_ws
|
186
|
+
else
|
187
|
+
index = tokens.index(problem[:token].prev_token)
|
188
|
+
tokens.insert(index + 1, PuppetLint::Lexer::Token.new(:WHITESPACE, new_ws, 0, 0))
|
189
|
+
end
|
190
|
+
end
|
191
|
+
end
|
192
|
+
|
193
|
+
PuppetLint.new_check(:class_params_alignment) do
|
194
|
+
def check
|
195
|
+
check_for('$')
|
196
|
+
end
|
197
|
+
|
198
|
+
def fix(problem)
|
199
|
+
fix_for(problem)
|
200
|
+
end
|
201
|
+
end
|
202
|
+
|
203
|
+
PuppetLint.new_check(:class_equals_alignment) do
|
204
|
+
def check
|
205
|
+
check_for('=')
|
206
|
+
end
|
207
|
+
|
208
|
+
def fix(problem)
|
209
|
+
fix_for(problem)
|
210
|
+
end
|
211
|
+
end
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: puppet-lint-class_alignment-check
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.2.
|
4
|
+
version: 0.2.3
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Anh Pham
|
@@ -122,6 +122,7 @@ extra_rdoc_files: []
|
|
122
122
|
files:
|
123
123
|
- LICENSE
|
124
124
|
- README.md
|
125
|
+
- lib/puppet-lint/plugins/check_class_alignment.rb
|
125
126
|
- spec/puppet-lint/plugins/check_class_equals_alignment_spec.rb
|
126
127
|
- spec/puppet-lint/plugins/check_class_params_alignment_spec.rb
|
127
128
|
- spec/spec_helper.rb
|