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
@@ -13,24 +13,49 @@ module Rubocop
13
13
  # # good
14
14
  # lambda.call(x, y)
15
15
  class LambdaCall < Cop
16
- MSG = 'Prefer the use of `lambda.call(...)` over `lambda.(...)`.'
17
-
18
16
  def on_send(node)
19
17
  _receiver, selector, = *node
20
18
 
21
- # lambda.() does not have a selector
22
- return unless selector == :call && node.loc.selector.nil?
19
+ # we care only about `call` methods
20
+ return unless selector == :call
23
21
 
24
- convention(node, :expression)
22
+ if style == :call && node.loc.selector.nil?
23
+ # lambda.() does not have a selector
24
+ convention(node, :expression)
25
+ elsif style == :braces && node.loc.selector
26
+ convention(node, :expression)
27
+ end
25
28
  end
26
29
 
27
- def autocorrect_action(node)
30
+ def autocorrect(node)
28
31
  @corrections << lambda do |corrector|
29
- receiver_node, = *node
30
- expr = node.loc.expression
31
- receiver = receiver_node.loc.expression.source
32
- replacement = expr.source.sub("#{receiver}.", "#{receiver}.call")
33
- corrector.replace(expr, replacement)
32
+ if style == :call
33
+ receiver_node, = *node
34
+ expr = node.loc.expression
35
+ receiver = receiver_node.loc.expression.source
36
+ replacement = expr.source.sub("#{receiver}.", "#{receiver}.call")
37
+ corrector.replace(expr, replacement)
38
+ else
39
+ corrector.remove(node.loc.selector)
40
+ end
41
+ end
42
+ end
43
+
44
+ def message(node)
45
+ if style == :call
46
+ 'Prefer the use of `lambda.call(...)` over `lambda.(...)`.'
47
+ else
48
+ 'Prefer the use of `lambda.(...)` over `lambda.call(...)`.'
49
+ end
50
+ end
51
+
52
+ private
53
+
54
+ def style
55
+ case cop_config['EnforcedStyle']
56
+ when 'call' then :call
57
+ when 'braces' then :braces
58
+ else fail 'Unknown style selected!'
34
59
  end
35
60
  end
36
61
  end
@@ -13,7 +13,7 @@ module Rubocop
13
13
  convention(node, :begin) if args.empty? && node.loc.begin
14
14
  end
15
15
 
16
- def autocorrect_action(node)
16
+ def autocorrect(node)
17
17
  @corrections << lambda do |corrector|
18
18
  corrector.remove(node.loc.begin)
19
19
  corrector.remove(node.loc.end)
@@ -0,0 +1,41 @@
1
+ # encoding: utf-8
2
+
3
+ module Rubocop
4
+ module Cop
5
+ module Style
6
+ # This cop checks for methods called on a do...end block. The point of
7
+ # this check is that it's easy to miss the call tacked on to the block
8
+ # when reading code.
9
+ #
10
+ # @example
11
+ #
12
+ # a do
13
+ # b
14
+ # end.c
15
+ class MethodCalledOnDoEndBlock < Cop
16
+ MSG = 'Avoid chaining a method call on a do...end block.'
17
+
18
+ def on_block(node)
19
+ method, _args, _body = *node
20
+ # If the method that is chained on the do...end block is itself a
21
+ # method with a block, we allow it. It's pretty safe to assume that
22
+ # these calls are not missed by anyone reading code. We also want to
23
+ # avoid double reporting of offences checked by the
24
+ # MultilineBlockChain cop.
25
+ ignore_node(method)
26
+ end
27
+
28
+ def on_send(node)
29
+ return if ignored_node?(node)
30
+ receiver, _method_name, *_args = *node
31
+ if receiver && receiver.type == :block && receiver.loc.end.is?('end')
32
+ range = Parser::Source::Range.new(receiver.loc.end.source_buffer,
33
+ receiver.loc.end.begin_pos,
34
+ node.loc.expression.end_pos)
35
+ convention(nil, range)
36
+ end
37
+ end
38
+ end
39
+ end
40
+ end
41
+ end
@@ -28,25 +28,14 @@ module Rubocop
28
28
  private
