rubocop 0.19.1 → 0.20.0

Sign up to get free protection for your applications and to get access to all the features.

Potentially problematic release.


This version of rubocop might be problematic. Click here for more details.

Files changed (192) hide show
  1. checksums.yaml +4 -4
  2. data/.travis.yml +4 -0
  3. data/CHANGELOG.md +60 -1
  4. data/CONTRIBUTING.md +2 -1
  5. data/README.md +9 -7
  6. data/config/default.yml +3 -3
  7. data/config/disabled.yml +4 -0
  8. data/config/enabled.yml +45 -21
  9. data/lib/rubocop.rb +30 -9
  10. data/lib/rubocop/cli.rb +1 -1
  11. data/lib/rubocop/comment_config.rb +4 -2
  12. data/lib/rubocop/config.rb +16 -22
  13. data/lib/rubocop/config_loader.rb +29 -26
  14. data/lib/rubocop/cop/commissioner.rb +1 -1
  15. data/lib/rubocop/cop/cop.rb +6 -6
  16. data/lib/rubocop/cop/lint/assignment_in_condition.rb +1 -1
  17. data/lib/rubocop/cop/lint/condition_position.rb +1 -1
  18. data/lib/rubocop/cop/lint/debugger.rb +1 -1
  19. data/lib/rubocop/cop/lint/deprecated_class_methods.rb +9 -7
  20. data/lib/rubocop/cop/lint/else_layout.rb +1 -1
  21. data/lib/rubocop/cop/lint/empty_ensure.rb +1 -1
  22. data/lib/rubocop/cop/lint/empty_interpolation.rb +22 -0
  23. data/lib/rubocop/cop/lint/end_in_method.rb +1 -1
  24. data/lib/rubocop/cop/lint/ensure_return.rb +1 -1
  25. data/lib/rubocop/cop/lint/eval.rb +1 -1
  26. data/lib/rubocop/cop/lint/literal_in_condition.rb +2 -2
  27. data/lib/rubocop/cop/lint/literal_in_interpolation.rb +9 -0
  28. data/lib/rubocop/cop/lint/loop.rb +2 -2
  29. data/lib/rubocop/cop/lint/require_parentheses.rb +0 -4
  30. data/lib/rubocop/cop/lint/rescue_exception.rb +1 -1
  31. data/lib/rubocop/cop/lint/shadowing_outer_local_variable.rb +1 -1
  32. data/lib/rubocop/cop/lint/space_before_first_arg.rb +36 -0
  33. data/lib/rubocop/cop/lint/string_conversion_in_interpolation.rb +14 -2
  34. data/lib/rubocop/cop/lint/useless_access_modifier.rb +57 -0
  35. data/lib/rubocop/cop/lint/useless_setter_call.rb +1 -1
  36. data/lib/rubocop/cop/lint/void.rb +3 -3
  37. data/lib/rubocop/cop/mixin/space_after_punctuation.rb +1 -1
  38. data/lib/rubocop/cop/offense.rb +3 -21
  39. data/lib/rubocop/cop/rails/action_filter.rb +1 -1
  40. data/lib/rubocop/cop/rails/default_scope.rb +1 -1
  41. data/lib/rubocop/cop/rails/has_and_belongs_to_many.rb +1 -1
  42. data/lib/rubocop/cop/rails/read_write_attribute.rb +43 -0
  43. data/lib/rubocop/cop/rails/scope_args.rb +1 -1
  44. data/lib/rubocop/cop/rails/validation.rb +1 -1
  45. data/lib/rubocop/cop/severity.rb +76 -0
  46. data/lib/rubocop/cop/style/access_modifier_indentation.rb +1 -1
  47. data/lib/rubocop/cop/style/accessor_method_name.rb +2 -2
  48. data/lib/rubocop/cop/style/alias.rb +1 -1
  49. data/lib/rubocop/cop/style/align_hash.rb +1 -1
  50. data/lib/rubocop/cop/style/and_or.rb +1 -1
  51. data/lib/rubocop/cop/style/{favor_join.rb → array_join.rb} +2 -2
  52. data/lib/rubocop/cop/style/begin_block.rb +1 -1
  53. data/lib/rubocop/cop/style/block_nesting.rb +12 -8
  54. data/lib/rubocop/cop/style/braces_around_hash_parameters.rb +1 -1
  55. data/lib/rubocop/cop/style/case_equality.rb +1 -1
  56. data/lib/rubocop/cop/style/case_indentation.rb +5 -5
  57. data/lib/rubocop/cop/style/class_methods.rb +19 -3
  58. data/lib/rubocop/cop/style/class_vars.rb +1 -1
  59. data/lib/rubocop/cop/style/collection_methods.rb +17 -7
  60. data/lib/rubocop/cop/style/colon_method_call.rb +1 -1
  61. data/lib/rubocop/cop/style/{def_parentheses.rb → def_with_parentheses.rb} +0 -0
  62. data/lib/rubocop/cop/style/{hash_methods.rb → deprecated_hash_methods.rb} +5 -4
  63. data/lib/rubocop/cop/style/double_negation.rb +1 -1
  64. data/lib/rubocop/cop/style/empty_lines_around_access_modifier.rb +1 -1
  65. data/lib/rubocop/cop/style/end_block.rb +1 -1
  66. data/lib/rubocop/cop/style/even_odd.rb +2 -2
  67. data/lib/rubocop/cop/style/file_name.rb +1 -1
  68. data/lib/rubocop/cop/style/for.rb +2 -2
  69. data/lib/rubocop/cop/style/format_string.rb +1 -1
  70. data/lib/rubocop/cop/style/guard_clause.rb +69 -0
  71. data/lib/rubocop/cop/style/hash_syntax.rb +6 -10
  72. data/lib/rubocop/cop/style/if_unless_modifier.rb +2 -2
  73. data/lib/rubocop/cop/style/lambda.rb +2 -2
  74. data/lib/rubocop/cop/style/line_end_concatenation.rb +16 -9
  75. data/lib/rubocop/cop/style/multiline_if_then.rb +1 -1
  76. data/lib/rubocop/cop/style/multiline_ternary_operator.rb +2 -2
  77. data/lib/rubocop/cop/style/negated_if.rb +37 -0
  78. data/lib/rubocop/cop/style/negated_while.rb +33 -0
  79. data/lib/rubocop/cop/style/nested_ternary_operator.rb +1 -1
  80. data/lib/rubocop/cop/style/nil_comparison.rb +14 -10
  81. data/lib/rubocop/cop/style/non_nil_check.rb +70 -0
  82. data/lib/rubocop/cop/style/not.rb +25 -1
  83. data/lib/rubocop/cop/style/numeric_literals.rb +1 -1
  84. data/lib/rubocop/cop/style/op_method.rb +4 -4
  85. data/lib/rubocop/cop/style/parentheses_around_condition.rb +1 -1
  86. data/lib/rubocop/cop/style/predicate_name.rb +1 -1
  87. data/lib/rubocop/cop/style/proc.rb +1 -1
  88. data/lib/rubocop/cop/style/raise_args.rb +3 -2
  89. data/lib/rubocop/cop/style/rescue_modifier.rb +1 -1
  90. data/lib/rubocop/cop/style/self_assignment.rb +2 -2
  91. data/lib/rubocop/cop/style/signal_exception.rb +6 -3
  92. data/lib/rubocop/cop/style/single_line_block_params.rb +1 -1
  93. data/lib/rubocop/cop/style/single_line_methods.rb +6 -5
  94. data/lib/rubocop/cop/style/single_space_before_first_arg.rb +41 -0
  95. data/lib/rubocop/cop/style/space_around_operators.rb +1 -2
  96. data/lib/rubocop/cop/style/special_global_vars.rb +8 -8
  97. data/lib/rubocop/cop/style/trailing_comma.rb +1 -1
  98. data/lib/rubocop/cop/style/trivial_accessors.rb +1 -1
  99. data/lib/rubocop/cop/style/unless_else.rb +1 -1
  100. data/lib/rubocop/cop/style/variable_interpolation.rb +10 -5
  101. data/lib/rubocop/cop/style/when_then.rb +1 -1
  102. data/lib/rubocop/cop/style/while_until_modifier.rb +1 -1
  103. data/lib/rubocop/cop/style/word_array.rb +1 -1
  104. data/lib/rubocop/cop/team.rb +12 -13
  105. data/lib/rubocop/cop/util.rb +4 -0
  106. data/lib/rubocop/cop/variable_inspector/locatable.rb +1 -1
  107. data/lib/rubocop/cop/variable_inspector/variable_table.rb +1 -1
  108. data/lib/rubocop/file_inspector.rb +46 -10
  109. data/lib/rubocop/formatter/disabled_config_formatter.rb +1 -1
  110. data/lib/rubocop/formatter/disabled_lines_formatter.rb +56 -0
  111. data/lib/rubocop/formatter/emacs_style_formatter.rb +1 -1
  112. data/lib/rubocop/formatter/formatter_set.rb +2 -1
  113. data/lib/rubocop/formatter/fuubar_style_formatter.rb +2 -4
  114. data/lib/rubocop/formatter/json_formatter.rb +3 -7
  115. data/lib/rubocop/formatter/progress_formatter.rb +1 -3
  116. data/lib/rubocop/formatter/simple_text_formatter.rb +7 -3
  117. data/lib/rubocop/options.rb +29 -10
  118. data/lib/rubocop/path_util.rb +2 -1
  119. data/lib/rubocop/processed_source.rb +8 -0
  120. data/lib/rubocop/target_finder.rb +33 -12
  121. data/lib/rubocop/version.rb +1 -1
  122. data/relnotes/v0.20.0.md +69 -0
  123. data/rubocop-todo.yml +2 -2
  124. data/spec/rubocop/cli_spec.rb +269 -94
  125. data/spec/rubocop/config_loader_spec.rb +14 -14
  126. data/spec/rubocop/config_spec.rb +8 -8
  127. data/spec/rubocop/cop/lint/deprecated_class_methods_spec.rb +11 -6
  128. data/spec/rubocop/cop/lint/empty_interpolation_spec.rb +18 -0
  129. data/spec/rubocop/cop/lint/eval_spec.rb +2 -4
  130. data/spec/rubocop/cop/lint/literal_in_interpolation_spec.rb +10 -0
  131. data/spec/rubocop/cop/lint/rescue_exception_spec.rb +0 -8
  132. data/spec/rubocop/cop/lint/shadowing_outer_local_variable_spec.rb +4 -4
  133. data/spec/rubocop/cop/lint/space_before_first_arg_spec.rb +48 -0
  134. data/spec/rubocop/cop/lint/string_conversion_in_interpolation_spec.rb +10 -0
  135. data/spec/rubocop/cop/lint/useless_access_modifier_spec.rb +154 -0
  136. data/spec/rubocop/cop/offense_spec.rb +1 -1
  137. data/spec/rubocop/cop/rails/read_write_attribute_spec.rb +19 -0
  138. data/spec/rubocop/cop/severity_spec.rb +113 -0
  139. data/spec/rubocop/cop/style/access_modifier_indentation_spec.rb +10 -10
  140. data/spec/rubocop/cop/style/alias_spec.rb +2 -2
  141. data/spec/rubocop/cop/style/and_or_spec.rb +2 -2
  142. data/spec/rubocop/cop/style/{favor_join_spec.rb → array_join_spec.rb} +1 -3
  143. data/spec/rubocop/cop/style/block_nesting_spec.rb +4 -4
  144. data/spec/rubocop/cop/style/case_equality_spec.rb +1 -0
  145. data/spec/rubocop/cop/style/case_indentation_spec.rb +12 -9
  146. data/spec/rubocop/cop/style/class_methods_spec.rb +23 -0
  147. data/spec/rubocop/cop/style/collection_methods_spec.rb +2 -2
  148. data/spec/rubocop/cop/style/{hash_methods_spec.rb → deprecated_hash_methods_spec.rb} +3 -3
  149. data/spec/rubocop/cop/style/empty_lines_around_access_modifier_spec.rb +2 -2
  150. data/spec/rubocop/cop/style/even_odd_spec.rb +8 -8
  151. data/spec/rubocop/cop/style/file_name_spec.rb +55 -42
  152. data/spec/rubocop/cop/style/for_spec.rb +4 -4
  153. data/spec/rubocop/cop/style/format_string_spec.rb +10 -10
  154. data/spec/rubocop/cop/style/guard_clause_spec.rb +77 -0
  155. data/spec/rubocop/cop/style/hash_syntax_spec.rb +4 -2
  156. data/spec/rubocop/cop/style/if_unless_modifier_spec.rb +4 -4
  157. data/spec/rubocop/cop/style/lambda_spec.rb +2 -2
  158. data/spec/rubocop/cop/style/line_end_concatenation_spec.rb +21 -0
  159. data/spec/rubocop/cop/style/multiline_if_then_spec.rb +1 -1
  160. data/spec/rubocop/cop/style/{favor_unless_over_negated_if_spec.rb → negated_if_spec.rb} +8 -3
  161. data/spec/rubocop/cop/style/{favor_until_over_negated_while_spec.rb → negated_while_spec.rb} +8 -3
  162. data/spec/rubocop/cop/style/nil_comparison_spec.rb +7 -13
  163. data/spec/rubocop/cop/style/non_nil_check_spec.rb +35 -0
  164. data/spec/rubocop/cop/style/not_spec.rb +11 -0
  165. data/spec/rubocop/cop/style/numeric_literals_spec.rb +0 -2
  166. data/spec/rubocop/cop/style/op_method_spec.rb +10 -2
  167. data/spec/rubocop/cop/style/parentheses_around_condition_spec.rb +2 -2
  168. data/spec/rubocop/cop/style/predicate_name_spec.rb +2 -1
  169. data/spec/rubocop/cop/style/raise_args_spec.rb +5 -0
  170. data/spec/rubocop/cop/style/rescue_modifier_spec.rb +2 -2
  171. data/spec/rubocop/cop/style/self_assignment_spec.rb +4 -4
  172. data/spec/rubocop/cop/style/signal_exception_spec.rb +24 -0
  173. data/spec/rubocop/cop/style/single_line_block_params_spec.rb +2 -0
  174. data/spec/rubocop/cop/style/single_space_before_first_arg_spec.rb +63 -0
  175. data/spec/rubocop/cop/style/special_global_vars_spec.rb +6 -5
  176. data/spec/rubocop/cop/style/trivial_accessors_spec.rb +6 -3
  177. data/spec/rubocop/cop/style/unless_else_spec.rb +2 -4
  178. data/spec/rubocop/cop/style/variable_interpolation_spec.rb +15 -6
  179. data/spec/rubocop/cop/style/when_then_spec.rb +3 -4
  180. data/spec/rubocop/cop/team_spec.rb +4 -18
  181. data/spec/rubocop/file_inspector_spec.rb +4 -0
  182. data/spec/rubocop/formatter/disabled_config_formatter_spec.rb +1 -1
  183. data/spec/rubocop/formatter/disabled_lines_formatter_spec.rb +69 -0
  184. data/spec/rubocop/options_spec.rb +5 -0
  185. data/spec/rubocop/target_finder_spec.rb +42 -11
  186. data/spec/support/shared_context.rb +1 -1
  187. data/spec/support/statement_modifier_helper.rb +1 -1
  188. metadata +75 -50
  189. data/lib/rubocop/cop/rails/read_attribute.rb +0 -28
  190. data/lib/rubocop/cop/style/favor_unless_over_negated_if.rb +0 -24
  191. data/lib/rubocop/cop/style/favor_until_over_negated_while.rb +0 -20
  192. data/spec/rubocop/cop/rails/read_attribute_spec.rb +0 -13
