rubocop 0.13.1 → 0.14.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 (222) hide show
  1. checksums.yaml +4 -4
  2. data/.rubocop.yml +3 -0
  3. data/CHANGELOG.md +42 -0
  4. data/README.md +59 -54
  5. data/config/default.yml +124 -95
  6. data/config/disabled.yml +4 -0
  7. data/config/enabled.yml +286 -264
  8. data/lib/rubocop.rb +10 -3
  9. data/lib/rubocop/cli.rb +10 -171
  10. data/lib/rubocop/cop/cop.rb +14 -11
  11. data/lib/rubocop/cop/lint/debugger.rb +35 -0
  12. data/lib/rubocop/cop/lint/syntax.rb +34 -0
  13. data/lib/rubocop/cop/offence.rb +15 -23
  14. data/lib/rubocop/cop/style/align_array.rb +1 -10
  15. data/lib/rubocop/cop/style/align_hash.rb +14 -2
  16. data/lib/rubocop/cop/style/align_parameters.rb +1 -11
  17. data/lib/rubocop/cop/style/and_or.rb +13 -11
  18. data/lib/rubocop/cop/style/attr.rb +1 -1
  19. data/lib/rubocop/cop/style/autocorrect_alignment.rb +31 -6
  20. data/lib/rubocop/cop/style/blocks.rb +14 -6
  21. data/lib/rubocop/cop/style/character_literal.rb +1 -1
  22. data/lib/rubocop/cop/style/class_length.rb +38 -0
  23. data/lib/rubocop/cop/style/collection_methods.rb +1 -1
  24. data/lib/rubocop/cop/style/colon_method_call.rb +1 -1
  25. data/lib/rubocop/cop/style/configurable_naming.rb +47 -0
  26. data/lib/rubocop/cop/style/def_parentheses.rb +2 -2
  27. data/lib/rubocop/cop/style/empty_literal.rb +1 -1
  28. data/lib/rubocop/cop/style/even_odd.rb +7 -3
  29. data/lib/rubocop/cop/style/hash_methods.rb +1 -1
  30. data/lib/rubocop/cop/style/hash_syntax.rb +36 -7
  31. data/lib/rubocop/cop/style/lambda_call.rb +36 -11
  32. data/lib/rubocop/cop/style/method_call_parentheses.rb +1 -1
  33. data/lib/rubocop/cop/style/method_called_on_do_end_block.rb +41 -0
  34. data/lib/rubocop/cop/style/method_length.rb +2 -13
  35. data/lib/rubocop/cop/style/method_name.rb +42 -0
  36. data/lib/rubocop/cop/style/numeric_literals.rb +4 -0
  37. data/lib/rubocop/cop/style/perl_backrefs.rb +1 -1
  38. data/lib/rubocop/cop/style/raise_args.rb +60 -0
  39. data/lib/rubocop/cop/style/redundant_exception.rb +32 -0
  40. data/lib/rubocop/cop/style/redundant_return.rb +14 -5
  41. data/lib/rubocop/cop/style/redundant_self.rb +1 -1
  42. data/lib/rubocop/cop/style/semicolon.rb +13 -4
  43. data/lib/rubocop/cop/style/signal_exception.rb +63 -14
  44. data/lib/rubocop/cop/style/special_global_vars.rb +1 -1
  45. data/lib/rubocop/cop/style/string_help.rb +4 -1
  46. data/lib/rubocop/cop/style/string_literals.rb +34 -11
  47. data/lib/rubocop/cop/style/surrounding_space.rb +64 -17
  48. data/lib/rubocop/cop/style/tab.rb +1 -1
  49. data/lib/rubocop/cop/style/variable_name.rb +44 -0
  50. data/lib/rubocop/cop/style/when_then.rb +1 -1
  51. data/lib/rubocop/cop/style/while_until_do.rb +1 -1
  52. data/lib/rubocop/cop/team.rb +4 -7
  53. data/lib/rubocop/cop/util.rb +12 -0
  54. data/lib/rubocop/formatter/clang_style_formatter.rb +1 -1
  55. data/lib/rubocop/formatter/emacs_style_formatter.rb +5 -2
  56. data/lib/rubocop/formatter/json_formatter.rb +1 -0
  57. data/lib/rubocop/formatter/progress_formatter.rb +9 -13
  58. data/lib/rubocop/formatter/simple_text_formatter.rb +63 -15
  59. data/lib/rubocop/options.rb +184 -0
  60. data/lib/rubocop/processed_source.rb +4 -0
  61. data/lib/rubocop/version.rb +1 -1
  62. data/rubocop.gemspec +1 -1
  63. data/spec/rubocop/cli_spec.rb +870 -1001
  64. data/spec/rubocop/config_spec.rb +13 -13
  65. data/spec/rubocop/config_store_spec.rb +38 -37
  66. data/spec/rubocop/cop/commissioner_spec.rb +42 -46
  67. data/spec/rubocop/cop/cop_spec.rb +72 -77
  68. data/spec/rubocop/cop/corrector_spec.rb +51 -55
  69. data/spec/rubocop/cop/lint/assignment_in_condition_spec.rb +100 -106
  70. data/spec/rubocop/cop/lint/block_alignment_spec.rb +403 -409
  71. data/spec/rubocop/cop/lint/debugger_spec.rb +39 -0
  72. data/spec/rubocop/cop/lint/empty_ensure_spec.rb +19 -25
  73. data/spec/rubocop/cop/lint/end_alignment_spec.rb +50 -56
  74. data/spec/rubocop/cop/lint/end_in_method_spec.rb +20 -26
  75. data/spec/rubocop/cop/lint/ensure_return_spec.rb +30 -36
  76. data/spec/rubocop/cop/lint/eval_spec.rb +25 -31
  77. data/spec/rubocop/cop/lint/handle_exceptions_spec.rb +22 -28
  78. data/spec/rubocop/cop/lint/literal_in_condition_spec.rb +51 -57
  79. data/spec/rubocop/cop/lint/loop_spec.rb +17 -23
  80. data/spec/rubocop/cop/lint/parentheses_as_grouped_expression_spec.rb +51 -57
  81. data/spec/rubocop/cop/lint/rescue_exception_spec.rb +105 -111
  82. data/spec/rubocop/cop/lint/shadowing_outer_local_variable_spec.rb +230 -236
  83. data/spec/rubocop/cop/lint/syntax_spec.rb +33 -0
  84. data/spec/rubocop/cop/lint/unreachable_code_spec.rb +51 -57
  85. data/spec/rubocop/cop/lint/useless_assignment_spec.rb +1544 -1550
  86. data/spec/rubocop/cop/lint/useless_comparison_spec.rb +21 -27
  87. data/spec/rubocop/cop/lint/useless_setter_call_spec.rb +119 -125
  88. data/spec/rubocop/cop/lint/void_spec.rb +50 -56
  89. data/spec/rubocop/cop/offence_spec.rb +101 -131
  90. data/spec/rubocop/cop/rails/has_and_belongs_to_many_spec.rb +6 -12
  91. data/spec/rubocop/cop/rails/read_attribute_spec.rb +6 -12
  92. data/spec/rubocop/cop/rails/validation_spec.rb +13 -19
  93. data/spec/rubocop/cop/style/access_control_spec.rb +146 -152
  94. data/spec/rubocop/cop/style/alias_spec.rb +30 -36
  95. data/spec/rubocop/cop/style/align_array_spec.rb +57 -56
  96. data/spec/rubocop/cop/style/align_hash_spec.rb +256 -237
  97. data/spec/rubocop/cop/style/align_parameters_spec.rb +216 -202
  98. data/spec/rubocop/cop/style/and_or_spec.rb +51 -55
  99. data/spec/rubocop/cop/style/ascii_comments_spec.rb +14 -20
  100. data/spec/rubocop/cop/style/ascii_identifiers_spec.rb +26 -32
  101. data/spec/rubocop/cop/style/attr_spec.rb +11 -17
  102. data/spec/rubocop/cop/style/begin_block_spec.rb +6 -12
  103. data/spec/rubocop/cop/style/block_comments_spec.rb +13 -19
  104. data/spec/rubocop/cop/style/block_nesting_spec.rb +134 -140
  105. data/spec/rubocop/cop/style/blocks_spec.rb +81 -84
  106. data/spec/rubocop/cop/style/case_equality_spec.rb +5 -11
  107. data/spec/rubocop/cop/style/case_indentation_spec.rb +71 -77
  108. data/spec/rubocop/cop/style/character_literal_spec.rb +31 -37
  109. data/spec/rubocop/cop/style/class_and_module_camel_case_spec.rb +31 -37
  110. data/spec/rubocop/cop/style/class_length_spec.rb +65 -0
  111. data/spec/rubocop/cop/style/class_methods_spec.rb +35 -41
  112. data/spec/rubocop/cop/style/class_vars_spec.rb +11 -17
  113. data/spec/rubocop/cop/style/collection_methods_spec.rb +41 -47
  114. data/spec/rubocop/cop/style/colon_method_call_spec.rb +45 -51
  115. data/spec/rubocop/cop/style/comment_annotation_spec.rb +79 -85
  116. data/spec/rubocop/cop/style/constant_name_spec.rb +45 -51
  117. data/spec/rubocop/cop/style/def_with_parentheses_spec.rb +28 -34
  118. data/spec/rubocop/cop/style/def_without_parentheses_spec.rb +23 -29
  119. data/spec/rubocop/cop/style/documentation_spec.rb +60 -66
  120. data/spec/rubocop/cop/style/dot_position_spec.rb +50 -56
  121. data/spec/rubocop/cop/style/empty_line_between_defs_spec.rb +109 -110
  122. data/spec/rubocop/cop/style/empty_lines_spec.rb +28 -34
  123. data/spec/rubocop/cop/style/empty_literal_spec.rb +80 -86
  124. data/spec/rubocop/cop/style/encoding_spec.rb +50 -56
  125. data/spec/rubocop/cop/style/end_block_spec.rb +6 -12
  126. data/spec/rubocop/cop/style/end_of_line_spec.rb +13 -19
  127. data/spec/rubocop/cop/style/even_odd_spec.rb +69 -41
  128. data/spec/rubocop/cop/style/favor_join_spec.rb +21 -27
  129. data/spec/rubocop/cop/style/favor_modifier_spec.rb +180 -176
  130. data/spec/rubocop/cop/style/favor_sprintf_spec.rb +41 -47
  131. data/spec/rubocop/cop/style/favor_unless_over_negated_if_spec.rb +63 -69
  132. data/spec/rubocop/cop/style/favor_until_over_negated_while_spec.rb +32 -38
  133. data/spec/rubocop/cop/style/final_newline_spec.rb +16 -22
  134. data/spec/rubocop/cop/style/for_spec.rb +18 -24
  135. data/spec/rubocop/cop/style/global_vars_spec.rb +23 -29
  136. data/spec/rubocop/cop/style/hash_methods_spec.rb +39 -45
  137. data/spec/rubocop/cop/style/hash_syntax_spec.rb +93 -65
  138. data/spec/rubocop/cop/style/if_with_semicolon_spec.rb +11 -17
  139. data/spec/rubocop/cop/style/indentation_width_spec.rb +377 -383
  140. data/spec/rubocop/cop/style/lambda_call_spec.rb +40 -22
  141. data/spec/rubocop/cop/style/lambda_spec.rb +30 -34
  142. data/spec/rubocop/cop/style/leading_comment_space_spec.rb +44 -50
  143. data/spec/rubocop/cop/style/line_length_spec.rb +11 -17
  144. data/spec/rubocop/cop/style/method_call_parentheses_spec.rb +14 -20
  145. data/spec/rubocop/cop/style/method_called_on_do_end_block_spec.rb +60 -0
  146. data/spec/rubocop/cop/style/method_length_spec.rb +127 -133
  147. data/spec/rubocop/cop/style/method_name_spec.rb +103 -0
  148. data/spec/rubocop/cop/style/module_function_spec.rb +16 -22
  149. data/spec/rubocop/cop/style/multiline_block_chain_spec.rb +64 -70
  150. data/spec/rubocop/cop/style/multiline_if_then_spec.rb +74 -80
  151. data/spec/rubocop/cop/style/nil_comparison_spec.rb +20 -26
  152. data/spec/rubocop/cop/style/not_spec.rb +13 -19
  153. data/spec/rubocop/cop/style/numeric_literals_spec.rb +36 -35
  154. data/spec/rubocop/cop/style/one_line_conditional_spec.rb +5 -11
  155. data/spec/rubocop/cop/style/op_method_spec.rb +61 -67
  156. data/spec/rubocop/cop/style/parameter_lists_spec.rb +31 -37
  157. data/spec/rubocop/cop/style/parentheses_around_condition_spec.rb +62 -68
  158. data/spec/rubocop/cop/style/perl_backrefs_spec.rb +9 -15
  159. data/spec/rubocop/cop/style/proc_spec.rb +13 -19
  160. data/spec/rubocop/cop/style/raise_args_spec.rb +55 -0
  161. data/spec/rubocop/cop/style/reduce_arguments_spec.rb +49 -55
  162. data/spec/rubocop/cop/style/redundant_begin_spec.rb +47 -53
  163. data/spec/rubocop/cop/style/redundant_exception_spec.rb +27 -0
  164. data/spec/rubocop/cop/style/redundant_return_spec.rb +164 -72
  165. data/spec/rubocop/cop/style/redundant_self_spec.rb +109 -115
  166. data/spec/rubocop/cop/style/regexp_literal_spec.rb +57 -63
  167. data/spec/rubocop/cop/style/rescue_modifier_spec.rb +99 -105
  168. data/spec/rubocop/cop/style/semicolon_spec.rb +95 -90
  169. data/spec/rubocop/cop/style/signal_exception_spec.rb +248 -95
  170. data/spec/rubocop/cop/style/single_line_methods_spec.rb +45 -51
  171. data/spec/rubocop/cop/style/space_after_colon_spec.rb +14 -20
  172. data/spec/rubocop/cop/style/space_after_comma_spec.rb +16 -22
  173. data/spec/rubocop/cop/style/space_after_control_keyword_spec.rb +48 -54
  174. data/spec/rubocop/cop/style/space_after_method_name_spec.rb +49 -55
  175. data/spec/rubocop/cop/style/space_after_semicolon_spec.rb +10 -16
  176. data/spec/rubocop/cop/style/space_around_block_braces_spec.rb +118 -50
  177. data/spec/rubocop/cop/style/space_around_equals_in_default_parameter_spec.rb +18 -24
  178. data/spec/rubocop/cop/style/space_around_operators_spec.rb +204 -210
  179. data/spec/rubocop/cop/style/space_before_modifier_keyword_spec.rb +36 -42
  180. data/spec/rubocop/cop/style/space_inside_brackets_spec.rb +39 -45
  181. data/spec/rubocop/cop/style/space_inside_hash_literal_braces_spec.rb +62 -68
  182. data/spec/rubocop/cop/style/space_inside_parens_spec.rb +18 -24
  183. data/spec/rubocop/cop/style/special_global_vars_spec.rb +40 -46
  184. data/spec/rubocop/cop/style/string_literals_spec.rb +148 -70
  185. data/spec/rubocop/cop/style/symbol_array_spec.rb +28 -34
  186. data/spec/rubocop/cop/style/symbol_name_spec.rb +132 -138
  187. data/spec/rubocop/cop/style/tab_spec.rb +9 -15
  188. data/spec/rubocop/cop/style/ternary_operator_spec.rb +25 -31
  189. data/spec/rubocop/cop/style/trailing_blank_lines_spec.rb +10 -16
  190. data/spec/rubocop/cop/style/trailing_whitespace_spec.rb +14 -20
  191. data/spec/rubocop/cop/style/trivial_accessors_spec.rb +374 -380
  192. data/spec/rubocop/cop/style/unless_else_spec.rb +17 -23
  193. data/spec/rubocop/cop/style/variable_interpolation_spec.rb +36 -42
  194. data/spec/rubocop/cop/style/variable_name_spec.rb +83 -0
  195. data/spec/rubocop/cop/style/when_then_spec.rb +31 -37
  196. data/spec/rubocop/cop/style/while_until_do_spec.rb +47 -53
  197. data/spec/rubocop/cop/style/word_array_spec.rb +49 -55
  198. data/spec/rubocop/cop/team_spec.rb +125 -127
  199. data/spec/rubocop/cop/variable_inspector/assignment_spec.rb +176 -180
  200. data/spec/rubocop/cop/variable_inspector/locatable_spec.rb +580 -586
  201. data/spec/rubocop/cop/variable_inspector/scope_spec.rb +140 -146
  202. data/spec/rubocop/cop/variable_inspector/variable_spec.rb +52 -58
  203. data/spec/rubocop/cop/variable_inspector/variable_table_spec.rb +217 -223
  204. data/spec/rubocop/cop/variable_inspector_spec.rb +15 -19
  205. data/spec/rubocop/formatter/clang_style_formatter_spec.rb +35 -36
  206. data/spec/rubocop/formatter/disabled_config_formatter_spec.rb +2 -2
  207. data/spec/rubocop/formatter/emacs_style_formatter_spec.rb +24 -1
  208. data/spec/rubocop/formatter/file_list_formatter_spec.rb +1 -1
  209. data/spec/rubocop/formatter/formatter_set_spec.rb +3 -3
  210. data/spec/rubocop/formatter/json_formatter_spec.rb +7 -2
  211. data/spec/rubocop/formatter/offence_count_formatter_spec.rb +1 -1
  212. data/spec/rubocop/formatter/progress_formatter_spec.rb +1 -1
  213. data/spec/rubocop/formatter/simple_text_formatter_spec.rb +55 -6
  214. data/spec/rubocop/options_spec.rb +233 -0
  215. data/spec/rubocop/processed_source_spec.rb +85 -42
  216. data/spec/rubocop/source_parser_spec.rb +108 -110
  217. data/spec/rubocop/target_finder_spec.rb +125 -127
  218. data/spec/rubocop/token_spec.rb +15 -17
  219. metadata +32 -8
  220. data/lib/rubocop/backports/bsearch.rb +0 -39
  221. data/lib/rubocop/cop/style/method_and_variable_snake_case.rb +0 -77
  222. data/spec/rubocop/cop/style/method_and_variable_snake_case_spec.rb +0 -102