29
29
 
30
30
  def check(node)
31
- method_length = calculate_length(node.loc.expression.source)
31
+ method_length = Util.source_length(node.loc.expression.source,
32
+ count_comments?)
32
33
 
33
34
  if method_length > max_length
34
35
  message = sprintf(MSG, method_length, max_length)
35
36
  convention(node, :keyword, message)
36
37
  end
37
38
  end
38
-
39
- def calculate_length(source)
40
- lines = source.lines.to_a[1...-1]
41
-
42
- return 0 unless lines
43
-
44
- lines.reject!(&:blank?)
45
-
46
- lines.reject! { |line| line =~ /^\s*#/ } unless count_comments?
47
-
48
- lines.size
49
- end
50
39
  end
51
40
  end
52
41
  end
@@ -0,0 +1,42 @@
1
+ # encoding: utf-8
2
+
3
+ module Rubocop
4
+ module Cop
5
+ module Style
6
+ # This cop makes sure that all methods use the configured style,
7
+ # snake_case or camelCase, for their names. Some special arrangements
8
+ # have to be made for operator methods.
9
+ class MethodName < Cop
10
+ include ConfigurableNaming
11
+
12
+ def on_def(node)
13
+ check(node, name_of_instance_method(node))
14
+ end
15
+
16
+ def on_defs(node)
17
+ check(node, name_of_singleton_method(node))
18
+ end
19
+
20
+ def name_of_instance_method(def_node)
21
+ expr = def_node.loc.expression
22
+ match = /^def(\s+)([\w]+[!?=]?\b)/.match(expr.source)
23
+ return unless match
24
+ space, method_name = match.captures
25
+ begin_pos = expr.begin_pos + 'def'.length + space.length
26
+ Parser::Source::Range.new(expr.source_buffer, begin_pos,
27
+ begin_pos + method_name.length)
28
+ end
29
+
30
+ def name_of_singleton_method(defs_node)
31
+ scope, method_name, _args, _body = *defs_node
32
+ after_dot(defs_node, method_name.length,
33
+ "def\s+" + Regexp.escape(scope.loc.expression.source))
34
+ end
35
+
36
+ def message(style)
37
+ format('Use %s for methods.', style)
38
+ end
39
+ end
40
+ end
41
+ end
42
+ end
@@ -30,6 +30,10 @@ module Rubocop
30
30
 
31
31
  if enough_digits?(value)
32
32
  int = integer_part(node)
33
+
34
+ # TODO: handle non-decimal literals as well
35
+ return if int.start_with?('0')
36
+
33
37
  if int =~ /\d{4}/ || int =~ /_\d{1,2}_/
34
38
  convention(node, :expression)
35
39
  end
@@ -12,7 +12,7 @@ module Rubocop
12
12
  convention(node, :expression)
13
13
  end
14
14
 
15
- def autocorrect_action(node)
15
+ def autocorrect(node)
16
16
  @corrections << lambda do |corrector|
17
17
  backref, = *node
18
18
 
@@ -0,0 +1,60 @@
1
+ # encoding: utf-8
2
+
3
+ module Rubocop
4
+ module Cop
5
+ module Style
6
+ # This cop checks the args passed to `fail` and `raise`.
7
+ class RaiseArgs < Cop
8
+ def on_send(node)
9
+ return unless command?(:raise, node) || command?(:fail, node)
10
+
11
+ case style
12
+ when :compact
13
+ check_compact(node)
14
+ when :exploded
15
+ check_exploded(node)
16
+ end
17
+ end
18
+
19
+ private
20
+
21
+ def check_compact(node)
22
+ _receiver, selector, *args = *node
23
+
24
+ return unless args.size > 1
25
+
26
+ convention(node, :expression, message(selector))
27
+ end
28
+
29
+ def check_exploded(node)
30
+ _receiver, selector, *args = *node
31
+
32
+ return unless args.size == 1
33
+
34
+ arg, = *args
35
+
36
+ if arg.type == :send && arg.loc.selector.is?('new')
37
+ convention(node, :expression, message(selector))
38
+ end
39
+ end
40
+
41
+ def style
42
+ case cop_config['EnforcedStyle']
43
+ when 'compact' then :compact
44
+ when 'exploded' then :exploded
45
+ else fail 'Unknown style selected!'
46
+ end
47
+ end
48
+
49
+ def message(method)
50
+ case style
51
+ when :compact
52
+ "Provide an exception object as an argument to #{method}."
53
+ when :exploded
54
+ "Provide an exception class and message as arguments to #{method}."
55
+ end
56
+ end
57
+ end
58
+ end
59
+ end
60
+ end
@@ -0,0 +1,32 @@
1
+ # encoding: utf-8
2
+
3
+ module Rubocop
4
+ module Cop
5
+ module Style
6
+ # This cop checks for RuntimeError as the argument of raise/fail.
7
+ #
8
+ # Currently it checks for code like this:
9
+ #
10
+ # @example
11
+ #
12
+ # raise RuntimeError, 'message'
13
+ class RedundantException < Cop
14
+ MSG = 'Redundant `RuntimeError` argument can be removed.'
15
+
16
+ TARGET_NODE = s(:const, nil, :RuntimeError)
17
+
18
+ def on_send(node)
19
+ return unless command?(:raise, node) || command?(:fail, node)
20
+
21
+ _receiver, _selector, *args = *node
22
+
23
+ return unless args.size == 2
24
+
25
+ first_arg, = *args
26
+
27
+ convention(first_arg, :expression) if first_arg == TARGET_NODE
28
+ end
29
+ end
30
+ end
31
+ end
32
+ end
@@ -37,10 +37,12 @@ module Rubocop
37
37
 
38
38
  private
39
39
 
40
- def autocorrect_action(node)
40
+ def autocorrect(node)
41
41
  @corrections << lambda do |corrector|
42
- corrector.replace(node.loc.expression,
43
- node.loc.expression.source.sub('return ', ''))
42
+ expr = node.loc.expression
43
+ replacement = expr.source.sub(/return\s*/, '')
44
+ replacement = "[#{replacement}]" if node.children.size > 1
45
+ corrector.replace(expr, replacement)
44
46
  end
45
47
  end
46
48
 
@@ -48,16 +50,23 @@ module Rubocop
48
50
  return unless node
49
51
 
50
52
  if node.type == :return
51
- convention(node, :keyword)
53
+ check_return_node(node)
52
54
  elsif node.type == :begin
53
55
  expressions = *node
54
56
  last_expr = expressions.last
55
57
 
56
58
  if last_expr && last_expr.type == :return
57
- convention(last_expr, :keyword)
59
+ check_return_node(last_expr)
58
60
  end
59
61
  end
60
62
  end
63
+
64
+ def check_return_node(node)
65
+ return if cop_config['AllowMultipleReturnValues'] &&
66
+ node.children.size > 1
67
+
68
+ convention(node, :keyword)
69
+ end
61
70
  end
62
71
  end
63
72
  end
@@ -101,7 +101,7 @@ module Rubocop
101
101
  end
102
102
  end
103
103
 
104
- def autocorrect_action(node)
104
+ def autocorrect(node)
105
105
  @corrections << lambda do |corrector|
106
106
  corrector.replace(node.loc.expression,
107
107
  node.loc.expression.source.gsub(/self\./, ''))
@@ -11,6 +11,15 @@ module Rubocop
11
11
  def investigate(processed_source)
12
12
  return unless processed_source.ast
13
13
 
14
+ unless cop_config['AllowAsExpressionSeparator']
15
+ check_for_expr_separator(processed_source)
16
+ end
17
+ check_for_line_terminator(processed_source)
18
+ end
19
+
20
+ private
21
+
22
+ def check_for_expr_separator(processed_source)
14
23
  on_node(:begin, processed_source.ast) do |node|
15
24
  exprs = node.children
16
25
 
@@ -30,12 +39,13 @@ module Rubocop
30
39
  convention(nil,
31
40
  source_range(processed_source.buffer,
32
41
  processed_source[0...(line - 1)],
33
- column, 1),
34
- MSG)
42
+ column, 1))
35
43
  end