@@ -85,18 +85,18 @@ describe Rubocop::ConfigLoader do
85
85
  before do
86
86
  create_file('.rubocop.yml',
87
87
  ['AllCops:',
88
- ' Excludes:',
88
+ ' Exclude:',
89
89
  ' - vendor/**'
90
90
  ])
91
91
 
92
92
  create_file(file_path,
93
93
  ['AllCops:',
94
- ' Excludes: []'
94
+ ' Exclude: []'
95
95
  ])
96
96
  end
97
97
 
98
- it 'gets AllCops/Excludes from the highest directory level' do
99
- excludes = configuration_from_file['AllCops']['Excludes']
98
+ it 'gets AllCops/Exclude from the highest directory level' do
99
+ excludes = configuration_from_file['AllCops']['Exclude']
100
100
  expect(excludes).to eq([File.expand_path('vendor/**')])
101
101
  end
102
102
  end
@@ -107,7 +107,7 @@ describe Rubocop::ConfigLoader do
107
107
  before do
108
108
  create_file('.rubocop.yml',
109
109
  ['AllCops:',
110
- ' Excludes:',
110
+ ' Exclude:',
111
111
  ' - vendor/**',
112
112
  ' - !ruby/regexp /[A-Z]/'
113
113
  ])
@@ -115,8 +115,8 @@ describe Rubocop::ConfigLoader do
115
115
  create_file(file_path, ['inherit_from: ../.rubocop.yml'])