@@ -43,7 +43,7 @@ module Rubocop
43
43
  MSG.format(PREFERRED_VARS[global_var], global_var)
44
44
  end
45
45
 
46
- def autocorrect_action(node)
46
+ def autocorrect(node)
47
47
  @corrections << lambda do |corrector|
48
48
  global_var, = *node
49
49
 
@@ -3,7 +3,10 @@
3
3
  module Rubocop
4
4
  module Cop
5
5
  module Style
6
- # Checks for uses of double quotes where single quotes would do.
6
+ # Classes that include this module just implement functions to determine
7
+ # what is an offence and how to do auto-correction. They get help with
8
+ # adding offences for the faulty string nodes, and with filtering out
9
+ # nodes.
7
10
  module StringHelp
8
11
  def on_str(node)
9
12
  # Constants like __FILE__ are handled as strings,
@@ -3,25 +3,48 @@
3
3
  module Rubocop
4
4
  module Cop
5
5
  module Style
6
- # Checks for uses of double quotes where single quotes would do.
6
+ # Checks if uses of quotes match the configured preference.
7
7
  class StringLiterals < Cop
8
8
  include StringHelp
9
9
 
10
- MSG = "Prefer single-quoted strings when you don't need " +
11
- 'string interpolation or special symbols.'
10
+ private
11
+
12
+ def message(node)
13
+ if single_quotes_preferred?
14
+ "Prefer single-quoted strings when you don't need string " +
15
+ 'interpolation or special symbols.'
16
+ else
17
+ 'Prefer double-quoted strings unless you need single quotes to ' +
18
+ 'avoid extra backslashes for escaping.'
19
+ end
20
+ end
12
21
 