36
44
  end
37
45
  end
46
+ end
38
47
 
48
+ def check_for_line_terminator(processed_source)
39
49
  tokens_for_lines = processed_source.tokens.group_by do |token|
40
50
  token.pos.line
41
51
  end
@@ -46,8 +56,7 @@ module Rubocop
46
56
  convention(nil,
47
57
  source_range(processed_source.buffer,
48
58
  processed_source[0...(line - 1)],
49
- column, 1),
50
- MSG)
59
+ column, 1))
51
60
  end
52
61
  end
53
62
  end
@@ -9,38 +9,87 @@ module Rubocop
9
9
  RAISE_MSG = 'Use `raise` instead of `fail` to rethrow exceptions.'
10
10
 
11
11
  def on_rescue(node)
12
- begin_node, rescue_node = *node
12
+ if style == :semantic
13
+ begin_node, rescue_node = *node
13
14
 
14
- check_for_raise(begin_node)
15
- check_for_fail(rescue_node)
15
+ check_for(:raise, begin_node)
16
+ check_for(:fail, rescue_node)
17
+ allow(:raise, rescue_node)
18
+ end
16
19
  end
17
20
 
18
- def autocorrect_action(node)
21
+ def on_send(node)
22
+ case style
23
+ when :semantic
24
+ check_for(:raise, node) unless ignored_node?(node)
25
+ when :raise
26
+ check_for(:raise, node)
27
+ when :fail
28
+ check_for(:fail, node)
29
+ end
30
+ end
31
+
32
+ def autocorrect(node)
19
33
  @corrections << lambda do |corrector|