116
116
  end
117
117
 
118
- it 'gets an absolute AllCops/Excludes' do
119
- excludes = configuration_from_file['AllCops']['Excludes']
118
+ it 'gets an absolute AllCops/Exclude' do
119
+ excludes = configuration_from_file['AllCops']['Exclude']
120
120
  expect(excludes).to eq([File.expand_path('vendor/**'), /[A-Z]/])
121
121
  end
122
122
  end
@@ -141,7 +141,7 @@ describe Rubocop::ConfigLoader do
141
141
  before do
142
142
  create_file('src/.rubocop.yml',
143
143
  ['AllCops:',
144
- ' Excludes:',
144
+ ' Exclude:',
145
145
  ' - vendor/**'
146
146
  ])
147
147
 
@@ -149,7 +149,7 @@ describe Rubocop::ConfigLoader do
149
149
  end
150
150
 
151
151
  it 'gets an absolute AllCops/Exclude' do
152
- excludes = configuration_from_file['AllCops']['Excludes']
152
+ excludes = configuration_from_file['AllCops']['Exclude']
153
153
  expect(excludes).to eq([File.expand_path('src/vendor/**')])
154
154
  end
155
155
  end
@@ -266,19 +266,19 @@ describe Rubocop::ConfigLoader do
266
266
  let(:base) do