13
22
  def offence?(node)
14
- # regex matches IF there is a ' or there is a \\ in the string that
15
- # is not preceeded/followed by another \\ (e.g. "\\x34") but not
16
- # "\\\\"
17
- node.loc.expression.source !~ /' | (?<! \\) \\{2}* \\ (?! \\)/x &&
18
- node.loc.begin && node.loc.begin.is?('"')
23
+ src = node.loc.expression.source
24
+ return false if src =~ /^%q/i
25
+ src !~ if single_quotes_preferred?
26
+ # regex matches IF there is a ' or there is a \\ in the
27
+ # string that is not preceeded/followed by another \\
28
+ # (e.g. "\\x34") but not "\\\\"
29
+ /' | (?<! \\) \\{2}* \\ (?! \\)/x
30
+ else
31
+ /" | \\/x
32
+ end
33
+ end
34
+
35
+ def single_quotes_preferred?
36
+ case cop_config['EnforcedStyle']
37
+ when 'single_quotes' then true
38
+ when 'double_quotes' then false
39
+ else fail 'Unknown StringLiterals style'
40
+ end
19
41
  end
20
42
 
21
- def autocorrect_action(node)
43
+ def autocorrect(node)
22
44
  @corrections << lambda do |corrector|
23
- corrector.replace(node.loc.begin, "'")
24
- corrector.replace(node.loc.end, "'")
45
+ replacement = node.loc.begin.is?('"') ? "'" : '"'
46
+ corrector.replace(node.loc.begin, replacement)
47
+ corrector.replace(node.loc.end, replacement)
25
48
  end
