puppet-lint-class_parameter-check 0.1.4 → 0.2.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 +4 -4
- data/lib/model/documentation_list.rb +38 -0
- data/lib/model/{class_parameter.rb → parameter.rb} +3 -1
- data/lib/model/parameter_documentation.rb +15 -0
- data/lib/model/{class_parameter_list.rb → parameter_list.rb} +10 -4
- data/lib/model/puppet_class.rb +73 -0
- data/lib/puppet-lint/plugins/check_class_parameter.rb +28 -22
- data/spec/puppet-lint/plugins/check_class_parameter_spec.rb +80 -34
- metadata +7 -4
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 2cc6a4bf5f8538998456c3a4264a06293cca5534
|
4
|
+
data.tar.gz: 0ae21922016a83a566236f4f72812d0a435c9d4a
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 3eadbe8e218b908e4beea58261300069ea7ff61685b108edd6b4630658135d05513b2f8d9a34c9f2f10ebb86752fc20b61e0213b9b58d505d8b02b2dfaad1bad
|
7
|
+
data.tar.gz: 3fd10e790eea0cb463752948a9f0ff889e2e92529d1c71def67b0558576bb30003cadb8c4519c72fae16cb98d4de7f34a7d5feff08a232cd0bd2ca85a7e7caaa
|
@@ -0,0 +1,38 @@
|
|
1
|
+
require_relative 'parameter_documentation'
|
2
|
+
|
3
|
+
class DocumentationList
|
4
|
+
attr_reader :start_index, :end_index
|
5
|
+
|
6
|
+
def initialize(tokens, start_index, end_index)
|
7
|
+
@tokens, @start_index, @end_index = tokens, start_index, end_index
|
8
|
+
end
|
9
|
+
|
10
|
+
def parameter_documentation_list
|
11
|
+
return @parameter_documentation_list unless @parameter_documentation_list.nil?
|
12
|
+
|
13
|
+
parameter_documentation = ParameterDocumentation.new
|
14
|
+
harvest_tokens = false
|
15
|
+
|
16
|
+
@parameter_documentation_list = @tokens.inject([]) do |memo, token|
|
17
|
+
if token.type == :COMMENT && token.value.match(/@param \w*/)
|
18
|
+
memo << parameter_documentation if parameter_documentation.tokens.any?
|
19
|
+
parameter_documentation = ParameterDocumentation.new
|
20
|
+
harvest_tokens = true
|
21
|
+
end
|
22
|
+
|
23
|
+
if (token.type == :COMMENT && token.value.strip == "")
|
24
|
+
harvest_tokens = false
|
25
|
+
end
|
26
|
+
|
27
|
+
if harvest_tokens
|
28
|
+
parameter_documentation.tokens << token
|
29
|
+
end
|
30
|
+
|
31
|
+
memo
|
32
|
+
end
|
33
|
+
|
34
|
+
@parameter_documentation_list << parameter_documentation if parameter_documentation.tokens.any?
|
35
|
+
|
36
|
+
@parameter_documentation_list
|
37
|
+
end
|
38
|
+
end
|
@@ -1,6 +1,6 @@
|
|
1
|
-
require_relative '
|
1
|
+
require_relative 'parameter'
|
2
2
|
|
3
|
-
class
|
3
|
+
class ParameterList
|
4
4
|
attr_reader :errors, :start_index, :end_index
|
5
5
|
|
6
6
|
def initialize(tokens, start_index, end_index)
|
@@ -12,6 +12,12 @@ class ClassParameterList
|
|
12
12
|
parameters.sort
|
13
13
|
end
|
14
14
|
|
15
|
+
def each(&block)
|
16
|
+
parameters.each do |parameter|
|
17
|
+
yield parameter
|
18
|
+
end
|
19
|
+
end
|
20
|
+
|
15
21
|
def optional_parameters
|
16
22
|
parameters.select(&:is_optional?)
|
17
23
|
end
|
@@ -44,7 +50,7 @@ class ClassParameterList
|
|
44
50
|
|
45
51
|
private
|
46
52
|
def parameters
|
47
|
-
parameter =
|
53
|
+
parameter = Parameter.new
|
48
54
|
stack = []
|
49
55
|
|
50
56
|
@tokens.inject([]) do |memo, token|
|
@@ -60,7 +66,7 @@ class ClassParameterList
|
|
60
66
|
end
|
61
67
|
|
62
68
|
memo << parameter
|
63
|
-
parameter =
|
69
|
+
parameter = Parameter.new
|
64
70
|
else
|
65
71
|
parameter.add(token)
|
66
72
|
end
|
@@ -0,0 +1,73 @@
|
|
1
|
+
require_relative 'parameter_list'
|
2
|
+
require_relative 'documentation_list'
|
3
|
+
|
4
|
+
class PuppetClass
|
5
|
+
def initialize(tokens, index)
|
6
|
+
@tokens, @index = tokens, index
|
7
|
+
end
|
8
|
+
|
9
|
+
def name
|
10
|
+
@name ||= @index[:tokens].select do |token|
|
11
|
+
token.type == :NAME
|
12
|
+
end.first.value
|
13
|
+
end
|
14
|
+
|
15
|
+
def has_parameter_documentation?
|
16
|
+
!parameter_documentation_list.empty?
|
17
|
+
end
|
18
|
+
|
19
|
+
def parameter_list
|
20
|
+
param_tokens = @index[:param_tokens]
|
21
|
+
return if param_tokens.nil?
|
22
|
+
|
23
|
+
@parameter_list ||= ParameterList.new(param_tokens, @tokens.index(param_tokens.first), @tokens.index(param_tokens.last))
|
24
|
+
end
|
25
|
+
|
26
|
+
def documentation_list
|
27
|
+
@documentation_list ||= DocumentationList.new(documentation_tokens, @tokens.index(documentation_tokens.first), @tokens.index(documentation_tokens.last))
|
28
|
+
end
|
29
|
+
|
30
|
+
def parameter_documentation_list
|
31
|
+
documentation_list.parameter_documentation_list
|
32
|
+
end
|
33
|
+
|
34
|
+
def sorted_parameter_documentation_list
|
35
|
+
sorted_parameter_list.inject([]) do |memo, parameter|
|
36
|
+
documentation = parameter_documentation_list.select do |parameter_documentation|
|
37
|
+
parameter_documentation.name == parameter.name
|
38
|
+
end.first
|
39
|
+
|
40
|
+
memo << documentation if documentation
|
41
|
+
|
42
|
+
memo
|
43
|
+
end
|
44
|
+
end
|
45
|
+
|
46
|
+
def sorted_parameter_list
|
47
|
+
parameter_list.sort
|
48
|
+
end
|
49
|
+
|
50
|
+
def parameter_documentation_start_index
|
51
|
+
@tokens.index(parameter_documentation_list.first.tokens.first)
|
52
|
+
end
|
53
|
+
|
54
|
+
def parameter_documentation_end_index
|
55
|
+
@tokens.index(parameter_documentation_list.last.tokens.last) + 1
|
56
|
+
end
|
57
|
+
|
58
|
+
private
|
59
|
+
def documentation_tokens
|
60
|
+
return @doc_tokens unless @doc_tokens.nil? || @doc_tokens.empty?
|
61
|
+
|
62
|
+
@doc_tokens = []
|
63
|
+
prev_token = @index[:tokens].first.prev_token
|
64
|
+
while (prev_token && prev_token.type != :RBRACE)
|
65
|
+
@doc_tokens << prev_token
|
66
|
+
|
67
|
+
prev_token = prev_token.prev_token
|
68
|
+
end
|
69
|
+
|
70
|
+
@doc_tokens.reverse!
|
71
|
+
return @doc_tokens
|
72
|
+
end
|
73
|
+
end
|
@@ -1,22 +1,40 @@
|
|
1
|
-
require_relative '../../model/
|
1
|
+
require_relative '../../model/puppet_class'
|
2
2
|
|
3
3
|
PuppetLint.new_check(:class_parameter) do
|
4
|
+
@fixed = false
|
5
|
+
|
4
6
|
def check
|
5
|
-
|
6
|
-
|
7
|
-
|
7
|
+
class_indexes.each do |class_index|
|
8
|
+
puppet_class = PuppetClass.new(tokens, class_index)
|
9
|
+
|
10
|
+
next unless puppet_class.parameter_list
|
11
|
+
|
12
|
+
unless puppet_class.parameter_list.validate
|
13
|
+
puppet_class.parameter_list.errors.each { |error| notify :error, error }
|
8
14
|
end
|
9
15
|
end
|
10
16
|
end
|
11
17
|
|
12
18
|
def fix(problem)
|
19
|
+
return if @fixed
|
20
|
+
|
13
21
|
resorted_tokens = []
|
14
22
|
token_index = 0
|
15
23
|
|
16
|
-
|
17
|
-
|
24
|
+
class_indexes.each do |class_index|
|
25
|
+
puppet_class = PuppetClass.new(tokens, class_index)
|
18
26
|
|
19
|
-
|
27
|
+
if puppet_class.has_parameter_documentation?
|
28
|
+
resorted_tokens += tokens[token_index...puppet_class.parameter_documentation_start_index]
|
29
|
+
puppet_class.sorted_parameter_documentation_list.each do |parameter_documentation|
|
30
|
+
resorted_tokens += parameter_documentation.tokens
|
31
|
+
end
|
32
|
+
resorted_tokens += tokens[puppet_class.parameter_documentation_end_index..puppet_class.parameter_list.start_index]
|
33
|
+
else
|
34
|
+
resorted_tokens += tokens[token_index..puppet_class.parameter_list.start_index]
|
35
|
+
end
|
36
|
+
|
37
|
+
sorted_class_parameter_list = puppet_class.sorted_parameter_list
|
20
38
|
sorted_class_parameter_list.each do |parameter|
|
21
39
|
resorted_tokens += parameter.tokens
|
22
40
|
|
@@ -24,27 +42,15 @@ PuppetLint.new_check(:class_parameter) do
|
|
24
42
|
resorted_tokens << PuppetLint::Lexer::Token.new(:COMMA, ",", 0,0)
|
25
43
|
end
|
26
44
|
|
27
|
-
resorted_tokens << PuppetLint::Lexer::Token.new(:NEWLINE, "\n", 0,0)
|
45
|
+
resorted_tokens << PuppetLint::Lexer::Token.new(:NEWLINE, "\n", 0,0) unless parameter == sorted_class_parameter_list.last
|
28
46
|
end
|
29
47
|
|
30
|
-
token_index =
|
48
|
+
token_index = puppet_class.parameter_list.end_index
|
31
49
|
end
|
32
50
|
|
33
51
|
resorted_tokens += tokens[token_index..-1]
|
34
52
|
tokens.replace(resorted_tokens)
|
35
|
-
end
|
36
|
-
|
37
|
-
private
|
38
|
-
def class_parameter_lists
|
39
|
-
lists = []
|
40
|
-
|
41
|
-
class_indexes.each do |class_index|
|
42
|
-
param_tokens = class_index[:param_tokens]
|
43
|
-
next if param_tokens.nil?
|
44
|
-
|
45
|
-
lists << ClassParameterList.new(param_tokens, tokens.index(param_tokens.first), tokens.index(param_tokens.last))
|
46
|
-
end
|
47
53
|
|
48
|
-
|
54
|
+
@fixed = true
|
49
55
|
end
|
50
56
|
end
|
@@ -202,54 +202,100 @@ describe 'class_parameter' do
|
|
202
202
|
|
203
203
|
context 'multiple classes not sorted alphabetically' do
|
204
204
|
let(:code) { <<-EOF
|
205
|
-
|
206
|
-
|
207
|
-
|
208
|
-
|
209
|
-
|
210
|
-
|
211
|
-
|
212
|
-
|
213
|
-
|
214
|
-
|
205
|
+
class puppet_module(
|
206
|
+
String $non_alphabetical,
|
207
|
+
String $alphabetical
|
208
|
+
) { }
|
209
|
+
|
210
|
+
class puppet_module2(
|
211
|
+
String $non_alphabetical,
|
212
|
+
String $alphabetical
|
213
|
+
) { }
|
214
|
+
EOF
|
215
215
|
}
|
216
216
|
|
217
217
|
it 'fixes the problem' do
|
218
218
|
expect(manifest).to eq(<<-EOF
|
219
|
-
|
220
|
-
|
221
|
-
|
222
|
-
|
223
|
-
|
224
|
-
|
225
|
-
|
226
|
-
|
227
|
-
|
228
|
-
|
219
|
+
class puppet_module(
|
220
|
+
String $alphabetical,
|
221
|
+
String $non_alphabetical
|
222
|
+
) { }
|
223
|
+
|
224
|
+
class puppet_module2(
|
225
|
+
String $alphabetical,
|
226
|
+
String $non_alphabetical
|
227
|
+
) { }
|
228
|
+
EOF
|
229
229
|
)
|
230
230
|
end
|
231
231
|
end
|
232
232
|
|
233
233
|
context 'not sorted in groups and not alphabetically' do
|
234
234
|
let(:code) { <<-EOF
|
235
|
-
|
236
|
-
|
237
|
-
|
238
|
-
|
239
|
-
|
240
|
-
|
241
|
-
|
235
|
+
class puppet_module(
|
236
|
+
String $non_alphabetical,
|
237
|
+
String $non_alphabetical_optional = $puppet_module::params::non_alphabetical_optional,
|
238
|
+
String $alphabetical,
|
239
|
+
String $alphabetical_optional = "default"
|
240
|
+
) inherits puppet_module::params { }
|
241
|
+
EOF
|
242
242
|
}
|
243
243
|
|
244
244
|
it 'fixes the problem' do
|
245
245
|
expect(manifest).to eq(<<-EOF
|
246
|
-
|
247
|
-
|
248
|
-
|
249
|
-
|
250
|
-
|
251
|
-
|
252
|
-
|
246
|
+
class puppet_module(
|
247
|
+
String $alphabetical,
|
248
|
+
String $non_alphabetical,
|
249
|
+
String $alphabetical_optional = "default",
|
250
|
+
String $non_alphabetical_optional = $puppet_module::params::non_alphabetical_optional
|
251
|
+
) inherits puppet_module::params { }
|
252
|
+
EOF
|
253
|
+
)
|
254
|
+
end
|
255
|
+
end
|
256
|
+
|
257
|
+
context 'with documented parameters not sorted alphabetically' do
|
258
|
+
let(:code) { <<-EOF
|
259
|
+
#
|
260
|
+
# @param non_alphabetical The non_alphabetical parameter
|
261
|
+
# @param alphabetical The alphabetical parameter
|
262
|
+
#
|
263
|
+
class puppet_module(
|
264
|
+
String $non_alphabetical,
|
265
|
+
String $alphabetical
|
266
|
+
) { }
|
267
|
+
|
268
|
+
#
|
269
|
+
# @param non_alphabetical The non_alphabetical parameter
|
270
|
+
# @param alphabetical The alphabetical parameter
|
271
|
+
#
|
272
|
+
class puppet_module2(
|
273
|
+
String $non_alphabetical,
|
274
|
+
String $alphabetical
|
275
|
+
) { }
|
276
|
+
EOF
|
277
|
+
}
|
278
|
+
|
279
|
+
it 'fixes the problem' do
|
280
|
+
expect(manifest).to eq(<<-EOF
|
281
|
+
#
|
282
|
+
# @param alphabetical The alphabetical parameter
|
283
|
+
# @param non_alphabetical The non_alphabetical parameter
|
284
|
+
#
|
285
|
+
class puppet_module(
|
286
|
+
String $alphabetical,
|
287
|
+
String $non_alphabetical
|
288
|
+
) { }
|
289
|
+
|
290
|
+
#
|
291
|
+
# @param alphabetical The alphabetical parameter
|
292
|
+
# @param non_alphabetical The non_alphabetical parameter
|
293
|
+
#
|
294
|
+
class puppet_module2(
|
295
|
+
String $alphabetical,
|
296
|
+
String $non_alphabetical
|
297
|
+
) { }
|
298
|
+
EOF
|
253
299
|
)
|
254
300
|
end
|
255
301
|
end
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: puppet-lint-class_parameter-check
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.2.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Roelof Reitsma
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2016-
|
11
|
+
date: 2016-03-10 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: puppet-lint
|
@@ -91,8 +91,11 @@ extra_rdoc_files: []
|
|
91
91
|
files:
|
92
92
|
- README.md
|
93
93
|
- LICENSE
|
94
|
-
- lib/model/
|
95
|
-
- lib/model/
|
94
|
+
- lib/model/documentation_list.rb
|
95
|
+
- lib/model/parameter.rb
|
96
|
+
- lib/model/parameter_documentation.rb
|
97
|
+
- lib/model/parameter_list.rb
|
98
|
+
- lib/model/puppet_class.rb
|
96
99
|
- lib/puppet-lint/plugins/check_class_parameter.rb
|
97
100
|
- spec/puppet-lint/plugins/check_class_parameter_spec.rb
|
98
101
|
- spec/spec_helper.rb
|