267
267
  {
268
268
  'AllCops' => {
269
- 'Includes' => ['**/*.gemspec', '**/Rakefile'],
270
- 'Excludes' => []
269
+ 'Include' => ['**/*.gemspec', '**/Rakefile'],
270
+ 'Exclude' => []
271
271
  }
272
272
  }
273
273
  end
274
274
  let(:derived) do
275
- { 'AllCops' => { 'Excludes' => ['example.rb', 'exclude_*'] } }
275
+ { 'AllCops' => { 'Exclude' => ['example.rb', 'exclude_*'] } }
276
276
  end
277
277
 
278
278
  it 'returns a recursive merge of its two arguments' do
279
279
  expect(merge).to eq('AllCops' => {
280
- 'Includes' => ['**/*.gemspec', '**/Rakefile'],
281
- 'Excludes' => ['example.rb', 'exclude_*']
280
+ 'Include' => ['**/*.gemspec', '**/Rakefile'],
281
+ 'Exclude' => ['example.rb', 'exclude_*']
282
282
  })
283
283
  end
284
284
  end
@@ -78,7 +78,7 @@ describe Rubocop::Config do
78
78
  let(:hash) do
79
79
  {
80
80
  'AllCops' => {
81
- 'Includes' => ['Gemfile', 'config/unicorn.rb.example']
81
+ 'Include' => ['Gemfile', 'config/unicorn.rb.example']
82
82
  }
83
83
  }