26
49
  end
27
50
  end
@@ -174,14 +174,11 @@ module Rubocop
174
174
  end
175
175
  end
176
176
 
177
- # Checks that block braces have surrounding space. For blocks taking
178
- # parameters, it check that the left brace has or doesn't have trailing
179
- # space depending on configuration.
177
+ # Checks that block braces have or don't have surrounding space depending
178
+ # on configuration. For blocks taking parameters, it checks that the left
179
+ # brace has or doesn't have trailing space depending on configuration.
180
180
  class SpaceAroundBlockBraces < Cop
181
181
  include SurroundingSpace
182
- MSG_LEFT = "Surrounding space missing for '{'."
183
- MSG_RIGHT = "Space missing to the left of '}'."
184
- MSG_PIPE = 'Space between { and | detected.'
185
182
 
186
183
  def investigate(processed_source)
187
184
  return unless processed_source.ast
@@ -191,15 +188,15 @@ module Rubocop
191
188
  next if ([t1.pos, t2.pos] - positions_not_to_check).size < 2
192
189
 
193
190
  type1, type2 = t1.type, t2.type
194
- check(t1, t2, MSG_LEFT) if type2 == :tLCURLY
195
- if type1 == :tLCURLY
196
- if type2 == :tPIPE && cop_config['NoSpaceBeforeBlockParameters']
197
- check_pipe(t1, t2, MSG_PIPE)
191
+ if [:tLCURLY, :tRCURLY].include?(type2)
192
+ check(t1, t2)
193
+ elsif type1 == :tLCURLY
194
+ if type2 == :tPIPE
195
+ check_pipe(t1, t2)
198
196
  else
