puppet-lint 2.3.0 → 2.3.1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (107) hide show
  1. checksums.yaml +4 -4
  2. data/.rubocop.yml +74 -0
  3. data/.rubocop_todo.yml +89 -0
  4. data/.travis.yml +11 -9
  5. data/CHANGELOG.md +54 -0
  6. data/Gemfile +3 -0
  7. data/Rakefile +14 -3
  8. data/appveyor.yml +1 -4
  9. data/bin/puppet-lint +1 -1
  10. data/lib/puppet-lint.rb +25 -21
  11. data/lib/puppet-lint/bin.rb +15 -19
  12. data/lib/puppet-lint/checkplugin.rb +24 -17
  13. data/lib/puppet-lint/checks.rb +42 -31
  14. data/lib/puppet-lint/configuration.rb +11 -8
  15. data/lib/puppet-lint/data.rb +236 -164
  16. data/lib/puppet-lint/lexer.rb +225 -203
  17. data/lib/puppet-lint/lexer/token.rb +34 -18
  18. data/lib/puppet-lint/optparser.rb +33 -30
  19. data/lib/puppet-lint/plugins.rb +42 -38
  20. data/lib/puppet-lint/plugins/check_classes/arrow_on_right_operand_line.rb +26 -28
  21. data/lib/puppet-lint/plugins/check_classes/autoloader_layout.rb +21 -20
  22. data/lib/puppet-lint/plugins/check_classes/class_inherits_from_params_class.rb +8 -9
  23. data/lib/puppet-lint/plugins/check_classes/code_on_top_scope.rb +9 -8
  24. data/lib/puppet-lint/plugins/check_classes/inherits_across_namespaces.rb +12 -11
  25. data/lib/puppet-lint/plugins/check_classes/names_containing_dash.rb +13 -12
  26. data/lib/puppet-lint/plugins/check_classes/names_containing_uppercase.rb +14 -13
  27. data/lib/puppet-lint/plugins/check_classes/nested_classes_or_defines.rb +9 -10
  28. data/lib/puppet-lint/plugins/check_classes/parameter_order.rb +40 -31
  29. data/lib/puppet-lint/plugins/check_classes/right_to_left_relationship.rb +3 -2
  30. data/lib/puppet-lint/plugins/check_classes/variable_scope.rb +21 -24
  31. data/lib/puppet-lint/plugins/check_comments/slash_comments.rb +3 -2
  32. data/lib/puppet-lint/plugins/check_comments/star_comments.rb +6 -5
  33. data/lib/puppet-lint/plugins/check_conditionals/case_without_default.rb +21 -20
  34. data/lib/puppet-lint/plugins/check_conditionals/selector_inside_resource.rb +10 -13
  35. data/lib/puppet-lint/plugins/check_documentation/documentation.rb +26 -17
  36. data/lib/puppet-lint/plugins/check_nodes/unquoted_node_name.rb +11 -11
  37. data/lib/puppet-lint/plugins/check_resources/duplicate_params.rb +4 -3
  38. data/lib/puppet-lint/plugins/check_resources/ensure_first_param.rb +17 -18
  39. data/lib/puppet-lint/plugins/check_resources/ensure_not_symlink_target.rb +17 -16
  40. data/lib/puppet-lint/plugins/check_resources/file_mode.rb +22 -23
  41. data/lib/puppet-lint/plugins/check_resources/unquoted_file_mode.rb +14 -13
  42. data/lib/puppet-lint/plugins/check_resources/unquoted_resource_title.rb +9 -8
  43. data/lib/puppet-lint/plugins/check_strings/double_quoted_strings.rb +8 -8
  44. data/lib/puppet-lint/plugins/check_strings/only_variable_string.rb +29 -42
  45. data/lib/puppet-lint/plugins/check_strings/puppet_url_without_modules.rb +5 -4
  46. data/lib/puppet-lint/plugins/check_strings/quoted_booleans.rb +3 -2
  47. data/lib/puppet-lint/plugins/check_strings/single_quote_string_with_variables.rb +4 -3
  48. data/lib/puppet-lint/plugins/check_strings/variables_not_enclosed.rb +3 -2
  49. data/lib/puppet-lint/plugins/check_variables/variable_contains_dash.rb +9 -8
  50. data/lib/puppet-lint/plugins/check_variables/variable_is_lowercase.rb +9 -8
  51. data/lib/puppet-lint/plugins/check_whitespace/140chars.rb +9 -9
  52. data/lib/puppet-lint/plugins/check_whitespace/2sp_soft_tabs.rb +4 -3
  53. data/lib/puppet-lint/plugins/check_whitespace/80chars.rb +10 -10
  54. data/lib/puppet-lint/plugins/check_whitespace/arrow_alignment.rb +23 -22
  55. data/lib/puppet-lint/plugins/check_whitespace/hard_tabs.rb +3 -2
  56. data/lib/puppet-lint/plugins/check_whitespace/trailing_whitespace.rb +3 -2
  57. data/lib/puppet-lint/tasks/puppet-lint.rb +3 -3
  58. data/lib/puppet-lint/version.rb +1 -1
  59. data/puppet-lint.gemspec +4 -4
  60. data/spec/puppet-lint/bin_spec.rb +268 -140
  61. data/spec/puppet-lint/checks_spec.rb +229 -0
  62. data/spec/puppet-lint/configuration_spec.rb +10 -9
  63. data/spec/puppet-lint/data_spec.rb +84 -0
  64. data/spec/puppet-lint/ignore_overrides_spec.rb +71 -40
  65. data/spec/puppet-lint/lexer/token_spec.rb +1 -1
  66. data/spec/puppet-lint/lexer_spec.rb +306 -73
  67. data/spec/puppet-lint/plugins/check_classes/arrow_on_right_operand_line_spec.rb +12 -6
  68. data/spec/puppet-lint/plugins/check_classes/autoloader_layout_spec.rb +10 -10
  69. data/spec/puppet-lint/plugins/check_classes/class_inherits_from_params_class_spec.rb +15 -11
  70. data/spec/puppet-lint/plugins/check_classes/code_on_top_scope_spec.rb +26 -21
  71. data/spec/puppet-lint/plugins/check_classes/inherits_across_namespaces_spec.rb +3 -3
  72. data/spec/puppet-lint/plugins/check_classes/name_contains_uppercase_spec.rb +4 -5
  73. data/spec/puppet-lint/plugins/check_classes/names_containing_dash_spec.rb +13 -0
  74. data/spec/puppet-lint/plugins/check_classes/nested_classes_or_defines_spec.rb +33 -25
  75. data/spec/puppet-lint/plugins/check_classes/parameter_order_spec.rb +80 -55
  76. data/spec/puppet-lint/plugins/check_classes/right_to_left_relationship_spec.rb +2 -2
  77. data/spec/puppet-lint/plugins/check_classes/variable_scope_spec.rb +165 -130
  78. data/spec/puppet-lint/plugins/check_comments/slash_comments_spec.rb +2 -2
  79. data/spec/puppet-lint/plugins/check_comments/star_comments_spec.rb +53 -35
  80. data/spec/puppet-lint/plugins/check_conditionals/case_without_default_spec.rb +59 -49
  81. data/spec/puppet-lint/plugins/check_conditionals/selector_inside_resource_spec.rb +18 -14
  82. data/spec/puppet-lint/plugins/check_documentation/documentation_spec.rb +14 -10
  83. data/spec/puppet-lint/plugins/check_nodes/unquoted_node_name_spec.rb +7 -7
  84. data/spec/puppet-lint/plugins/check_resources/duplicate_params_spec.rb +54 -44
  85. data/spec/puppet-lint/plugins/check_resources/ensure_first_param_spec.rb +114 -89
  86. data/spec/puppet-lint/plugins/check_resources/ensure_not_symlink_target_spec.rb +41 -30
  87. data/spec/puppet-lint/plugins/check_resources/file_mode_spec.rb +46 -40
  88. data/spec/puppet-lint/plugins/check_resources/unquoted_file_mode_spec.rb +46 -40
  89. data/spec/puppet-lint/plugins/check_resources/unquoted_resource_title_spec.rb +95 -71
  90. data/spec/puppet-lint/plugins/check_strings/double_quoted_strings_spec.rb +28 -24
  91. data/spec/puppet-lint/plugins/check_strings/only_variable_string_spec.rb +11 -9
  92. data/spec/puppet-lint/plugins/check_strings/puppet_url_without_modules_spec.rb +1 -2
  93. data/spec/puppet-lint/plugins/check_strings/single_quote_string_with_variables_spec.rb +18 -14
  94. data/spec/puppet-lint/plugins/check_variables/variable_contains_dash_spec.rb +1 -1
  95. data/spec/puppet-lint/plugins/check_variables/variable_is_lowercase_spec.rb +1 -1
  96. data/spec/puppet-lint/plugins/check_whitespace/140chars_spec.rb +22 -15
  97. data/spec/puppet-lint/plugins/check_whitespace/2sp_soft_tabs_spec.rb +8 -6
  98. data/spec/puppet-lint/plugins/check_whitespace/80chars_spec.rb +23 -29
  99. data/spec/puppet-lint/plugins/check_whitespace/arrow_alignment_spec.rb +588 -494
  100. data/spec/puppet-lint/plugins/check_whitespace/hard_tabs_spec.rb +1 -1
  101. data/spec/puppet-lint/plugins/check_whitespace/trailing_whitespace_spec.rb +27 -19
  102. data/spec/puppet-lint_spec.rb +2 -12
  103. data/spec/spec_helper.rb +35 -30
  104. metadata +6 -5
  105. data/lib/puppet-lint/monkeypatches.rb +0 -2
  106. data/lib/puppet-lint/monkeypatches/string_percent.rb +0 -52
  107. data/lib/puppet-lint/monkeypatches/string_prepend.rb +0 -13