84
84
  end
@@ -104,7 +104,7 @@ describe Rubocop::Config do
104
104
  let(:hash) do
105
105
  {
106
106
  'AllCops' => {
107
- 'Excludes' => ['/home/foo/project/log/*']
107
+ 'Exclude' => ['/home/foo/project/log/*']
108
108
  }
109
109
  }
110
110
  end
@@ -135,16 +135,16 @@ describe Rubocop::Config do
135
135
  let(:hash) { {} }
136
136
  let(:loaded_path) { 'example/.rubocop.yml' }
137
137
 
138
- context 'when config file has AllCops => Includes key' do
138
+ context 'when config file has AllCops => Include key' do
139
139
  let(:hash) do
140
140
  {
141
141
  'AllCops' => {
142
- 'Includes' => ['Gemfile', 'config/unicorn.rb.example']
142
+ 'Include' => ['Gemfile', 'config/unicorn.rb.example']
143
143
  }
144
144
  }
145
145
  end
146
146
 
147
- it 'returns the Includes value' do
147
+ it 'returns the Include value' do
148
148
  expect(patterns_to_include).to eq([
149
149
  'Gemfile',
150
150
  'config/unicorn.rb.example'
@@ -162,16 +162,16 @@ describe Rubocop::Config do
162
162
  let(:hash) { {} }
163
163
  let(:loaded_path) { 'example/.rubocop.yml' }
164
164
 
165
- context 'when config file has AllCops => Excludes key' do
165
+ context 'when config file has AllCops => Exclude key' do
166
166
  let(:hash) do
167
167
  {
168
168
  'AllCops' => {
169
- 'Excludes' => ['log/*']
169
+ 'Exclude' => ['log/*']
170
170
  }
171
171
  }
172
172
  end
173
173
 
174
- it 'returns the Excludes value' do
174
+ it 'returns the Exclude value' do
175
175
  expect(patterns_to_exclude).to eq(['log/*'])
176
176
  end
177
177
  end
@@ -6,19 +6,24 @@ describe Rubocop::Cop::Lint::DeprecatedClassMethods do
6
6
  subject(:cop) { described_class.new }
7
7
 
8
8
  it 'registers an offense for File.exists?' do
9
- inspect_source(cop,
10
- ['File.exists?(o)'])
9
+ inspect_source(cop, 'File.exists?(o)')
11
10
  expect(cop.offenses.size).to eq(1)
12
11
  expect(cop.messages)
13
- .to eq(['File.exists? is deprecated in favor of File.exist?.'])
12
+ .to eq(['`File.exists?` is deprecated in favor of `File.exist?`.'])
13
+ end
14
+
15
+ it 'registers an offense for ::File.exists?' do
16
+ inspect_source(cop, '::File.exists?(o)')
17
+ expect(cop.offenses.size).to eq(1)
18
+ expect(cop.messages)
19
+ .to eq(['`File.exists?` is deprecated in favor of `File.exist?`.'])
14
20
  end
15
21
 
16
22
  it 'registers an offense for Dir.exists?' do
17
- inspect_source(cop,
18
- ['Dir.exists?(o)'])
23
+ inspect_source(cop, 'Dir.exists?(o)')
19
24
  expect(cop.offenses.size).to eq(1)
20
25
  expect(cop.messages)
21
- .to eq(['Dir.exists? is deprecated in favor of Dir.exist?.'])
26
+ .to eq(['`Dir.exists?` is deprecated in favor of `Dir.exist?`.'])
22
27
  end
23
28
 
24
29
  it 'auto-corrects File.exists? with File.exist?' do
@@ -0,0 +1,18 @@
1
+ # encoding: utf-8
2
+
3
+ require 'spec_helper'
4
+
5
+ describe Rubocop::Cop::Lint::EmptyInterpolation do
6
+ subject(:cop) { described_class.new }
7
+
8
+ it 'registers an offense for #{} in interpolation' do
9
+ inspect_source(cop, ['"this is the #{}"'])
10
+ expect(cop.offenses.size).to eq(1)
11
+ expect(cop.highlights).to eq(['#{}'])
12
+ end
13
+
14
+ it 'accepts non-empty interpolation' do
15
+ inspect_source(cop, '"this is #{top} silly"')
16
+ expect(cop.offenses).to be_empty
17
+ end
18
+ end
@@ -9,16 +9,14 @@ describe Rubocop::Cop::Lint::Eval do
9
9
  inspect_source(cop,
10
10
  ['eval(something)'])
11
11
  expect(cop.offenses.size).to eq(1)
12
- expect(cop.messages)
13
- .to eq(['The use of eval is a serious security risk.'])
12
+ expect(cop.highlights) .to eq(['eval'])
14
13
  end
15
14
 
16
15
  it 'registers an offense for eval as command' do
17
16
  inspect_source(cop,
18
17
  ['eval something'])
19
18
  expect(cop.offenses.size).to eq(1)
20
- expect(cop.messages)
21
- .to eq(['The use of eval is a serious security risk.'])
19
+ expect(cop.highlights) .to eq(['eval'])
22
20
  end
23
21
 
24
22
  it 'does not register an offense for eval as variable' do
@@ -18,4 +18,14 @@ describe Rubocop::Cop::Lint::LiteralInInterpolation do
18
18
  expect(cop.offenses.size).to eq(1)
19
19
  end
20
20
  end
21
+
22
+ it 'accepts empty interpolation' do
23
+ inspect_source(cop, '"this is #{} silly"')
24
+ expect(cop.offenses).to be_empty
25
+ end
26
+
27
+ it 'accepts strings like __FILE__' do
28
+ inspect_source(cop, '"this is #{__FILE__} silly"')
29
+ expect(cop.offenses).to be_empty
30
+ end
21
31
  end
@@ -13,8 +13,6 @@ describe Rubocop::Cop::Lint::RescueException do
13
13
  ' #do nothing',
14
14
  'end'])