199
- check(t1, t2, MSG_LEFT)
197
+ check(t1, t2)
200
198
  end
201
199
  end
202
- check(t1, t2, MSG_RIGHT) if type2 == :tRCURLY
203
200
  end
204
201
  end
205
202
 
@@ -229,15 +226,65 @@ module Rubocop
229
226
  end
230
227
  end
231
228
 
232
- def check(t1, t2, msg)
229
+ def check(t1, t2)
230
+ if cop_config['EnforcedStyle'] == 'space_inside_braces'
231
+ check_space_inside_braces(t1, t2)
232
+ else
233
+ check_no_space_inside_braces(t1, t2)
234
+ end
235
+ check_space_outside_left_brace(t1, t2)
236
+ end
237
+
238
+ def check_space_inside_braces(t1, t2)
233
239
  unless space_between?(t1, t2)
234
- brace_token = t1.text == '{' ? t1 : t2
235
- convention(nil, brace_token.pos, msg)
240
+ if t1.text == '{'
241
+ convention(nil, t1.pos, 'Space missing inside {.')
242
+ elsif t2.text == '}'
243
+ convention(nil, t2.pos, 'Space missing inside }.')
244
+ end
245
+ end
246
+ end
247
+
248
+ def check_no_space_inside_braces(t1, t2)
249
+ if t1.text == '{' || t2.text == '}'
250
+ if space_between?(t1, t2)
251
+ if t1.text == '{'
252
+ convention(nil, space_range(t1), 'Space inside { detected.')
253
+ elsif t2.text == '}'
254
+ convention(nil, space_range(t2), 'Space inside } detected.')
255
+ end
256
+ end
236
257
  end
