puppet-lint 0.2.0 → 0.2.1
Sign up to get free protection for your applications and to get access to all the features.
- data/lib/puppet-lint.rb +1 -3
- data/lib/puppet-lint/configuration.rb +7 -6
- data/lib/puppet-lint/plugin.rb +14 -24
- data/lib/puppet-lint/plugins/check_classes.rb +14 -10
- data/lib/puppet-lint/plugins/check_documentation.rb +10 -14
- data/lib/puppet-lint/plugins/check_resources.rb +56 -73
- data/lib/puppet-lint/version.rb +1 -1
- data/spec/puppet-lint/configuration_spec.rb +4 -1
- data/spec/puppet-lint/plugins/check_classes/autoloader_layout_spec.rb +51 -0
- data/spec/puppet-lint/plugins/check_classes/inherits_across_namespaces_spec.rb +23 -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 +71 -0
- data/spec/puppet-lint/plugins/check_classes/parameter_order_spec.rb +67 -0
- data/spec/puppet-lint/plugins/check_classes/parameterised_classes_spec.rb +43 -0
- data/spec/puppet-lint/plugins/check_classes/right_to_left_relationship_spec.rb +23 -0
- data/spec/puppet-lint/plugins/check_classes/variable_scope_spec.rb +93 -0
- data/spec/puppet-lint/plugins/check_comments/slash_comments_spec.rb +16 -0
- data/spec/puppet-lint/plugins/check_comments/star_comments_spec.rb +19 -0
- data/spec/puppet-lint/plugins/{check_conditionals_spec.rb → check_conditionals/case_without_default_spec.rb} +1 -39
- data/spec/puppet-lint/plugins/check_conditionals/selector_inside_resource_spec.rb +33 -0
- data/spec/puppet-lint/plugins/{check_documentation_spec.rb → check_documentation/documentation_spec.rb} +1 -9
- data/spec/puppet-lint/plugins/check_resources/duplicate_params_spec.rb +23 -0
- data/spec/puppet-lint/plugins/check_resources/ensure_first_param_spec.rb +43 -0
- data/spec/puppet-lint/plugins/check_resources/ensure_not_symlink_target_spec.rb +26 -0
- data/spec/puppet-lint/plugins/check_resources/file_mode_spec.rb +43 -0
- data/spec/puppet-lint/plugins/check_resources/unquoted_file_mode_spec.rb +11 -0
- data/spec/puppet-lint/plugins/check_resources/unquoted_resource_title_spec.rb +110 -0
- data/spec/puppet-lint/plugins/check_strings/double_quoted_strings_spec.rb +83 -0
- data/spec/puppet-lint/plugins/check_strings/only_variable_string_spec.rb +16 -0
- data/spec/puppet-lint/plugins/check_strings/quoted_booleans_spec.rb +55 -0
- data/spec/puppet-lint/plugins/check_strings/single_quote_string_with_variables_spec.rb +16 -0
- data/spec/puppet-lint/plugins/check_strings/variables_not_enclosed_spec.rb +29 -0
- data/spec/puppet-lint/plugins/{check_variables_spec.rb → check_variables/variable_contains_dash_spec.rb} +1 -9
- data/spec/puppet-lint/plugins/check_whitespace/2sp_soft_tabs_spec.rb +20 -0
- data/spec/puppet-lint/plugins/check_whitespace/80chars_spec.rb +38 -0
- data/spec/puppet-lint/plugins/{check_whitespace_spec.rb → check_whitespace/arrow_alignment_spec.rb} +1 -86
- data/spec/puppet-lint/plugins/check_whitespace/hard_tabs_spec.rb +16 -0
- data/spec/puppet-lint/plugins/check_whitespace/trailing_whitespace_spec.rb +16 -0
- data/spec/spec_helper.rb +17 -0
- metadata +122 -92
- data/spec/puppet-lint/plugins/check_classes_spec.rb +0 -390
- data/spec/puppet-lint/plugins/check_comments_spec.rb +0 -40
- data/spec/puppet-lint/plugins/check_resources_spec.rb +0 -249
- data/spec/puppet-lint/plugins/check_strings_spec.rb +0 -175
@@ -1,14 +1,6 @@
|
|
1
1
|
require 'spec_helper'
|
2
2
|
|
3
|
-
describe
|
4
|
-
subject do
|
5
|
-
klass = described_class.new
|
6
|
-
fileinfo = {}
|
7
|
-
fileinfo[:fullpath] = defined?(fullpath).nil? ? '' : fullpath
|
8
|
-
klass.run(fileinfo, code)
|
9
|
-
klass
|
10
|
-
end
|
11
|
-
|
3
|
+
describe 'documentation' do
|
12
4
|
describe 'undocumented class' do
|
13
5
|
let(:code) { "class test {}" }
|
14
6
|
|
@@ -0,0 +1,23 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
describe 'duplicate_params' do
|
4
|
+
describe 'resource with duplicate parameters' do
|
5
|
+
let(:code) { "
|
6
|
+
file { '/tmp/foo':
|
7
|
+
ensure => present,
|
8
|
+
foo => bar,
|
9
|
+
baz => gronk,
|
10
|
+
foo => meh,
|
11
|
+
}"
|
12
|
+
}
|
13
|
+
|
14
|
+
its(:problems) {
|
15
|
+
should only_have_problem({
|
16
|
+
:kind => :error,
|
17
|
+
:message => 'duplicate parameter found in resource',
|
18
|
+
:linenumber => 6,
|
19
|
+
:column => 9,
|
20
|
+
})
|
21
|
+
}
|
22
|
+
end
|
23
|
+
end
|
@@ -0,0 +1,43 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
describe 'ensure_first_param' do
|
4
|
+
describe 'ensure as only attr in a single line resource' do
|
5
|
+
let(:code) { "file { 'foo': ensure => present }" }
|
6
|
+
|
7
|
+
its(:problems) { should be_empty }
|
8
|
+
end
|
9
|
+
|
10
|
+
describe 'ensure as only attr in a multi line resource' do
|
11
|
+
let(:code) { "
|
12
|
+
file { 'foo':
|
13
|
+
ensure => present,
|
14
|
+
}"
|
15
|
+
}
|
16
|
+
|
17
|
+
its(:problems) { should be_empty }
|
18
|
+
end
|
19
|
+
|
20
|
+
describe 'ensure as second attr in a multi line resource' do
|
21
|
+
let(:code) { "
|
22
|
+
file { 'foo':
|
23
|
+
mode => '0000',
|
24
|
+
ensure => present,
|
25
|
+
}"
|
26
|
+
}
|
27
|
+
|
28
|
+
its(:problems) {
|
29
|
+
should only_have_problem :kind => :warning, :message => "ensure found on line but it's not the first attribute", :linenumber => 4
|
30
|
+
}
|
31
|
+
end
|
32
|
+
|
33
|
+
describe 'ensure as first attr in a multi line resource' do
|
34
|
+
let(:code) { "
|
35
|
+
file { 'foo':
|
36
|
+
ensure => present,
|
37
|
+
mode => '0000',
|
38
|
+
}"
|
39
|
+
}
|
40
|
+
|
41
|
+
its(:problems) { should be_empty }
|
42
|
+
end
|
43
|
+
end
|
@@ -0,0 +1,26 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
describe 'ensure_not_symlink_target' do
|
4
|
+
describe 'file resource creating a symlink with seperate target attr' do
|
5
|
+
let(:code) { "
|
6
|
+
file { 'foo':
|
7
|
+
ensure => link,
|
8
|
+
target => '/foo/bar',
|
9
|
+
}"
|
10
|
+
}
|
11
|
+
|
12
|
+
its(:problems) { should be_empty }
|
13
|
+
end
|
14
|
+
|
15
|
+
describe 'file resource creating a symlink with target specified in ensure' do
|
16
|
+
let(:code) { "
|
17
|
+
file { 'foo':
|
18
|
+
ensure => '/foo/bar',
|
19
|
+
}"
|
20
|
+
}
|
21
|
+
|
22
|
+
its(:problems) {
|
23
|
+
should only_have_problem :kind => :warning, :message => "symlink target specified in ensure attr", :linenumber => 3
|
24
|
+
}
|
25
|
+
end
|
26
|
+
end
|
@@ -0,0 +1,43 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
describe 'file_mode' do
|
4
|
+
describe '3 digit file mode' do
|
5
|
+
let(:code) { "file { 'foo': mode => '777' }" }
|
6
|
+
|
7
|
+
its(:problems) {
|
8
|
+
should only_have_problem :kind => :warning, :message => "mode should be represented as a 4 digit octal value or symbolic mode", :linenumber => 1
|
9
|
+
}
|
10
|
+
end
|
11
|
+
|
12
|
+
describe '4 digit file mode' do
|
13
|
+
let(:code) { "file { 'foo': mode => '0777' }" }
|
14
|
+
|
15
|
+
its(:problems) { should be_empty }
|
16
|
+
end
|
17
|
+
|
18
|
+
describe 'file mode as a variable' do
|
19
|
+
let(:code) { "file { 'foo': mode => $file_mode }" }
|
20
|
+
|
21
|
+
its(:problems) { should be_empty }
|
22
|
+
end
|
23
|
+
|
24
|
+
describe 'symbolic file mode' do
|
25
|
+
let(:code) { "file { 'foo': mode => 'u=rw,og=r' }" }
|
26
|
+
|
27
|
+
its(:problems) { should be_empty }
|
28
|
+
end
|
29
|
+
|
30
|
+
describe 'file mode undef unquoted' do
|
31
|
+
let(:code) { "file { 'foo': mode => undef }" }
|
32
|
+
|
33
|
+
its(:problems) { should be_empty }
|
34
|
+
end
|
35
|
+
|
36
|
+
describe 'file mode undef quoted' do
|
37
|
+
let(:code) { "file { 'foo': mode => 'undef' }" }
|
38
|
+
|
39
|
+
its(:problems) {
|
40
|
+
should only_have_problem :kind => :warning, :message => "mode should be represented as a 4 digit octal value or symbolic mode", :linenumber => 1
|
41
|
+
}
|
42
|
+
end
|
43
|
+
end
|
@@ -0,0 +1,11 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
describe 'unquoted_file_mode' do
|
4
|
+
describe '4 digit unquoted file mode' do
|
5
|
+
let(:code) { "file { 'foo': mode => 0777 }" }
|
6
|
+
|
7
|
+
its(:problems) {
|
8
|
+
should only_have_problem :kind => :warning, :message => "unquoted file mode"
|
9
|
+
}
|
10
|
+
end
|
11
|
+
end
|
@@ -0,0 +1,110 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
describe 'unquoted_resource_title' do
|
4
|
+
describe 'quoted resource title on single line resource' do
|
5
|
+
let(:code) { "file { 'foo': }" }
|
6
|
+
|
7
|
+
its(:problems) { should be_empty }
|
8
|
+
end
|
9
|
+
|
10
|
+
describe 'unquoted resource title on single line resource' do
|
11
|
+
let(:code) { "file { foo: }" }
|
12
|
+
|
13
|
+
its(:problems) {
|
14
|
+
should only_have_problem :kind => :warning, :message => "unquoted resource title", :linenumber => 1
|
15
|
+
}
|
16
|
+
end
|
17
|
+
|
18
|
+
describe 'quoted resource title on multi line resource' do
|
19
|
+
let(:code) { "
|
20
|
+
file { 'foo':
|
21
|
+
}"
|
22
|
+
}
|
23
|
+
|
24
|
+
its(:problems) { should be_empty }
|
25
|
+
end
|
26
|
+
|
27
|
+
describe 'unquoted resource title on multi line resource' do
|
28
|
+
let(:code) { "
|
29
|
+
file { foo:
|
30
|
+
}"
|
31
|
+
}
|
32
|
+
|
33
|
+
its(:problems) {
|
34
|
+
should only_have_problem :kind => :warning, :message => "unquoted resource title", :linenumber => 2
|
35
|
+
}
|
36
|
+
end
|
37
|
+
|
38
|
+
describe 'condensed resources with quoted titles' do
|
39
|
+
let(:code) { "
|
40
|
+
file {
|
41
|
+
'foo': ;
|
42
|
+
'bar': ;
|
43
|
+
}"
|
44
|
+
}
|
45
|
+
|
46
|
+
its(:problems) { should be_empty }
|
47
|
+
end
|
48
|
+
|
49
|
+
describe 'condensed resources with an unquoted title' do
|
50
|
+
let(:code) { "
|
51
|
+
file {
|
52
|
+
'foo': ;
|
53
|
+
bar: ;
|
54
|
+
}"
|
55
|
+
}
|
56
|
+
|
57
|
+
its(:problems) {
|
58
|
+
should only_have_problem :kind => :warning, :message => "unquoted resource title", :linenumber => 4
|
59
|
+
}
|
60
|
+
end
|
61
|
+
|
62
|
+
describe 'single line resource with an array of titles (all quoted)' do
|
63
|
+
let(:code) { "file { ['foo', 'bar']: }" }
|
64
|
+
|
65
|
+
its(:problems) { should be_empty }
|
66
|
+
end
|
67
|
+
|
68
|
+
describe 'resource inside a case statement' do
|
69
|
+
let(:code) { "
|
70
|
+
case $ensure {
|
71
|
+
'absent': {
|
72
|
+
file { \"some_file_${name}\":
|
73
|
+
ensure => absent,
|
74
|
+
}
|
75
|
+
}
|
76
|
+
}"
|
77
|
+
}
|
78
|
+
|
79
|
+
its(:problems) { should == [] }
|
80
|
+
end
|
81
|
+
|
82
|
+
describe 'issue #116' do
|
83
|
+
let(:code) { "
|
84
|
+
$config_file_init = $::operatingsystem ? {
|
85
|
+
/(?i:Debian|Ubuntu|Mint)/ => '/etc/default/foo',
|
86
|
+
default => '/etc/sysconfig/foo',
|
87
|
+
}"
|
88
|
+
}
|
89
|
+
|
90
|
+
its(:problems) { should == [] }
|
91
|
+
end
|
92
|
+
|
93
|
+
describe 'case statement' do
|
94
|
+
let(:code) { %{
|
95
|
+
case $operatingsystem {
|
96
|
+
centos: {
|
97
|
+
$version = '1.2.3'
|
98
|
+
}
|
99
|
+
solaris: {
|
100
|
+
$version = '3.2.1'
|
101
|
+
}
|
102
|
+
default: {
|
103
|
+
fail("Module ${module_name} is not supported on ${operatingsystem}")
|
104
|
+
}
|
105
|
+
}}
|
106
|
+
}
|
107
|
+
|
108
|
+
its(:problems) { should == [] }
|
109
|
+
end
|
110
|
+
end
|
@@ -0,0 +1,83 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
describe 'double_quoted_strings' do
|
4
|
+
describe 'double quoted string containing a variable inside single quotes' do
|
5
|
+
let(:code) { "exec { \"/usr/bin/wget -O - '${source}' | /usr/bin/apt-key add -\": }" }
|
6
|
+
|
7
|
+
its(:problems) { should be_empty }
|
8
|
+
end
|
9
|
+
|
10
|
+
describe 'multiple strings in a line' do
|
11
|
+
let(:code) { "\"aoeu\" '${foo}'" }
|
12
|
+
|
13
|
+
its(:problems) {
|
14
|
+
should have_problem({
|
15
|
+
:kind => :warning,
|
16
|
+
:message => 'double quoted string containing no variables',
|
17
|
+
:linenumber => 1,
|
18
|
+
:column => 1,
|
19
|
+
})
|
20
|
+
}
|
21
|
+
end
|
22
|
+
|
23
|
+
describe 'double quoted string nested in a single quoted string' do
|
24
|
+
let(:code) { "'grep \"status=sent\" /var/log/mail.log'" }
|
25
|
+
|
26
|
+
its(:problems) { should be_empty }
|
27
|
+
end
|
28
|
+
|
29
|
+
describe 'double quoted string after a comment' do
|
30
|
+
let(:code) { "service { 'foo': } # \"bar\"" }
|
31
|
+
|
32
|
+
its(:problems) { should be_empty }
|
33
|
+
end
|
34
|
+
|
35
|
+
describe 'double quoted string containing newline but no variables' do
|
36
|
+
let(:code) { %{"foo\n"} }
|
37
|
+
|
38
|
+
its(:problems) { should be_empty }
|
39
|
+
end
|
40
|
+
|
41
|
+
describe 'double quoted string with backslash for continuation' do
|
42
|
+
let(:code) { %{
|
43
|
+
class puppet::master::maintenance (
|
44
|
+
) {
|
45
|
+
cron { 'puppet_master_reports_cleanup':
|
46
|
+
command => "/usr/bin/find /var/lib/puppet/reports -type f -mtime +15 \
|
47
|
+
-delete && /usr/bin/find /var/lib/puppet/reports -mindepth 1 \
|
48
|
+
-empty -type d -delete",
|
49
|
+
minute => '15',
|
50
|
+
hour => '5',
|
51
|
+
}
|
52
|
+
}
|
53
|
+
} }
|
54
|
+
|
55
|
+
its(:problems) { should == [] }
|
56
|
+
end
|
57
|
+
|
58
|
+
describe 'double quoted true' do
|
59
|
+
let(:code) { "class { 'foo': boolFlag => \"true\" }" }
|
60
|
+
|
61
|
+
its(:problems) {
|
62
|
+
should have_problem({
|
63
|
+
:kind => :warning,
|
64
|
+
:message => 'double quoted string containing no variables',
|
65
|
+
:linenumber => 1,
|
66
|
+
:column => 28,
|
67
|
+
})
|
68
|
+
}
|
69
|
+
end
|
70
|
+
|
71
|
+
describe 'double quoted false' do
|
72
|
+
let(:code) { "class { 'foo': boolFlag => \"false\" }" }
|
73
|
+
|
74
|
+
its(:problems) {
|
75
|
+
should have_problem({
|
76
|
+
:kind => :warning,
|
77
|
+
:message => 'double quoted string containing no variables',
|
78
|
+
:linenumber => 1,
|
79
|
+
:column => 28,
|
80
|
+
})
|
81
|
+
}
|
82
|
+
end
|
83
|
+
end
|
@@ -0,0 +1,16 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
describe 'only_variable_string' do
|
4
|
+
describe 'string containing only a variable' do
|
5
|
+
let(:code) { '"${foo}"' }
|
6
|
+
|
7
|
+
its(:problems) {
|
8
|
+
should only_have_problem({
|
9
|
+
:kind => :warning,
|
10
|
+
:message => 'string containing only a variable',
|
11
|
+
:linenumber => 1,
|
12
|
+
:column => 3,
|
13
|
+
})
|
14
|
+
}
|
15
|
+
end
|
16
|
+
end
|
@@ -0,0 +1,55 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
describe 'quoted_booleans' do
|
4
|
+
describe 'quoted false' do
|
5
|
+
let(:code) { "class { 'foo': boolFlag => 'false' }" }
|
6
|
+
|
7
|
+
its(:problems) {
|
8
|
+
should only_have_problem({
|
9
|
+
:kind => :warning,
|
10
|
+
:message => 'quoted boolean value found',
|
11
|
+
:linenumber => 1,
|
12
|
+
:column => 28,
|
13
|
+
})
|
14
|
+
}
|
15
|
+
end
|
16
|
+
|
17
|
+
describe 'quoted true' do
|
18
|
+
let(:code) { "class { 'foo': boolFlag => 'true' }" }
|
19
|
+
|
20
|
+
its(:problems) {
|
21
|
+
should only_have_problem({
|
22
|
+
:kind => :warning,
|
23
|
+
:message => 'quoted boolean value found',
|
24
|
+
:linenumber => 1,
|
25
|
+
:column => 28,
|
26
|
+
})
|
27
|
+
}
|
28
|
+
end
|
29
|
+
|
30
|
+
describe 'double quoted true' do
|
31
|
+
let(:code) { "class { 'foo': boolFlag => \"true\" }" }
|
32
|
+
|
33
|
+
its(:problems) {
|
34
|
+
should have_problem({
|
35
|
+
:kind => :warning,
|
36
|
+
:message => 'quoted boolean value found',
|
37
|
+
:linenumber => 1,
|
38
|
+
:column => 28,
|
39
|
+
})
|
40
|
+
}
|
41
|
+
end
|
42
|
+
|
43
|
+
describe 'double quoted false' do
|
44
|
+
let(:code) { "class { 'foo': boolFlag => \"false\" }" }
|
45
|
+
|
46
|
+
its(:problems) {
|
47
|
+
should have_problem({
|
48
|
+
:kind => :warning,
|
49
|
+
:message => 'quoted boolean value found',
|
50
|
+
:linenumber => 1,
|
51
|
+
:column => 28,
|
52
|
+
})
|
53
|
+
}
|
54
|
+
end
|
55
|
+
end
|
@@ -0,0 +1,16 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
describe 'single_quote_string_with_variables' do
|
4
|
+
describe 'multiple strings in a line' do
|
5
|
+
let(:code) { "\"aoeu\" '${foo}'" }
|
6
|
+
|
7
|
+
its(:problems) {
|
8
|
+
should have_problem({
|
9
|
+
:kind => :error,
|
10
|
+
:message => 'single quoted string containing a variable found',
|
11
|
+
:linenumber => 1,
|
12
|
+
:column => 8,
|
13
|
+
})
|
14
|
+
}
|
15
|
+
end
|
16
|
+
end
|