15
15
  expect(cop.offenses.size).to eq(1)
16
- expect(cop.messages)
17
- .to eq(['Avoid rescuing the Exception class.'])
18
16
  end
19
17
 
20
18
  it 'registers an offense for rescue with ::Exception' do
@@ -25,8 +23,6 @@ describe Rubocop::Cop::Lint::RescueException do
25
23
  ' #do nothing',
26
24
  'end'])
27
25
  expect(cop.offenses.size).to eq(1)
28
- expect(cop.messages)
29
- .to eq(['Avoid rescuing the Exception class.'])
30
26
  end
31
27
 
32
28
  it 'registers an offense for rescue with StandardError, Exception' do
@@ -37,8 +33,6 @@ describe Rubocop::Cop::Lint::RescueException do
37
33
  ' #do nothing',
38
34
  'end'])
39
35
  expect(cop.offenses.size).to eq(1)
40
- expect(cop.messages)
41
- .to eq(['Avoid rescuing the Exception class.'])
42
36
  end
43
37
 
44
38
  it 'registers an offense for rescue with Exception => e' do
@@ -49,8 +43,6 @@ describe Rubocop::Cop::Lint::RescueException do
49
43
  ' #do nothing',
50
44
  'end'])
51
45
  expect(cop.offenses.size).to eq(1)
52
- expect(cop.messages)
53
- .to eq(['Avoid rescuing the Exception class.'])
54
46
  end
55
47
 
56
48
  it 'does not register an offense for rescue with no class' do
@@ -22,7 +22,7 @@ describe Rubocop::Cop::Lint::ShadowingOuterLocalVariable do
22
22
  inspect_source(cop, source)