237
258
  end
238
259
 
239
- def check_pipe(t1, t2, msg)
240
- convention(nil, t1.pos, msg) if space_between?(t1, t2)
260
+ def check_space_outside_left_brace(t1, t2)
261
+ if t2.text == '{' && !space_between?(t1, t2)
262
+ convention(nil, t2.pos, 'Space missing to the left of {.')
263
+ end
264
+ end
265
+
266
+ def check_pipe(t1, t2)
267
+ if cop_config['SpaceBeforeBlockParameters']
268
+ unless space_between?(t1, t2)
269
+ convention(nil, t1.pos, 'Space between { and | missing.')
270
+ end
271
+ elsif space_between?(t1, t2)
272
+ convention(nil, space_range(t1), 'Space between { and | detected.')
273
+ end
274
+ end
275
+
276
+ def space_range(token)
277
+ src = @processed_source.buffer.source
278
+ if token.text == '{'
279
+ b = token.pos.begin_pos + 1
280
+ e = b + 1
281
+ e += 1 while src[e] =~ /\s/
282
+ else
283
+ e = token.pos.begin_pos
284
+ b = e - 1
285
+ b -= 1 while src[b - 1] =~ /\s/
286
+ end
287
+ Parser::Source::Range.new(@processed_source.buffer, b, e)
241
288
  end
242
289
  end
243
290
 
@@ -15,7 +15,7 @@ module Rubocop
15
15
  convention(nil,
16
16
  source_range(processed_source.buffer,
17
17
  processed_source[0...index],
18
- spaces.length, 8),
18
+ spaces.length, 1),
19
19
  MSG)
20
20
  end
21
21
  end
@@ -0,0 +1,44 @@
1
+ # encoding: utf-8
2
+
3
+ module Rubocop
4
+ module Cop
5
+ module Style
6
+ # This cop makes sure that all variables use the configured style,
7
+ # snake_case or camelCase, for their names.
8
+ class VariableName < Cop
9
+ include ConfigurableNaming
10
+
11
+ def on_lvasgn(node)
12
+ check(node, name_of_variable(node))
13
+ end
14
+
15
+ def on_ivasgn(node)
16
+ check(node, name_of_variable(node))
17
+ end
18
+
19
+ def on_send(node)
20
+ check(node, name_of_setter(node))
21
+ end
22
+
23
+ def name_of_variable(vasgn_node)
24
+ expr = vasgn_node.loc.expression
25
+ name = vasgn_node.children.first
26
+ Parser::Source::Range.new(expr.source_buffer, expr.begin_pos,
27
+ expr.begin_pos + name.length)
28
+ end
29
+
30
+ def name_of_setter(send_node)
31
+ receiver, method_name = *send_node
32
+ return unless receiver && receiver.type == :self
33
+ return unless method_name.to_s.end_with?('=')
34
+ after_dot(send_node, method_name.length - '='.length,
35
+ Regexp.escape(receiver.loc.expression.source))
36
+ end
37
+
38
+ def message(style)
39
+ format('Use %s for variables.', style)
40
+ end
41
+ end
42
+ end
43
+ end
44
+ end
@@ -11,7 +11,7 @@ module Rubocop
11
11
  convention(node, :begin) if node.loc.begin && node.loc.begin.is?(';')