20
- name = command?(:raise, node) ? 'fail' : 'raise'
34
+ name =
35
+ case style
36
+ when :semantic then command?(:raise, node) ? 'fail' : 'raise'
37
+ when :raise then 'raise'
38
+ when :fail then 'fail'
39
+ end
40
+
21
41
  corrector.replace(node.loc.selector, name)
22
42
  end
23
43
  end
24
44
 
25
45
  private
26
46
 
27
- def check_for_raise(node)
47
+ def style
48
+ case cop_config['EnforcedStyle']
49
+ when 'only_raise' then :raise
50
+ when 'only_fail' then :fail
51
+ when 'semantic' then :semantic
52
+ else fail 'Unknown style selected!'
53
+ end
54
+ end
55
+
56
+ def message(method_name)
57
+ case style
58
+ when :semantic
59
+ method_name == :fail ? RAISE_MSG : FAIL_MSG
60
+ when :raise
61
+ 'Always use `raise` to signal exceptions.'
62
+ when :fail
63
+ 'Always use `fail` to signal exceptions.'
64
+ end
65
+ end
66
+
67
+ def check_for(method_name, node)
28
68
  return unless node
29
69
 
30
- on_node(:send, node, :rescue) do |send_node|
31
- if command?(:raise, send_node)
32
- convention(send_node, :selector, FAIL_MSG)
70
+ if style == :semantic
71
+ each_command(method_name, node) do |send_node|
72
+ convention(send_node, :selector, message(method_name))
73
+ ignore_node(send_node)
74
+ end
75
+ else
76
+ _receiver, selector, _args = *node
77
+
78
+ if [:raise, :fail].include?(selector) && selector != method_name
79
+ convention(node, :selector, message(method_name))
33
80
  end
34
81
  end
35
82
  end
36
83
 
37
- def check_for_fail(node)
38
- return unless node
84
+ def allow(method_name, node)
85
+ each_command(method_name, node) do |send_node|
86
+ ignore_node(send_node)
87
+ end
88
+ end
39
89
 
90
+ def each_command(method_name, node)
40
91
  on_node(:send, node, :rescue) do |send_node|
41
- if command?(:fail, send_node)
42
- convention(send_node, :selector, RAISE_MSG)
43
- end
92
+ yield send_node if command?(method_name, send_node)
44
93
  end
45
94
  end
46
95
  end