23
23
  expect(cop.offenses.size).to eq(1)
24
24
  expect(cop.offenses.first.message)
25
- .to include('Shadowing outer local variable - foo')
25
+ .to include('Shadowing outer local variable - `foo`')
26
26
  expect(cop.offenses.first.line).to eq(4)
27
27
  end
28
28
 
@@ -46,7 +46,7 @@ describe Rubocop::Cop::Lint::ShadowingOuterLocalVariable do
46
46
  inspect_source(cop, source)
47
47
  expect(cop.offenses.size).to eq(1)
48
48
  expect(cop.offenses.first.message)
49
- .to include('Shadowing outer local variable - foo')
49
+ .to include('Shadowing outer local variable - `foo`')
50
50
  expect(cop.offenses.first.line).to eq(4)
51
51
  end
52
52
 
@@ -72,7 +72,7 @@ describe Rubocop::Cop::Lint::ShadowingOuterLocalVariable do
72
72
  inspect_source(cop, source)
73
73
  expect(cop.offenses.size).to eq(1)
74
74
  expect(cop.offenses.first.message)
75
- .to include('Shadowing outer local variable - foo')
75
+ .to include('Shadowing outer local variable - `foo`')
76
76
  expect(cop.offenses.first.line).to eq(4)
77
77
  end
78
78
 
@@ -97,7 +97,7 @@ describe Rubocop::Cop::Lint::ShadowingOuterLocalVariable do
97
97
  inspect_source(cop, source)
98
98
  expect(cop.offenses.size).to eq(1)
99
99
  expect(cop.offenses.first.message)
100
- .to include('Shadowing outer local variable - foo')
100
+ .to include('Shadowing outer local variable - `foo`')
101
101
  expect(cop.offenses.first.line).to eq(4)
102
102
  end
103
103
 
@@ -0,0 +1,48 @@
1
+ # encoding: utf-8
2
+
3
+ require 'spec_helper'
4
+
5
+ describe Rubocop::Cop::Lint::SpaceBeforeFirstArg do
6
+ subject(:cop) { described_class.new }
7
+
8
+ context 'for method calls without parentheses' do
9
+ it 'registers an offense for method call with no space before the ' \
10
+ 'first arg' do
11
+ inspect_source(cop, ['something?x',
12
+ 'a.something!y, z'])
13
+ expect(cop.messages)
14
+ .to eq(['Put space between the method name and the first ' \
15
+ 'argument.'] * 2)
16
+ expect(cop.highlights).to eq(%w(x y))
17
+ end
18
+
19
+ it 'accepts a method call with space before the first arg' do
20
+ inspect_source(cop, ['something? x',
21
+ 'a.something! y, z'])
22
+ expect(cop.offenses).to be_empty
23
+ end
24
+
25
+ it 'accepts square brackets operator' do
26
+ inspect_source(cop, ['something[:x]'])
27
+ expect(cop.offenses).to be_empty
28
+ end
29
+ end
30
+
31
+ context 'for method calls with parentheses' do
32
+ it 'accepts a method call without space' do
33
+ inspect_source(cop, ['something?(x)',
34
+ 'a.something(y, z)'])
35
+ expect(cop.offenses).to be_empty
36
+ end
37
+
38
+ it 'accepts a method call with space after the left parenthesis' do
39
+ inspect_source(cop, ['something?( x )'])
40
+ expect(cop.offenses).to be_empty
41
+ end
42
+
43
+ it 'accepts setter call' do
44
+ inspect_source(cop, ['self.class.controller_path=(path)'])
45
+ expect(cop.offenses).to be_empty
46
+ end
47
+ end
48
+ end
@@ -24,4 +24,14 @@ describe Rubocop::Cop::Lint::StringConversionInInterpolation do
24
24
  inspect_source(cop, '"this is the #{result}"')
25
25
  expect(cop.offenses).to be_empty
26
26
  end
27
+
28
+ it 'does not explode on empty interpolation' do
29
+ inspect_source(cop, '"this is #{} silly"')
30
+ expect(cop.offenses).to be_empty
31
+ end
32
+
33
+ it 'autocorrects by removing the redundant to_s' do
34
+ corrected = autocorrect_source(cop, ['"some #{something.to_s}"'])
35
+ expect(corrected).to eq '"some #{something}"'
36
+ end
27
37
  end