12
12
  end
13
13
 
14
- def autocorrect_action(node)
14
+ def autocorrect(node)
15
15
  @corrections << lambda do |corrector|
16
16
  corrector.replace(node.loc.begin, ' then')
17
17
  end
@@ -30,7 +30,7 @@ module Rubocop
30
30
  format('Never use `do` with multi-line `%s`.', node_type)
31
31
  end
32
32
 
33
- def autocorrect_action(node)
33
+ def autocorrect(node)
34
34
  @corrections << lambda do |corrector|
35
35
  condition_node, = *node
36
36
  end_of_condition_range = condition_node.loc.expression.end
@@ -30,19 +30,16 @@ module Rubocop
30
30
  return []
31
31
  end
32
32
 
33
- offences = processed_source.diagnostics.map do |diagnostic|
34
- Offence.from_diagnostic(diagnostic)
35
- end
36
-
37
33
  # If we got any syntax errors, return only the syntax offences.
38
34
  # Parser may return nil for AST even though there are no syntax errors.
39
35
  # e.g. sources which contain only comments
40
- if offences.any? { |o| [:error, :fatal].include?(o.severity) }
41
- return offences
36
+ unless processed_source.valid_syntax?
37
+ diagnostics = processed_source.diagnostics
38
+ return Lint::Syntax.offences_from_diagnostics(diagnostics)
42
39
  end
43
40
 
44
41
  commissioner = Commissioner.new(cops)
45
- offences += commissioner.investigate(processed_source)
42
+ offences = commissioner.investigate(processed_source)
46
43
  process_commissioner_errors(file, commissioner.errors)
47
44
  autocorrect(processed_source.buffer, cops)
48
45
  offences.sort
@@ -23,6 +23,18 @@ module Rubocop
23
23
  block_node.loc.end.line - block_node.loc.begin.line
24
24
  end
25
25
 
26
+ def source_length(source, count_comments = nil)
27
+ lines = source.lines.to_a[1...-1]
28
+
29
+ return 0 unless lines
30
+
31
+ lines.reject!(&:blank?)
32
+
33
+ lines.reject! { |line| line =~ /^\s*#/ } unless count_comments
34
+
35
+ lines.size
36
+ end
37
+
26
38
  def const_name(node)
27
39
  return nil if node.nil? || node.type != :const
28
40
 
@@ -10,7 +10,7 @@ module Rubocop
10
10
  offences.each do |o|
11
11
  output.printf("%s:%d:%d: %s: %s\n",
12
12
  smart_path(file).color(:cyan), o.line, o.real_column,
13
- o.clang_severity, o.message)
13
+ colored_severity_code(o), message(o))
14
14
 
15
15
  source_line = o.location.source_line
16
16
 
@@ -7,9 +7,12 @@ module Rubocop
7
7
  class EmacsStyleFormatter < BaseFormatter
8
8
  def file_finished(file, offences)
9
9
  offences.each do |o|
10
+ message = o.corrected? ? '[Corrected] ' : ''
11
+ message << o.message
12
+
10
13
  output.printf("%s:%d:%d: %s: %s\n",
11
- file, o.line, o.real_column, o.encode_severity,
12
- o.message)
14
+ file, o.line, o.real_column, o.severity_code,
15
+ message)
13
16
  end
14
17
  end
15
18
  end
@@ -54,6 +54,7 @@ module Rubocop
54
54
  severity: offence.severity,
55
55
  message: offence.message,
56
56
  cop_name: offence.cop_name,
57
+ corrected: offence.corrected?,
57
58
  location: hash_for_location(offence)
58
59
  }
59
60
  end
@@ -6,14 +6,6 @@ module Rubocop
6
6
  # letters for files with problems in the them. In the end it
7
7
  # appends the regular report data in the clang style format.
8
8
  class ProgressFormatter < ClangStyleFormatter
9
- COLOR_FOR_SEVERITY = {
10
- refactor: :yellow,
11
- convention: :yellow,
12
- warning: :magenta,
13
- error: :red,
14
- fatal: :red
15
- }
16
-
17
9
  def started(target_files)
18
10
  super
19
11
  @offences_for_files = {}
@@ -22,8 +14,11 @@ module Rubocop
22
14
  end
23
15
 
24
16
  def file_finished(file, offences)
25
- @total_offence_count += offences.count
26
- @offences_for_files[file] = offences unless offences.empty?
17
+ unless offences.empty?
18
+ count_stats(offences)
19
+ @offences_for_files[file] = offences
20
+ end
21
+
27
22
  report_file_as_mark(file, offences)
