puppet-lint-param-docs 1.4.1 → 1.7.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 +5 -5
- data/README.md +64 -26
- data/lib/puppet-lint/plugins/check_parameter_documentation.rb +114 -29
- data/spec/puppet-lint/plugins/check_parameter_documentation_spec.rb +484 -0
- metadata +36 -24
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
|
-
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
2
|
+
SHA256:
|
3
|
+
metadata.gz: ca78318c1175f2885dcffee1d275f71edc78bb91a0624dc32e84fd949c03a841
|
4
|
+
data.tar.gz: d38343fa7170f7cdc1ae94c10aa3e809be6e61a30ce5f25d1c147e191782744f
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 6c960b3b0f25548ff75c5597ac10ed27164a1230db2ab223272ad43dae88c223ca1653ef2c8e9c0ae416c98a8f4a8ba139c1501d920e3d6cbd521b6a49f8c058
|
7
|
+
data.tar.gz: 7433e3dee1f9055b53332dd4b3d080e154d2be067f70fb9db1a98317f2bb3a217f4548ead7db47dba081cd7b11b1e2a9038c0163d27d2a00775d1d69c54c89c1
|
data/README.md
CHANGED
@@ -19,56 +19,91 @@ gem 'puppet-lint-param-docs'
|
|
19
19
|
|
20
20
|
This plugin provides a new check to `puppet-lint`.
|
21
21
|
|
22
|
-
###
|
22
|
+
### parameter\_documentation
|
23
23
|
|
24
24
|
**--fix support: No**
|
25
25
|
|
26
26
|
This check will raise a warning for any class or defined type parameters that
|
27
|
-
don't have
|
27
|
+
don't have a description.
|
28
28
|
|
29
29
|
```
|
30
30
|
WARNING: missing documentation for class parameter foo::bar
|
31
31
|
WARNING: missing documentation for defined type parameter foo::baz
|
32
32
|
```
|
33
33
|
|
34
|
+
It will also raise warnings for parameters documented more than once.
|
35
|
+
|
36
|
+
```
|
37
|
+
WARNING Duplicate class parameter documentation for foo::bar on line 5
|
38
|
+
WARNING Duplicate class parameter documentation for foo::bar on line 6
|
39
|
+
```
|
40
|
+
|
41
|
+
A warning will also be raised if you document a parameter that doesn't exist in the class or defined type.
|
42
|
+
|
43
|
+
```
|
44
|
+
WARNING No matching class parameter for documentation of foo::bar
|
45
|
+
```
|
46
|
+
|
34
47
|
### Documentation styles
|
35
48
|
|
49
|
+
By default, the check will allow all known documentation styles.
|
50
|
+
You can, however, specify a list of accepted formats:
|
51
|
+
|
52
|
+
```ruby
|
53
|
+
# Limit to a single style
|
54
|
+
PuppetLint.configuration.docs_allowed_styles = 'strings'
|
55
|
+
# Limit to multiple styles
|
56
|
+
PuppetLint.configuration.docs_allowed_styles = ['strings', 'doc']
|
57
|
+
```
|
58
|
+
|
59
|
+
It will raise a warning if the documentation style does not match.
|
60
|
+
|
61
|
+
```
|
62
|
+
WARNING: invalid documentation style for class parameter foo::bar (doc) on line 4
|
63
|
+
```
|
64
|
+
|
36
65
|
The check will accept any of the following styles:
|
37
66
|
|
38
|
-
#### Puppet Strings
|
67
|
+
#### Puppet Strings: `strings`
|
39
68
|
|
40
69
|
Used by [Puppet Strings](https://github.com/puppetlabs/puppetlabs-strings).
|
41
70
|
|
42
|
-
|
43
|
-
|
44
|
-
|
45
|
-
|
71
|
+
```puppet
|
72
|
+
# @summary Example class
|
73
|
+
#
|
74
|
+
# @param foo example
|
75
|
+
define example($foo) { }
|
76
|
+
```
|
46
77
|
|
47
|
-
#### Puppet Doc style
|
78
|
+
#### Puppet Doc style: `doc`
|
48
79
|
|
49
|
-
Used by the [puppet-doc](https://
|
50
|
-
command,
|
80
|
+
Used by the [puppet-doc](https://puppet.com/docs/puppet/6.18/man/doc.html)
|
81
|
+
command, deprecated in favour of Puppet Strings.
|
51
82
|
|
52
|
-
|
53
|
-
|
54
|
-
|
55
|
-
|
56
|
-
|
57
|
-
|
58
|
-
|
83
|
+
```puppet
|
84
|
+
# Example class
|
85
|
+
#
|
86
|
+
# === Parameters:
|
87
|
+
#
|
88
|
+
# [*foo*] example
|
89
|
+
#
|
90
|
+
class example($foo) { }
|
91
|
+
```
|
59
92
|
|
60
|
-
#### Kafo rdoc style
|
93
|
+
#### Kafo rdoc style: `kafo`
|
61
94
|
|
62
95
|
Used in [kafo](https://github.com/theforeman/kafo#documentation) following an
|
63
96
|
rdoc style.
|
64
97
|
|
65
|
-
|
66
|
-
|
67
|
-
|
68
|
-
|
69
|
-
|
70
|
-
|
71
|
-
|
98
|
+
```puppet
|
99
|
+
# Example class
|
100
|
+
#
|
101
|
+
# === Parameters:
|
102
|
+
#
|
103
|
+
# $foo:: example
|
104
|
+
#
|
105
|
+
class example($foo) { }
|
106
|
+
```
|
72
107
|
|
73
108
|
### Selective rake task
|
74
109
|
|
@@ -83,6 +118,9 @@ helper to customise the lint rake task:
|
|
83
118
|
config.pattern = ['manifests/init.pp', 'manifests/other/**/*.pp']
|
84
119
|
end
|
85
120
|
|
86
|
-
This would disable the
|
121
|
+
This would disable the parameter\_documentation check by default, but then
|
87
122
|
defines a new rake task (which runs after `lint`) specifically for the files
|
88
123
|
given in `config.pattern`.
|
124
|
+
|
125
|
+
The [Puppet Strings](#puppet_strings) `@api private` directive can also be used
|
126
|
+
to disable checks on that file.
|
@@ -1,46 +1,131 @@
|
|
1
1
|
PuppetLint.new_check(:parameter_documentation) do
|
2
2
|
def check
|
3
|
-
|
4
|
-
|
3
|
+
allowed_styles = PuppetLint.configuration.docs_allowed_styles || ['doc', 'kafo', 'strings']
|
4
|
+
allowed_styles = [ allowed_styles ].flatten
|
5
5
|
|
6
|
-
|
6
|
+
class_indexes.concat(defined_type_indexes).each do |idx|
|
7
|
+
doc_params = {}
|
8
|
+
doc_params_styles = {}
|
9
|
+
doc_params_duplicates = Hash.new { |hash, key| hash[key] = [doc_params[key]] }
|
10
|
+
is_private = false
|
7
11
|
tokens[0..idx[:start]].reverse_each do |dtok|
|
8
12
|
next if [:CLASS, :DEFINE, :NEWLINE, :WHITESPACE, :INDENT].include?(dtok.type)
|
9
|
-
if
|
10
|
-
if dtok.value =~ /\A\s
|
11
|
-
|
12
|
-
|
13
|
-
|
13
|
+
if dtok.type == :COMMENT
|
14
|
+
if dtok.value =~ /\A\s*@api +private\s*$/
|
15
|
+
is_private = true
|
16
|
+
next
|
17
|
+
end
|
18
|
+
|
19
|
+
style = detect_style(dtok)
|
20
|
+
# not a doc parameter if style has not been detected
|
21
|
+
next if style[0].nil?
|
22
|
+
|
23
|
+
parameter = style[2]
|
24
|
+
parameter = 'name/title' if idx[:type] == :DEFINE && ['name','title'].include?(parameter)
|
25
|
+
if doc_params.include? parameter
|
26
|
+
doc_params_duplicates[parameter] << dtok
|
27
|
+
else
|
28
|
+
doc_params[parameter] = dtok
|
29
|
+
doc_params_styles[parameter] = style[0]
|
14
30
|
end
|
15
|
-
else
|
16
|
-
break
|
17
31
|
end
|
18
32
|
end
|
19
33
|
|
20
|
-
params =
|
21
|
-
|
22
|
-
|
23
|
-
|
24
|
-
|
25
|
-
|
26
|
-
|
27
|
-
|
28
|
-
|
29
|
-
|
30
|
-
end
|
31
|
-
end
|
34
|
+
params = extract_params(idx)
|
35
|
+
|
36
|
+
# warn about duplicates
|
37
|
+
doc_params_duplicates.each do |parameter, tokens|
|
38
|
+
tokens.each do |token|
|
39
|
+
notify :warning, {
|
40
|
+
:message => "Duplicate #{type_str(idx)} parameter documentation for #{idx[:name_token].value}::#{parameter}",
|
41
|
+
:line => token.line,
|
42
|
+
:column => token.column + token.value.match(/\A\s*(@param\s*)?/)[0].length + 1 # `+ 1` is to account for length of the `#` COMMENT token.
|
43
|
+
}
|
32
44
|
end
|
33
|
-
|
45
|
+
end
|
46
|
+
|
47
|
+
# warn about documentation for parameters that don't exist
|
48
|
+
doc_params.each do |parameter, token|
|
49
|
+
next if parameter == 'name/title' && idx[:type] == :DEFINE
|
50
|
+
next if params.find { |p| p.value == parameter }
|
34
51
|
|
35
|
-
params.each do |p|
|
36
|
-
next if doc_params.include? p.value
|
37
|
-
idx_type = idx[:type] == :CLASS ? "class" : "defined type"
|
38
52
|
notify :warning, {
|
39
|
-
:message => "
|
40
|
-
:line =>
|
41
|
-
:column =>
|
53
|
+
:message => "No matching #{type_str(idx)} parameter for documentation of #{idx[:name_token].value}::#{parameter}",
|
54
|
+
:line => token.line,
|
55
|
+
:column => token.column + token.value.match(/\A\s*(@param\s*)?/)[0].length + 1
|
42
56
|
}
|
43
57
|
end
|
58
|
+
|
59
|
+
unless is_private
|
60
|
+
params.each do |p|
|
61
|
+
if doc_params.has_key? p.value
|
62
|
+
style = doc_params_styles[p.value] || 'unknown'
|
63
|
+
unless allowed_styles.include?(style)
|
64
|
+
notify :warning, {
|
65
|
+
:message => "invalid documentation style for #{type_str(idx)} parameter #{idx[:name_token].value}::#{p.value} (#{doc_params_styles[p.value]})",
|
66
|
+
:line => p.line,
|
67
|
+
:column => p.column,
|
68
|
+
}
|
69
|
+
end
|
70
|
+
else
|
71
|
+
notify :warning, {
|
72
|
+
:message => "missing documentation for #{type_str(idx)} parameter #{idx[:name_token].value}::#{p.value}",
|
73
|
+
:line => p.line,
|
74
|
+
:column => p.column,
|
75
|
+
}
|
76
|
+
end
|
77
|
+
end
|
78
|
+
end
|
79
|
+
end
|
80
|
+
end
|
81
|
+
|
82
|
+
private
|
83
|
+
|
84
|
+
def type_str(idx)
|
85
|
+
idx[:type] == :CLASS ? "class" : "defined type"
|
86
|
+
end
|
87
|
+
|
88
|
+
def extract_params(idx)
|
89
|
+
params = []
|
90
|
+
return params if idx[:param_tokens].nil?
|
91
|
+
|
92
|
+
e = idx[:param_tokens].each
|
93
|
+
begin
|
94
|
+
while (ptok = e.next)
|
95
|
+
if ptok.type == :VARIABLE
|
96
|
+
params << ptok
|
97
|
+
nesting = 0
|
98
|
+
# skip to the next parameter to avoid finding default values of variables
|
99
|
+
while true
|
100
|
+
ptok = e.next
|
101
|
+
case ptok.type
|
102
|
+
when :LPAREN
|
103
|
+
nesting += 1
|
104
|
+
when :RPAREN
|
105
|
+
nesting -= 1
|
106
|
+
when :COMMA
|
107
|
+
break unless nesting > 0
|
108
|
+
end
|
109
|
+
end
|
110
|
+
end
|
111
|
+
end
|
112
|
+
rescue StopIteration; end
|
113
|
+
|
114
|
+
params
|
115
|
+
end
|
116
|
+
|
117
|
+
# returns an array [<detected_style>, <complete match>, <param name>, <same-line-docs>]
|
118
|
+
# [nil, nil] if this is not a parameter.
|
119
|
+
def detect_style(dtok)
|
120
|
+
style = nil
|
121
|
+
case dtok.value
|
122
|
+
when %r{\A\s*\[\*([a-zA-Z0-9_]+)\*\]\s*(.*)\z}
|
123
|
+
style = 'doc'
|
124
|
+
when %r{\A\s*\$([a-zA-Z0-9_]+):: +(.*)\z}
|
125
|
+
style = 'kafo'
|
126
|
+
when %r{\A\s*@param (?:\[.+\] )?([a-zA-Z0-9_]+)(?: +|$)(.*)\z}
|
127
|
+
style = 'strings'
|
44
128
|
end
|
129
|
+
[ style, * $~ ]
|
45
130
|
end
|
46
131
|
end
|
@@ -3,6 +3,8 @@ require 'spec_helper'
|
|
3
3
|
describe 'parameter_documentation' do
|
4
4
|
let(:class_msg) { 'missing documentation for class parameter example::%s' }
|
5
5
|
let(:define_msg) { 'missing documentation for defined type parameter example::%s' }
|
6
|
+
let(:class_style_msg) { 'invalid documentation style for class parameter example::%s (%s)' }
|
7
|
+
let(:define_style_msg) { 'invalid documentation style for defined type parameter example::%s (%s)' }
|
6
8
|
|
7
9
|
context 'class missing any documentation' do
|
8
10
|
let(:code) { 'class example($foo) { }' }
|
@@ -52,6 +54,18 @@ describe 'parameter_documentation' do
|
|
52
54
|
end
|
53
55
|
end
|
54
56
|
|
57
|
+
context 'define with param defaults using a function' do
|
58
|
+
let(:code) { 'define example($foo = min(8, $facts["processors"]["count"])) { }' }
|
59
|
+
|
60
|
+
it 'should detect a single problem' do
|
61
|
+
expect(problems).to have(1).problem
|
62
|
+
end
|
63
|
+
|
64
|
+
it 'should create a warning' do
|
65
|
+
expect(problems).to contain_warning(define_msg % :foo).on_line(1).in_column(16)
|
66
|
+
end
|
67
|
+
end
|
68
|
+
|
55
69
|
context 'class with many param defaults' do
|
56
70
|
let(:code) do
|
57
71
|
<<-EOS
|
@@ -149,6 +163,27 @@ define foreman (
|
|
149
163
|
end
|
150
164
|
end
|
151
165
|
|
166
|
+
context 'private class missing documentation (@param bar) for a parameter' do
|
167
|
+
let(:code) do
|
168
|
+
<<-EOS.gsub(/^\s+/, '')
|
169
|
+
# Example class
|
170
|
+
#
|
171
|
+
# @api private
|
172
|
+
#
|
173
|
+
# @param bar example
|
174
|
+
class example($foo, $bar) { }
|
175
|
+
EOS
|
176
|
+
end
|
177
|
+
|
178
|
+
it 'should detect no single problems' do
|
179
|
+
expect(problems).to have(0).problems
|
180
|
+
end
|
181
|
+
|
182
|
+
it 'should not create a warning' do
|
183
|
+
expect(problems).not_to contain_info(class_msg % :foo)
|
184
|
+
end
|
185
|
+
end
|
186
|
+
|
152
187
|
context 'define missing documentation (@param bar) for a parameter' do
|
153
188
|
let(:code) do
|
154
189
|
<<-EOS.gsub(/^\s+/, '')
|
@@ -322,6 +357,62 @@ define foreman (
|
|
322
357
|
end
|
323
358
|
end
|
324
359
|
|
360
|
+
context 'check style' do
|
361
|
+
let(:code) do
|
362
|
+
<<-EOS
|
363
|
+
# Example mixed style class
|
364
|
+
#
|
365
|
+
# Parameters:
|
366
|
+
#
|
367
|
+
# $foo:: example
|
368
|
+
#
|
369
|
+
# [*bar*] example
|
370
|
+
#
|
371
|
+
# @param foobar example
|
372
|
+
#
|
373
|
+
class example($foo, $bar, $foobar) { }
|
374
|
+
EOS
|
375
|
+
end
|
376
|
+
|
377
|
+
context 'detect all styles' do
|
378
|
+
before do
|
379
|
+
PuppetLint.configuration.docs_allowed_styles = ['noexist']
|
380
|
+
end
|
381
|
+
after do
|
382
|
+
PuppetLint.configuration.docs_allowed_styles = false
|
383
|
+
end
|
384
|
+
|
385
|
+
it 'should detect three problems' do
|
386
|
+
expect(problems).to have(3).problems
|
387
|
+
end
|
388
|
+
|
389
|
+
it 'should create three problems' do
|
390
|
+
expect(problems).to contain_warning(class_style_msg % [:foo, 'kafo']).on_line(11).in_column(21)
|
391
|
+
expect(problems).to contain_warning(class_style_msg % [:bar, 'doc']).on_line(11).in_column(27)
|
392
|
+
expect(problems).to contain_warning(class_style_msg % [:foobar, 'strings']).on_line(11).in_column(33)
|
393
|
+
end
|
394
|
+
end
|
395
|
+
|
396
|
+
context 'use configured style' do
|
397
|
+
before do
|
398
|
+
PuppetLint.configuration.docs_allowed_styles = 'strings'
|
399
|
+
end
|
400
|
+
after do
|
401
|
+
PuppetLint.configuration.docs_allowed_styles = nil
|
402
|
+
end
|
403
|
+
|
404
|
+
it 'should detect two problems' do
|
405
|
+
expect(problems).to have(2).problems
|
406
|
+
end
|
407
|
+
|
408
|
+
it 'should create three problems' do
|
409
|
+
expect(problems).to contain_warning(class_style_msg % [:foo, 'kafo']).on_line(11).in_column(21)
|
410
|
+
expect(problems).to contain_warning(class_style_msg % [:bar, 'doc']).on_line(11).in_column(27)
|
411
|
+
end
|
412
|
+
end
|
413
|
+
end
|
414
|
+
|
415
|
+
|
325
416
|
context 'define with all parameters documented ($foo::)' do
|
326
417
|
let(:code) do
|
327
418
|
<<-EOS
|
@@ -376,6 +467,88 @@ define foreman (
|
|
376
467
|
end
|
377
468
|
end
|
378
469
|
|
470
|
+
context 'class with all parameters documented (@param)' do
|
471
|
+
let(:code) do
|
472
|
+
<<-EOS
|
473
|
+
# Example class
|
474
|
+
#
|
475
|
+
# === Parameters:
|
476
|
+
#
|
477
|
+
# @param foo example
|
478
|
+
# @param [Integer] bar example
|
479
|
+
# @param baz
|
480
|
+
# example
|
481
|
+
# @param [Integer] qux
|
482
|
+
# example
|
483
|
+
#
|
484
|
+
class example($foo, $bar, $baz, $qux) { }
|
485
|
+
EOS
|
486
|
+
end
|
487
|
+
|
488
|
+
it 'should not detect any problems' do
|
489
|
+
expect(problems).to have(0).problems
|
490
|
+
end
|
491
|
+
end
|
492
|
+
|
493
|
+
context 'define with all parameters documented (@param)' do
|
494
|
+
let(:code) do
|
495
|
+
<<-EOS
|
496
|
+
# Example define
|
497
|
+
#
|
498
|
+
# === Parameters:
|
499
|
+
#
|
500
|
+
# @param foo example
|
501
|
+
# @param [Integer] bar example
|
502
|
+
# @param baz
|
503
|
+
# example
|
504
|
+
# @param [Integer] qux
|
505
|
+
# example
|
506
|
+
#
|
507
|
+
define example($foo, $bar, $baz, $qux) { }
|
508
|
+
EOS
|
509
|
+
end
|
510
|
+
|
511
|
+
it 'should not detect any problems' do
|
512
|
+
expect(problems).to have(0).problems
|
513
|
+
end
|
514
|
+
end
|
515
|
+
|
516
|
+
context 'define with all parameters documented with defaults (@param)' do
|
517
|
+
let(:code) do
|
518
|
+
<<-EOS
|
519
|
+
# Example define
|
520
|
+
#
|
521
|
+
# @param foo example
|
522
|
+
#
|
523
|
+
define example($foo = $facts['networking']['fqdn']) { }
|
524
|
+
EOS
|
525
|
+
end
|
526
|
+
|
527
|
+
it 'should not detect any problems' do
|
528
|
+
expect(problems).to have(0).problems
|
529
|
+
end
|
530
|
+
end
|
531
|
+
|
532
|
+
context 'define with all parameters documented with defaults using functions (@param)' do
|
533
|
+
let(:code) do
|
534
|
+
<<-EOS
|
535
|
+
# Example define
|
536
|
+
#
|
537
|
+
# @param foo example
|
538
|
+
# @param multiple test nested function calls
|
539
|
+
#
|
540
|
+
define example(
|
541
|
+
$foo = min(8, $facts['processors']['count']),
|
542
|
+
$multiple = min(8, max(2, $facts['processors']['count'])),
|
543
|
+
) { }
|
544
|
+
EOS
|
545
|
+
end
|
546
|
+
|
547
|
+
it 'should not detect any problems' do
|
548
|
+
expect(problems).to have(0).problems
|
549
|
+
end
|
550
|
+
end
|
551
|
+
|
379
552
|
context 'class without parameters' do
|
380
553
|
let(:code) { 'class example { }' }
|
381
554
|
|
@@ -429,4 +602,315 @@ define foreman (
|
|
429
602
|
expect(problems).to contain_warning(class_msg % :foo).on_line(7).in_column(15)
|
430
603
|
end
|
431
604
|
end
|
605
|
+
|
606
|
+
describe 'Duplicated documentation' do
|
607
|
+
let(:class_msg) { 'Duplicate class parameter documentation for example::%s' }
|
608
|
+
let(:define_msg) { 'Duplicate defined type parameter documentation for example::%s' }
|
609
|
+
|
610
|
+
context 'class with parameters documented twice (@param)' do
|
611
|
+
let(:code) do
|
612
|
+
<<-EOS.gsub(/^\s+/, '')
|
613
|
+
# @summary Example class
|
614
|
+
#
|
615
|
+
# @param bar
|
616
|
+
# example
|
617
|
+
# @param foo example
|
618
|
+
# @param bar Duplicate/conflicting docs
|
619
|
+
#
|
620
|
+
class example($foo, $bar) { }
|
621
|
+
EOS
|
622
|
+
end
|
623
|
+
|
624
|
+
it 'should detect two problems' do
|
625
|
+
expect(problems).to have(2).problem
|
626
|
+
end
|
627
|
+
|
628
|
+
it 'should create a warning on line 3' do
|
629
|
+
expect(problems).to contain_warning(class_msg % :bar).on_line(3).in_column(10)
|
630
|
+
end
|
631
|
+
|
632
|
+
it 'should create a warning on line 6' do
|
633
|
+
expect(problems).to contain_warning(class_msg % :bar).on_line(6).in_column(10)
|
634
|
+
end
|
635
|
+
end
|
636
|
+
|
637
|
+
context 'define with parameters documented twice (@param)' do
|
638
|
+
let(:code) do
|
639
|
+
<<-EOS.gsub(/^\s+/, '')
|
640
|
+
# @summary Example define
|
641
|
+
#
|
642
|
+
# @param bar
|
643
|
+
# example
|
644
|
+
# @param foo example
|
645
|
+
# @param bar Duplicate/conflicting docs
|
646
|
+
#
|
647
|
+
define example($foo, $bar) { }
|
648
|
+
EOS
|
649
|
+
end
|
650
|
+
|
651
|
+
it 'should detect two problems' do
|
652
|
+
expect(problems).to have(2).problem
|
653
|
+
end
|
654
|
+
|
655
|
+
it 'should create a warning on line 3' do
|
656
|
+
expect(problems).to contain_warning(define_msg % :bar).on_line(3).in_column(10)
|
657
|
+
end
|
658
|
+
|
659
|
+
it 'should create a warning on line 6' do
|
660
|
+
expect(problems).to contain_warning(define_msg % :bar).on_line(6).in_column(10)
|
661
|
+
end
|
662
|
+
end
|
663
|
+
|
664
|
+
context 'class with parameters documented 3 times (@param)' do
|
665
|
+
let(:code) do
|
666
|
+
<<-EOS.gsub(/^\s+/, '')
|
667
|
+
# @summary Example class
|
668
|
+
#
|
669
|
+
# @param bar
|
670
|
+
# example
|
671
|
+
# @param foo example
|
672
|
+
# @param bar Duplicate/conflicting docs
|
673
|
+
#
|
674
|
+
# @param bar
|
675
|
+
# example
|
676
|
+
#
|
677
|
+
class example($foo, $bar) { }
|
678
|
+
EOS
|
679
|
+
end
|
680
|
+
|
681
|
+
it 'should detect three problems' do
|
682
|
+
expect(problems).to have(3).problem
|
683
|
+
end
|
684
|
+
|
685
|
+
it 'should create a warning on line 3' do
|
686
|
+
expect(problems).to contain_warning(class_msg % :bar).on_line(3).in_column(10)
|
687
|
+
end
|
688
|
+
|
689
|
+
it 'should create a warning on line 6' do
|
690
|
+
expect(problems).to contain_warning(class_msg % :bar).on_line(6).in_column(10)
|
691
|
+
end
|
692
|
+
|
693
|
+
it 'should create a warning on line 8' do
|
694
|
+
expect(problems).to contain_warning(class_msg % :bar).on_line(8).in_column(10)
|
695
|
+
end
|
696
|
+
end
|
697
|
+
|
698
|
+
context 'private class with parameters documented twice (@param)' do
|
699
|
+
let(:code) do
|
700
|
+
<<-EOS.gsub(/^\s+/, '')
|
701
|
+
# @summary Example class
|
702
|
+
#
|
703
|
+
# @param bar docs
|
704
|
+
# @param bar Duplicate/conflicting docs
|
705
|
+
#
|
706
|
+
# @api private
|
707
|
+
class example($bar) { }
|
708
|
+
EOS
|
709
|
+
end
|
710
|
+
|
711
|
+
it 'should detect two problems' do
|
712
|
+
expect(problems).to have(2).problem
|
713
|
+
end
|
714
|
+
|
715
|
+
it 'should create a warning on line 3' do
|
716
|
+
expect(problems).to contain_warning(class_msg % :bar).on_line(3).in_column(10)
|
717
|
+
end
|
718
|
+
|
719
|
+
it 'should create a warning on line 4' do
|
720
|
+
expect(problems).to contain_warning(class_msg % :bar).on_line(4).in_column(10)
|
721
|
+
end
|
722
|
+
end
|
723
|
+
|
724
|
+
context 'class with parameters documented twice ([*bar*])' do
|
725
|
+
let(:code) do
|
726
|
+
<<-EOS.gsub(/^\s+/, '')
|
727
|
+
# @summary Example class
|
728
|
+
#
|
729
|
+
# @param bar
|
730
|
+
# example
|
731
|
+
# @param foo example
|
732
|
+
# [*bar*] Duplicate/conflicting docs
|
733
|
+
#
|
734
|
+
class example($foo, $bar) { }
|
735
|
+
EOS
|
736
|
+
end
|
737
|
+
|
738
|
+
it 'should detect two problems' do
|
739
|
+
expect(problems).to have(2).problem
|
740
|
+
end
|
741
|
+
|
742
|
+
it 'should create a warning on line 3' do
|
743
|
+
expect(problems).to contain_warning(class_msg % :bar).on_line(3).in_column(10)
|
744
|
+
end
|
745
|
+
|
746
|
+
it 'should create a warning on line 6' do
|
747
|
+
expect(problems).to contain_warning(class_msg % :bar).on_line(6).in_column(3)
|
748
|
+
end
|
749
|
+
end
|
750
|
+
end
|
751
|
+
|
752
|
+
context 'class with documentation for parameters that don\'t exist' do
|
753
|
+
let(:code) do
|
754
|
+
<<-EOS.gsub(/^\s+/, '')
|
755
|
+
# @summary Example class
|
756
|
+
#
|
757
|
+
# @param foo
|
758
|
+
class example { }
|
759
|
+
EOS
|
760
|
+
end
|
761
|
+
|
762
|
+
it 'should detect a single problem' do
|
763
|
+
expect(problems).to have(1).problem
|
764
|
+
end
|
765
|
+
|
766
|
+
it 'should create a warning on line 3' do
|
767
|
+
expect(problems).to contain_warning('No matching class parameter for documentation of example::foo').on_line(3).in_column(10)
|
768
|
+
end
|
769
|
+
end
|
770
|
+
|
771
|
+
context 'private class with documentation for parameters that don\'t exist' do
|
772
|
+
let(:code) do
|
773
|
+
<<-EOS.gsub(/^\s+/, '')
|
774
|
+
# @summary Example class
|
775
|
+
#
|
776
|
+
# @param foo
|
777
|
+
# Example docs
|
778
|
+
#
|
779
|
+
# @api private
|
780
|
+
class example { }
|
781
|
+
EOS
|
782
|
+
end
|
783
|
+
|
784
|
+
it 'should detect a single problem' do
|
785
|
+
expect(problems).to have(1).problem
|
786
|
+
end
|
787
|
+
|
788
|
+
it 'should create a warning on line 3' do
|
789
|
+
expect(problems).to contain_warning('No matching class parameter for documentation of example::foo').on_line(3).in_column(10)
|
790
|
+
end
|
791
|
+
end
|
792
|
+
|
793
|
+
context 'define with documentation for parameters that don\'t exist' do
|
794
|
+
let(:code) do
|
795
|
+
<<-EOS.gsub(/^\s+/, '')
|
796
|
+
# @summary Example define
|
797
|
+
#
|
798
|
+
# @param bar Docs for bar
|
799
|
+
# @param foo
|
800
|
+
# Docs for foo
|
801
|
+
#
|
802
|
+
# @api private
|
803
|
+
define example::example(String[1] $bar) { }
|
804
|
+
EOS
|
805
|
+
end
|
806
|
+
|
807
|
+
it 'should detect a single problem' do
|
808
|
+
expect(problems).to have(1).problem
|
809
|
+
end
|
810
|
+
|
811
|
+
it 'should create a warning on line 4' do
|
812
|
+
expect(problems).to contain_warning('No matching defined type parameter for documentation of example::example::foo').on_line(4).in_column(10)
|
813
|
+
end
|
814
|
+
end
|
815
|
+
|
816
|
+
context 'define with documentation for parameter `name`' do
|
817
|
+
let(:code) do
|
818
|
+
<<-EOS.gsub(/^\s+/, '')
|
819
|
+
# @summary Example define
|
820
|
+
#
|
821
|
+
# @param name
|
822
|
+
# Docs for the $name
|
823
|
+
# @param bar Docs for bar
|
824
|
+
define example::example(String[1] $bar) { }
|
825
|
+
EOS
|
826
|
+
end
|
827
|
+
|
828
|
+
it 'should not detect any problems' do
|
829
|
+
expect(problems).to have(0).problems
|
830
|
+
end
|
831
|
+
end
|
832
|
+
|
833
|
+
context 'class with documentation for parameter `name`' do
|
834
|
+
let(:code) do
|
835
|
+
<<-EOS.gsub(/^\s+/, '')
|
836
|
+
# @summary Example class
|
837
|
+
#
|
838
|
+
# @param name
|
839
|
+
# Invalid docs
|
840
|
+
class example { }
|
841
|
+
EOS
|
842
|
+
end
|
843
|
+
|
844
|
+
it 'should detect a single problem' do
|
845
|
+
expect(problems).to have(1).problem
|
846
|
+
end
|
847
|
+
|
848
|
+
it 'should create a warning on line 3' do
|
849
|
+
expect(problems).to contain_warning('No matching class parameter for documentation of example::name').on_line(3).in_column(10)
|
850
|
+
end
|
851
|
+
end
|
852
|
+
|
853
|
+
context 'define with documentation for parameter `title`' do
|
854
|
+
let(:code) do
|
855
|
+
<<-EOS.gsub(/^\s+/, '')
|
856
|
+
# @summary Example define
|
857
|
+
#
|
858
|
+
# @param title
|
859
|
+
# Docs for the $title
|
860
|
+
# @param bar Docs for bar
|
861
|
+
define example::example(String[1] $bar) { }
|
862
|
+
EOS
|
863
|
+
end
|
864
|
+
|
865
|
+
it 'should not detect any problems' do
|
866
|
+
expect(problems).to have(0).problems
|
867
|
+
end
|
868
|
+
end
|
869
|
+
|
870
|
+
context 'class with documentation for parameter `title`' do
|
871
|
+
let(:code) do
|
872
|
+
<<-EOS.gsub(/^\s+/, '')
|
873
|
+
# @summary Example class
|
874
|
+
#
|
875
|
+
# @param title
|
876
|
+
# Invalid docs
|
877
|
+
class example { }
|
878
|
+
EOS
|
879
|
+
end
|
880
|
+
|
881
|
+
it 'should detect a single problem' do
|
882
|
+
expect(problems).to have(1).problem
|
883
|
+
end
|
884
|
+
|
885
|
+
it 'should create a warning on line 3' do
|
886
|
+
expect(problems).to contain_warning('No matching class parameter for documentation of example::title').on_line(3).in_column(10)
|
887
|
+
end
|
888
|
+
end
|
889
|
+
|
890
|
+
context 'define with documentation for both `title` and `name`' do
|
891
|
+
let(:code) do
|
892
|
+
<<-EOS.gsub(/^\s+/, '')
|
893
|
+
# @summary Example define
|
894
|
+
#
|
895
|
+
# @param title
|
896
|
+
# Docs for the $title
|
897
|
+
# @param name
|
898
|
+
# Docs for the $name
|
899
|
+
# @param bar Docs for bar
|
900
|
+
define example(String[1] $bar) { }
|
901
|
+
EOS
|
902
|
+
end
|
903
|
+
|
904
|
+
it 'should detect two problems' do
|
905
|
+
expect(problems).to have(2).problems
|
906
|
+
end
|
907
|
+
|
908
|
+
it 'should create a warning on line 3' do
|
909
|
+
expect(problems).to contain_warning('Duplicate defined type parameter documentation for example::name/title').on_line(3).in_column(10)
|
910
|
+
end
|
911
|
+
|
912
|
+
it 'should create a warning on line 5' do
|
913
|
+
expect(problems).to contain_warning('Duplicate defined type parameter documentation for example::name/title').on_line(5).in_column(10)
|
914
|
+
end
|
915
|
+
end
|
432
916
|
end
|
metadata
CHANGED
@@ -1,94 +1,107 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: puppet-lint-param-docs
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 1.
|
4
|
+
version: 1.7.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
|
-
-
|
7
|
+
- Vox Pupuli
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date:
|
11
|
+
date: 2021-06-05 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: puppet-lint
|
15
15
|
requirement: !ruby/object:Gem::Requirement
|
16
16
|
requirements:
|
17
|
-
- -
|
17
|
+
- - ">="
|
18
18
|
- !ruby/object:Gem::Version
|
19
19
|
version: '1.1'
|
20
|
-
- - <
|
20
|
+
- - "<"
|
21
21
|
- !ruby/object:Gem::Version
|
22
22
|
version: '3.0'
|
23
23
|
type: :runtime
|
24
24
|
prerelease: false
|
25
25
|
version_requirements: !ruby/object:Gem::Requirement
|
26
26
|
requirements:
|
27
|
-
- -
|
27
|
+
- - ">="
|
28
28
|
- !ruby/object:Gem::Version
|
29
29
|
version: '1.1'
|
30
|
-
- - <
|
30
|
+
- - "<"
|
31
31
|
- !ruby/object:Gem::Version
|
32
32
|
version: '3.0'
|
33
33
|
- !ruby/object:Gem::Dependency
|
34
34
|
name: rspec
|
35
35
|
requirement: !ruby/object:Gem::Requirement
|
36
36
|
requirements:
|
37
|
-
- - ~>
|
37
|
+
- - "~>"
|
38
38
|
- !ruby/object:Gem::Version
|
39
39
|
version: '3.0'
|
40
40
|
type: :development
|
41
41
|
prerelease: false
|
42
42
|
version_requirements: !ruby/object:Gem::Requirement
|
43
43
|
requirements:
|
44
|
-
- - ~>
|
44
|
+
- - "~>"
|
45
45
|
- !ruby/object:Gem::Version
|
46
46
|
version: '3.0'
|
47
47
|
- !ruby/object:Gem::Dependency
|
48
48
|
name: rspec-its
|
49
49
|
requirement: !ruby/object:Gem::Requirement
|
50
50
|
requirements:
|
51
|
-
- - ~>
|
51
|
+
- - "~>"
|
52
52
|
- !ruby/object:Gem::Version
|
53
53
|
version: '1.0'
|
54
54
|
type: :development
|
55
55
|
prerelease: false
|
56
56
|
version_requirements: !ruby/object:Gem::Requirement
|
57
57
|
requirements:
|
58
|
-
- - ~>
|
58
|
+
- - "~>"
|
59
59
|
- !ruby/object:Gem::Version
|
60
60
|
version: '1.0'
|
61
61
|
- !ruby/object:Gem::Dependency
|
62
62
|
name: rspec-collection_matchers
|
63
63
|
requirement: !ruby/object:Gem::Requirement
|
64
64
|
requirements:
|
65
|
-
- - ~>
|
65
|
+
- - "~>"
|
66
66
|
- !ruby/object:Gem::Version
|
67
67
|
version: '1.0'
|
68
68
|
type: :development
|
69
69
|
prerelease: false
|
70
70
|
version_requirements: !ruby/object:Gem::Requirement
|
71
71
|
requirements:
|
72
|
-
- - ~>
|
72
|
+
- - "~>"
|
73
73
|
- !ruby/object:Gem::Version
|
74
74
|
version: '1.0'
|
75
75
|
- !ruby/object:Gem::Dependency
|
76
76
|
name: rake
|
77
77
|
requirement: !ruby/object:Gem::Requirement
|
78
78
|
requirements:
|
79
|
-
- -
|
79
|
+
- - ">="
|
80
80
|
- !ruby/object:Gem::Version
|
81
81
|
version: '0'
|
82
82
|
type: :development
|
83
83
|
prerelease: false
|
84
84
|
version_requirements: !ruby/object:Gem::Requirement
|
85
85
|
requirements:
|
86
|
-
- -
|
86
|
+
- - ">="
|
87
87
|
- !ruby/object:Gem::Version
|
88
88
|
version: '0'
|
89
|
-
|
90
|
-
|
91
|
-
|
89
|
+
- !ruby/object:Gem::Dependency
|
90
|
+
name: simplecov
|
91
|
+
requirement: !ruby/object:Gem::Requirement
|
92
|
+
requirements:
|
93
|
+
- - ">="
|
94
|
+
- !ruby/object:Gem::Version
|
95
|
+
version: '0'
|
96
|
+
type: :development
|
97
|
+
prerelease: false
|
98
|
+
version_requirements: !ruby/object:Gem::Requirement
|
99
|
+
requirements:
|
100
|
+
- - ">="
|
101
|
+
- !ruby/object:Gem::Version
|
102
|
+
version: '0'
|
103
|
+
description: " A new check for puppet-lint that validates all parameters are documented.\n"
|
104
|
+
email: voxpupuli@groups.io
|
92
105
|
executables: []
|
93
106
|
extensions: []
|
94
107
|
extra_rdoc_files: []
|
@@ -100,7 +113,7 @@ files:
|
|
100
113
|
- lib/puppet-lint/plugins/check_parameter_documentation.rb
|
101
114
|
- spec/puppet-lint/plugins/check_parameter_documentation_spec.rb
|
102
115
|
- spec/spec_helper.rb
|
103
|
-
homepage: https://github.com/
|
116
|
+
homepage: https://github.com/voxpupuli/puppet-lint-param-docs
|
104
117
|
licenses:
|
105
118
|
- MIT
|
106
119
|
metadata: {}
|
@@ -110,20 +123,19 @@ require_paths:
|
|
110
123
|
- lib
|
111
124
|
required_ruby_version: !ruby/object:Gem::Requirement
|
112
125
|
requirements:
|
113
|
-
- -
|
126
|
+
- - ">="
|
114
127
|
- !ruby/object:Gem::Version
|
115
128
|
version: '0'
|
116
129
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
117
130
|
requirements:
|
118
|
-
- -
|
131
|
+
- - ">="
|
119
132
|
- !ruby/object:Gem::Version
|
120
133
|
version: '0'
|
121
134
|
requirements: []
|
122
|
-
|
123
|
-
rubygems_version: 2.4.4
|
135
|
+
rubygems_version: 3.1.6
|
124
136
|
signing_key:
|
125
137
|
specification_version: 4
|
126
138
|
summary: puppet-lint check to validate all parameters are documented
|
127
139
|
test_files:
|
128
|
-
- spec/puppet-lint/plugins/check_parameter_documentation_spec.rb
|
129
140
|
- spec/spec_helper.rb
|
141
|
+
- spec/puppet-lint/plugins/check_parameter_documentation_spec.rb
|