@@ -0,0 +1,154 @@
1
+ # encoding: utf-8
2
+
3
+ require 'spec_helper'
4
+
5
+ describe Rubocop::Cop::Lint::UselessAccessModifier do
6
+ subject(:cop) { described_class.new }
7
+
8
+ context 'when an access modifier has no effect' do
9
+ let(:source) do
10
+ [
11
+ 'class SomeClass',
12
+ ' def some_method',
13
+ ' puts 10',
14
+ ' end',
15
+ ' private',
16
+ ' def self.some_method',
17
+ ' puts 10',
18
+ ' end',
19
+ 'end'
20
+ ]
21
+ end
22
+
23
+ it 'registers an offense' do
24
+ inspect_source(cop, source)
25
+ expect(cop.offenses.size).to eq(1)
26
+ expect(cop.offenses.first.message)
27
+ .to eq('Useless `private` access modifier.')
28
+ expect(cop.offenses.first.line).to eq(5)
29
+ expect(cop.highlights).to eq(['private'])
30
+ end
31
+ end
32
+
33
+ context 'when an access modifier has no methods' do
34
+ let(:source) do
35
+ [
36
+ 'class SomeClass',
37
+ ' protected',
38
+ 'end'
39
+ ]
40
+ end
41
+
42
+ it 'registers an offense' do
43
+ inspect_source(cop, source)
44
+ expect(cop.offenses.size).to eq(1)
45
+ expect(cop.offenses.first.message)
46
+ .to eq('Useless `protected` access modifier.')
47
+ expect(cop.offenses.first.line).to eq(2)
48
+ expect(cop.highlights).to eq(['protected'])
49
+ end
50
+ end
51
+
52
+ context 'when consecutive access modifiers' do
53
+ let(:source) do
54
+ [
55
+ 'class SomeClass',
56
+ ' private',
57
+ ' private',
58
+ ' def some_method',
59
+ ' puts 10',
60
+ ' end',
61
+ ' def some_other_method',
62
+ ' puts 10',
63
+ ' end',
64
+ 'end'
65
+ ]
66
+ end
67
+
68
+ it 'registers an offense' do
69
+ inspect_source(cop, source)
70
+ expect(cop.offenses.size).to eq(1)
71
+ expect(cop.offenses.first.message)
72
+ .to eq('Useless `private` access modifier.')
73
+ expect(cop.offenses.first.line).to eq(2)
74
+ expect(cop.highlights).to eq(['private'])
75
+ end
76
+ end
77
+
78
+ context 'when passing method as symbol' do
79
+ let(:source) do
80
+ [
81
+ 'class SomeClass',
82
+ ' def some_method',
83
+ ' puts 10',
84
+ ' end',
85
+ ' private :some_method',
86
+ 'end'
87
+ ]
88
+ end
89
+
90
+ it 'does not register an offense' do
91
+ inspect_source(cop, source)
92
+ expect(cop.offenses.size).to eq(0)
93
+ end
94
+ end
95
+
96
+ context 'when class is empty save modifier' do
97
+ let(:source) do
98
+ [
99
+ 'class SomeClass',
100
+ ' private',
101
+ 'end'
102
+ ]
103
+ end
104
+
105
+ it 'registers an offense' do
106
+ inspect_source(cop, source)
107
+ expect(cop.offenses.size).to eq(1)
108
+ expect(cop.offenses.first.message)
109
+ .to eq('Useless `private` access modifier.')
110
+ expect(cop.offenses.first.line).to eq(2)
111
+ expect(cop.highlights).to eq(['private'])
112
+ end
113
+ end
114
+
115
+ context 'when multiple class definitions in file but only one has offense' do
116
+ let(:source) do
117
+ [
118
+ 'class SomeClass',
119
+ ' private',
120
+ 'end',
121
+ 'class SomeOtherClass',
122
+ 'end'
123
+ ]
124
+ end
125
+
126
+ it 'registers an offense' do
127
+ inspect_source(cop, source)
128
+ expect(cop.offenses.size).to eq(1)
129
+ expect(cop.offenses.first.message)
130
+ .to eq('Useless `private` access modifier.')
131
+ expect(cop.offenses.first.line).to eq(2)
132
+ expect(cop.highlights).to eq(['private'])
133
+ end
134
+ end
135
+
136
+ if RUBY_ENGINE == 'ruby' && RUBY_VERSION.start_with?('2.1')
137
+ context 'ruby 2.1 style modifiers' do
138
+ let(:source) do
139
+ [
140
+ 'class SomeClass',
141
+ ' private def some_method',
142
+ ' puts 10',
143
+ ' end',
144
+ 'end'
145
+ ]
146
+ end
147
+
148
+ it 'does not register an offense' do
149
+ inspect_source(cop, source)
150
+ expect(cop.offenses.size).to eq(0)
151
+ end
152
+ end
153
+ end
154
+ end