28
23
  end
29
24
 
@@ -40,7 +35,9 @@ module Rubocop
40
35
  end
41
36
  end
42
37
 
43
- report_summary(inspected_files.count, @total_offence_count)
38
+ report_summary(inspected_files.count,
39
+ @total_offence_count,
40
+ @total_correction_count)
44
41
  end
45
42
 
46
43
  def report_file_as_mark(file, offences)
@@ -50,8 +47,7 @@ module Rubocop
50
47
  highest_offence = offences.max do |a, b|
51
48
  a.severity_level <=> b.severity_level
52
49
  end
53
- color = COLOR_FOR_SEVERITY[highest_offence.severity]
54
- highest_offence.encode_severity.color(color)
50
+ colored_severity_code(highest_offence)
55
51
  end
56
52
 
57
53
  output.write mark
@@ -6,44 +6,67 @@ module Rubocop
6
6
  # Offences are displayed at compact form - just the
7
7
  # location of the problem and the associated message.
8
8
  class SimpleTextFormatter < BaseFormatter
9
+ COLOR_FOR_SEVERITY = {
10
+ refactor: :yellow,
11
+ convention: :yellow,
12
+ warning: :magenta,
13
+ error: :red,
14
+ fatal: :red
15
+ }.freeze
16
+
9
17
  def started(target_files)
10
18
  @total_offence_count = 0
19
+ @total_correction_count = 0
11
20
  end
12
21
 
13
22
  def file_finished(file, offences)
14
23
  return if offences.empty?
15
- @total_offence_count += offences.count
24
+ count_stats(offences)
16
25
  report_file(file, offences)
17
26
  end
18
27
 
19
28
  def finished(inspected_files)
20
- report_summary(inspected_files.count, @total_offence_count)
29
+ report_summary(inspected_files.count,
30
+ @total_offence_count,
31
+ @total_correction_count)
21
32
  end
22
33
 
23
34
  def report_file(file, offences)
24
35
  output.puts "== #{smart_path(file)} ==".color(:yellow)
25
- output.puts offences.join("\n")
36
+
37
+ offences.each do |o|
38
+ output.printf("%s:%3d:%3d: %s\n",
39
+ colored_severity_code(o),
40
+ o.line, o.real_column, message(o))
41
+ end
26
42
  end
27
43
 
28
- def report_summary(file_count, offence_count)
29
- summary = ''
44
+ def report_summary(file_count, offence_count, correction_count)
45
+ summary = pluralize(file_count, 'file')
46
+ summary << ' inspected, '
30
47
 
31
- plural = file_count == 0 || file_count > 1 ? 's' : ''
32
- summary << "#{file_count} file#{plural} inspected, "
48
+ offences_text = pluralize(offence_count, 'offence', no_for_zero: true)
49
+ offences_text << ' detected'
50
+ summary << offences_text.color(offence_count.zero? ? :green : :red)
33
51
 
34
- offences_string = case offence_count
35
- when 0 then 'no offences'
36
- when 1 then '1 offence'
37
- else "#{offence_count} offences"
38
- end
39
- summary << "#{offences_string} detected"
40
- .color(offence_count.zero? ? :green : :red)
52
+ if correction_count > 0
53
+ summary << ', '
54
+ correction_text = pluralize(correction_count, 'offence')
55
+ correction_text << ' corrected'
56
+ color = correction_count == offence_count ? :green : :cyan
57
+ summary << correction_text.color(color)
58
+ end
41
59
 
42
60
  output.puts
43
61
  output.puts summary
44
62
  end
45
63
 
46
- protected
64
+ private
65
+
66
+ def count_stats(offences)
67
+ @total_offence_count += offences.count
68
+ @total_correction_count += offences.select(&:corrected?).count
69
+ end
47
70
 
48
71
  def smart_path(path)
49
72
  if path.start_with?(Dir.pwd)
@@ -52,6 +75,31 @@ module Rubocop
52
75
  path
53
76
  end
54
77
  end
78
+
79
+ def colored_severity_code(offence)
80
+ color = COLOR_FOR_SEVERITY[offence.severity]
81
+ offence.severity_code.color(color)
82
+ end
83
+
84
+ def message(offence)
85
+ message = offence.corrected? ? '[Corrected] '.color(:green) : ''
86
+ message << offence.message
87
+ end
88
+
89
+ def pluralize(number, thing, options = {})
90
+ text = ''
91
+
92
+ if number == 0 && options[:no_for_zero]
93
+ text = 'no'
94
+ else
95
+ text << number.to_s
96
+ end
97
+
98
+ text << " #{thing}"
99
+ text << 's' unless number == 1
100
+
101
+ text
102
+ end
55
103
  end
56
104
  end
57
105
  end