@@ -0,0 +1,229 @@
1
+ require 'spec_helper'
2
+
3
+ describe PuppetLint::Checks do
4
+ subject(:instance) { described_class.new }
5
+
6
+ let(:path) { File.join('path', 'to', 'test.pp') }
7
+ let(:content) { "notify { 'test': }" }
8
+
9
+ describe '#initialize' do
10
+ it { is_expected.to have_attributes(:problems => []) }
11
+ end
12
+
13
+ describe '#load_data' do
14
+ let(:lexer) { PuppetLint::Lexer.new }
15
+
16
+ before do
17
+ allow(PuppetLint::Lexer).to receive(:new).and_return(lexer)
18
+ end
19
+
20
+ context 'when the tokeniser encounters an error' do
21
+ before do
22
+ allow(lexer).to receive(:tokenise).with(content).and_raise(lexer_error)
23
+ instance.load_data(path, content)
24
+ end
25
+
26
+ context 'and the reason for the error is unknown' do
27
+ let(:lexer_error) { PuppetLint::LexerError.new(1, 2) }
28
+
29
+ it 'stores an empty tokens array' do
30
+ expect(PuppetLint::Data.tokens).to be_empty
31
+ end
32
+
33
+ it 'creates a syntax error problem for the file' do
34
+ expect(instance.problems).to have(1).problem
35
+ expect(instance.problems.first).to include(
36
+ :kind => :error,
37
+ :check => :syntax,
38
+ :message => 'Syntax error',
39
+ :line => 1,
40
+ :column => 2,
41
+ :path => anything,
42
+ :fullpath => anything,
43
+ :filename => anything,
44
+ )
45
+ end
46
+ end
47
+
48
+ context 'and the reason for the error is known' do
49
+ let(:lexer_error) { PuppetLint::LexerError.new(1, 2, 'some reason') }
50
+
51
+ it 'stores an empty tokens array' do
52
+ expect(PuppetLint::Data.tokens).to be_empty
53
+ end
54
+
55
+ it 'creates a syntax error problem for the file' do
56
+ expect(instance.problems).to have(1).problem
57
+ expect(instance.problems.first).to include(
58
+ :kind => :error,
59
+ :check => :syntax,
60
+ :message => 'Syntax error (some reason)',
61
+ :line => 1,
62
+ :column => 2,
63
+ :path => anything,
64
+ :fullpath => anything,
65
+ :filename => anything,
66
+ )
67
+ end
68
+ end
69
+ end
70
+ end
71
+
72
+ describe '#run' do
73
+ let(:fileinfo) { File.join('path', 'to', 'test.pp') }
74
+ let(:data) { "notify { 'test': }" }
75
+ let(:enabled_checks) { [] }
76
+
77
+ before do
78
+ allow(instance).to receive(:enabled_checks).and_return(enabled_checks)
79
+ end
80
+
81
+ it 'loads the manifest data' do
82
+ expect(instance).to receive(:load_data).with(fileinfo, data).and_call_original
83
+ instance.run(fileinfo, data)
84
+ end
85
+
86
+ context 'when there are checks enabled' do
87
+ let(:enabled_checks) { [:arrow_alignment, :hard_tabs] }
88
+ let(:enabled_check_classes) { enabled_checks.map { |r| PuppetLint.configuration.check_object[r] } }
89
+ let(:disabled_checks) { PuppetLint.configuration.checks - enabled_checks }
90
+ let(:disabled_check_classes) { disabled_checks.map { |r| PuppetLint.configuration.check_object[r] } }
91
+
92
+ it 'runs the enabled checks' do
93
+ expect(enabled_check_classes).to all(receive(:new).and_call_original)
94
+
95
+ instance.run(fileinfo, data)
96
+ end
97
+
98
+ it 'does not run the disabled checks' do
99
+ # expect().to_not all(matcher) is not supported
100
+ disabled_check_classes.each do |check_class|
101
+ expect(check_class).to_not receive(:new)
102
+ end
103
+
104
+ instance.run(fileinfo, data)
105
+ end
106
+
107
+ context 'when a check finds a problem in the manifest' do
108
+ let(:arrow_alignment_check) { PuppetLint.configuration.check_object[:arrow_alignment] }
109
+ let(:hard_tabs_check) { PuppetLint.configuration.check_object[:hard_tabs] }
110
+ let(:mock_arrow_alignment) do
111
+ instance_double(
112
+ PuppetLint::CheckPlugin,
113
+ :run => [{ :kind => :error, :check => :arrow_alignment }],
114
+ :fix_problems => [{ :kind => :fixed, :check => :arrow_alignment }],
115
+ )
116
+ end
117
+ let(:mock_hard_tabs) do
118
+ instance_double(PuppetLint::CheckPlugin, :run => [], :fix_problems => [])
119
+ end
120
+ let(:fix_state) { false }
121
+
122
+ before(:each) do
123
+ allow(arrow_alignment_check).to receive(:new).and_return(mock_arrow_alignment)
124
+ allow(hard_tabs_check).to receive(:new).and_return(mock_hard_tabs)
125
+ allow(PuppetLint.configuration).to receive(:fix).and_return(fix_state)
126
+ instance.run(fileinfo, data)
127
+ end
128
+
129
+ it 'adds the found problems to the problems array' do
130
+ expect(instance).to have_attributes(:problems => [{ :kind => :error, :check => :arrow_alignment }])
131
+ end
132
+
133
+ context 'and fix is enabled' do
134
+ let(:fix_state) { true }
135
+
136
+ it 'calls #fix_problems on the check and adds the results to the problems array' do
137
+ expect(instance).to have_attributes(:problems => [{ :kind => :fixed, :check => :arrow_alignment }])
138
+ end
139
+ end
140
+ end
141
+ end
142
+
143
+ context 'when an unhandled exception is raised' do
144
+ before do
145
+ allow(instance).to receive(:load_data).with(fileinfo, data).and_raise(StandardError.new('test message'))
146
+ allow($stdout).to receive(:puts).with(anything)
147
+ end
148
+
149
+ it 'prints out information about the puppet-lint version and ruby environment' do
150
+ expected_info = [
151
+ "puppet-lint version: #{PuppetLint::VERSION}",
152
+ "ruby version: #{RUBY_VERSION}-p#{RUBY_PATCHLEVEL}",
153
+ "platform: #{RUBY_PLATFORM}",
154
+ ]
155
+ pattern = expected_info.map { |r| Regexp.escape(r) }.join('\s+')
156
+ expect($stdout).to receive(:puts).with(a_string_matching(%r{#{pattern}}m))
157
+
158
+ expect {
159
+ instance.run(fileinfo, data)
160
+ }.to raise_error(SystemExit) { |error|
161
+ expect(error.status).to eq(1)
162
+ }
163
+ end
164
+
165
+ it 'prints out the details of the exception raised' do
166
+ expect($stdout).to receive(:puts).with(a_string_matching(%r{error:\s+```\s+StandardError: test message.+```}m))
167
+
168
+ expect {
169
+ instance.run(fileinfo, data)
170
+ }.to raise_error(SystemExit) { |error|
171
+ expect(error.status).to eq(1)
172
+ }
173
+ end
174
+
175
+ context 'and the file being linted is readable' do
176
+ before do
177
+ allow(File).to receive(:readable?).with(fileinfo).and_return(true)
178
+ allow(File).to receive(:read).with(fileinfo).and_return(data)
179
+ end
180
+
181
+ it 'adds the contents of the file to the bug report' do
182
+ expect($stdout).to receive(:puts).with("file contents:\n```\n#{data}\n```")
183
+
184
+ expect {
185
+ instance.run(fileinfo, data)
186
+ }.to raise_error(SystemExit) { |error|
187
+ expect(error.status).to eq(1)
188
+ }
189
+ end
190
+ end
191
+ end
192
+ end
193
+
194
+ describe '#enabled_checks' do
195
+ subject(:enabled_checks) { instance.enabled_checks }
196
+
197
+ let(:expected_enabled_checks) { [:arrow_alignment, :trailing_whitespace] }
198
+
199
+ before do
200
+ PuppetLint.configuration.checks.each do |check|
201
+ allow(PuppetLint.configuration).to receive("#{check}_enabled?").and_return(expected_enabled_checks.include?(check))
202
+ end
203
+ end
204
+
205
+ it 'checks the configuration for each check to see if it is enabled' do
206
+ expect(enabled_checks.sort).to eq(expected_enabled_checks.sort)
207
+ end
208
+ end
209
+
210
+ describe '#manifest' do
211
+ subject(:manifest) { instance.manifest }
212
+
213
+ let(:tokens) do
214
+ [
215
+ instance_double(PuppetLint::Lexer::Token, :to_manifest => '1'),
216
+ instance_double(PuppetLint::Lexer::Token, :to_manifest => '2'),
217
+ instance_double(PuppetLint::Lexer::Token, :to_manifest => '3'),
218
+ ]
219
+ end
220
+
221
+ before do
222
+ allow(PuppetLint::Data).to receive(:tokens).and_return(tokens)
223
+ end
224
+
225
+ it 'reassembles the manifest from the tokens array' do
226
+ expect(manifest).to eq('123')
227
+ end
228
+ end
229
+ end
@@ -43,15 +43,16 @@ describe PuppetLint::Configuration do
43
43
  it 'should be able to set sane defaults' do
44
44
  subject.defaults
45
45
 
46
- expect(subject.settings).to eq({
47
- 'with_filename' => false,
46
+ expect(subject.settings).to eq(
47
+ 'with_filename' => false,
48
48
  'fail_on_warnings' => false,
49
- 'error_level' => :all,
50
- 'log_format' => '',
51
- 'with_context' => false,
52
- 'fix' => false,
53
- 'show_ignored' => false,
54
- 'json' => false,
55
- })
49
+ 'error_level' => :all,
50
+ 'log_format' => '',
51
+ 'with_context' => false,
52
+ 'fix' => false,
53
+ 'show_ignored' => false,
54
+ 'json' => false,
55
+ 'ignore_paths' => ['vendor/**/*.pp'],
56
+ )
56
57
  end
57
58
  end
@@ -0,0 +1,84 @@
1
+ require 'spec_helper'
2
+
3
+ describe PuppetLint::Data do
4
+ subject(:data) { PuppetLint::Data }
5
+ let(:lexer) { PuppetLint::Lexer.new }
6
+
7
+ describe '.insert' do
8
+ let(:manifest) { '$x = $a' }
9
+ let(:new_token) { PuppetLint::Lexer::Token.new(:PLUS, '+', 0, 0) }
10
+ let(:original_tokens) { lexer.tokenise(manifest) }
11
+ let(:tokens) { original_tokens.dup }
12
+ before do
13
+ data.tokens = tokens
14
+ data.insert(2, new_token)
15
+ end
16
+
17
+ it 'adds token at the given index' do
18
+ expect(data.tokens.map(&:to_manifest).join).to eq('$x += $a')
19
+ end
20
+
21
+ it 'sets the prev_token' do
22
+ expect(new_token.prev_token).to eq(original_tokens[1])
23
+ end
24
+
25
+ it 'sets the prev_code_token' do
26
+ expect(new_token.prev_code_token).to eq(original_tokens[0])
27
+ end
28
+
29
+ it 'sets the next_token' do
30
+ expect(new_token.next_token).to eq(original_tokens[2])
31
+ end
32
+
33
+ it 'sets the next_code_token' do
34
+ expect(new_token.next_code_token).to eq(original_tokens[2])
35
+ end
36
+
37
+ it 'updates the existing next_token' do
38
+ expect(tokens[1].next_token).to eq(new_token)
39
+ end
40
+
41
+ it 'updates the existing next_code_token' do
42
+ expect(tokens[0].next_code_token).to eq(new_token)
43
+ end
44
+
45
+ it 'updates the existing prev_token' do
46
+ expect(tokens[3].prev_token).to eq(new_token)
47
+ end
48
+
49
+ it 'updates the existing prev_code_token' do
50
+ expect(tokens[3].prev_code_token).to eq(new_token)
51
+ end
52
+ end
53
+
54
+ describe '.delete' do
55
+ let(:manifest) { '$x + = $a' }
56
+ let(:token) { tokens[2] }
57
+ let(:original_tokens) { lexer.tokenise(manifest) }
58
+ let(:tokens) { original_tokens.dup }
59
+ before do
60
+ data.tokens = tokens
61
+ data.delete(token)
62
+ end
63
+
64
+ it 'removes the token' do
65
+ expect(data.tokens.map(&:to_manifest).join).to eq('$x = $a')
66
+ end
67
+
68
+ it 'updates the existing next_token' do
69
+ expect(tokens[1].next_token).to eq(original_tokens[3])
70
+ end
71
+
72
+ it 'updates the existing next_code_token' do
73
+ expect(tokens[0].next_code_token).to eq(original_tokens[4])
74
+ end
75
+
76
+ it 'updates the existing prev_token' do
77
+ expect(tokens[2].prev_token).to eq(original_tokens[1])
78
+ end
79
+
80
+ it 'updates the existing prev_code_token' do
81
+ expect(tokens[3].prev_code_token).to eq(original_tokens[0])
82
+ end
83
+ end
84
+ end
@@ -4,94 +4,102 @@ describe 'quoted_booleans', :type => :lint do
4
4
  let(:msg) { 'quoted boolean value found' }
5
5
 
6
6
  context 'with a single line ignore' do
7
- let(:code) { "
8
- 'true'
9
- 'true' # lint:ignore:quoted_booleans
10
- 'false'
11
- " }
7
+ let(:code) do
8
+ <<-END
9
+ 'true'
10
+ 'true' # lint:ignore:quoted_booleans
11
+ 'false'
12
+ END
13
+ end
12
14
 
13
15
  it 'should detect three problems' do
14
16
  expect(problems).to have(3).problems
15
17
  end
16
18
 
17
19
  it 'should have two warnings' do
18
- expect(problems).to contain_warning(msg).on_line(2).in_column(7)
19
- expect(problems).to contain_warning(msg).on_line(4).in_column(7)
20
+ expect(problems).to contain_warning(msg).on_line(1).in_column(9)
21
+ expect(problems).to contain_warning(msg).on_line(3).in_column(9)
20
22
  end
21
23
 
22
24
  it 'should have one ignored problem' do
23
- expect(problems).to contain_ignored(msg).on_line(3).in_column(7)
25
+ expect(problems).to contain_ignored(msg).on_line(2).in_column(9)
24
26
  end
25
27
  end
26
28
 
27
29
  context 'with a single line ignore and a reason' do
28
- let(:code) { "
29
- 'true'
30
- 'true' # lint:ignore:quoted_booleans some good reason
31
- 'false'
32
- " }
30
+ let(:code) do
31
+ <<-END
32
+ 'true'
33
+ 'true' # lint:ignore:quoted_booleans some good reason
34
+ 'false'
35
+ END
36
+ end
33
37
 
34
38
  it 'should detect three problems' do
35
39
  expect(problems).to have(3).problems
36
40
  end
37
41
 
38
42
  it 'should have two warnings' do
39
- expect(problems).to contain_warning(msg).on_line(2).in_column(7)
40
- expect(problems).to contain_warning(msg).on_line(4).in_column(7)
43
+ expect(problems).to contain_warning(msg).on_line(1).in_column(9)
44
+ expect(problems).to contain_warning(msg).on_line(3).in_column(9)
41
45
  end
42
46
 
43
47
  it 'should have one ignored problem with a reason' do
44
- expect(problems).to contain_ignored(msg).on_line(3).in_column(7).with_reason('some good reason')
48
+ expect(problems).to contain_ignored(msg).on_line(2).in_column(9).with_reason('some good reason')
45
49
  end
46
50
  end
47
51
 
48
52
  context 'with a block ignore' do
49
- let(:code) { "
50
- 'true'
51
- # lint:ignore:quoted_booleans
52
- 'false'
53
- 'true'
54
- # lint:endignore
55
- 'true'
56
- " }
53
+ let(:code) do
54
+ <<-END
55
+ 'true'
56
+ # lint:ignore:quoted_booleans
57
+ 'false'
58
+ 'true'
59
+ # lint:endignore
60
+ 'true'
61
+ END
62
+ end
57
63
 
58
64
  it 'should detect four problems' do
59
65
  expect(problems).to have(4).problems
60
66
  end
61
67
 
62
68
  it 'should have two warnings' do
63
- expect(problems).to contain_warning(msg).on_line(2).in_column(7)
64
- expect(problems).to contain_warning(msg).on_line(7).in_column(7)
69
+ expect(problems).to contain_warning(msg).on_line(1).in_column(9)
70
+ expect(problems).to contain_warning(msg).on_line(6).in_column(9)
65
71
  end
66
72
 
67
73
  it 'should have two ignored problems' do
68
- expect(problems).to contain_ignored(msg).on_line(4).in_column(7)
69
- expect(problems).to contain_ignored(msg).on_line(5).in_column(7)
74
+ expect(problems).to contain_ignored(msg).on_line(3).in_column(9)
75
+ expect(problems).to contain_ignored(msg).on_line(4).in_column(9)
70
76
  end
71
77
  end
72
78
 
73
79
  context 'with a block ignore and a reason' do
74
- let(:code) { "
75
- 'true'
76
- # lint:ignore:quoted_booleans another reason
77
- 'false'
78
- 'true'
79
- # lint:endignore
80
- 'true'
81
- " }
80
+ let(:code) do
81
+ <<-END
82
+ 'true'
83
+ # lint:ignore:quoted_booleans another reason
84
+ 'false'
85
+ 'true'
86
+ # lint:endignore
87
+ 'true'
88
+ END
89
+ end
82
90
 
83
91
  it 'should detect four problems' do
84
92
  expect(problems).to have(4).problems
85
93
  end
86
94
 
87
95
  it 'should have two warnings' do
88
- expect(problems).to contain_warning(msg).on_line(2).in_column(7)
89
- expect(problems).to contain_warning(msg).on_line(7).in_column(7)
96
+ expect(problems).to contain_warning(msg).on_line(1).in_column(9)
97
+ expect(problems).to contain_warning(msg).on_line(6).in_column(9)
90
98
  end
91
99
 
92
100
  it 'should have two ignored problems with a reason' do
93
- expect(problems).to contain_ignored(msg).on_line(4).in_column(7).with_reason('another reason')
94
- expect(problems).to contain_ignored(msg).on_line(5).in_column(7).with_reason('another reason')
101
+ expect(problems).to contain_ignored(msg).on_line(3).in_column(9).with_reason('another reason')
102
+ expect(problems).to contain_ignored(msg).on_line(4).in_column(9).with_reason('another reason')
95
103
  end
96
104
  end
97
105
 
@@ -106,4 +114,27 @@ describe 'quoted_booleans', :type => :lint do
106
114
  expect(problems).to contain_ignored(msg).on_line(1).in_column(1).with_reason('a reason')
107
115
  end
108
116
  end
117
+
118
+ context 'disable multiple checks in a block' do
119
+ let(:code) do
120
+ <<-END
121
+
122
+ # lint:ignore:double_quoted_string lint:ignore:quoted_booleans lint:ignore:arrow_alignment
123
+ foo { "bar":
124
+ test => 'true',
125
+ other_test => 'false',
126
+ }
127
+ # lint:endignore
128
+ END
129
+ end
130
+
131
+ it 'should detect 2 problems' do
132
+ expect(problems).to have(2).problems
133
+ end
134
+
135
+ it 'should ignore both problems' do
136
+ expect(problems).to contain_ignored(msg).on_line(4).in_column(19).with_reason('')
137
+ expect(problems).to contain_ignored(msg).on_line(5).in_column(25).with_reason('')
138
+ end
139
+ end
109
140
  end