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.
- checksums.yaml +4 -4
- data/.rubocop.yml +3 -0
- data/CHANGELOG.md +42 -0
- data/README.md +59 -54
- data/config/default.yml +124 -95
- data/config/disabled.yml +4 -0
- data/config/enabled.yml +286 -264
- data/lib/rubocop.rb +10 -3
- data/lib/rubocop/cli.rb +10 -171
- data/lib/rubocop/cop/cop.rb +14 -11
- data/lib/rubocop/cop/lint/debugger.rb +35 -0
- data/lib/rubocop/cop/lint/syntax.rb +34 -0
- data/lib/rubocop/cop/offence.rb +15 -23
- data/lib/rubocop/cop/style/align_array.rb +1 -10
- data/lib/rubocop/cop/style/align_hash.rb +14 -2
- data/lib/rubocop/cop/style/align_parameters.rb +1 -11
- data/lib/rubocop/cop/style/and_or.rb +13 -11
- data/lib/rubocop/cop/style/attr.rb +1 -1
- data/lib/rubocop/cop/style/autocorrect_alignment.rb +31 -6
- data/lib/rubocop/cop/style/blocks.rb +14 -6
- data/lib/rubocop/cop/style/character_literal.rb +1 -1
- data/lib/rubocop/cop/style/class_length.rb +38 -0
- data/lib/rubocop/cop/style/collection_methods.rb +1 -1
- data/lib/rubocop/cop/style/colon_method_call.rb +1 -1
- data/lib/rubocop/cop/style/configurable_naming.rb +47 -0
- data/lib/rubocop/cop/style/def_parentheses.rb +2 -2
- data/lib/rubocop/cop/style/empty_literal.rb +1 -1
- data/lib/rubocop/cop/style/even_odd.rb +7 -3
- data/lib/rubocop/cop/style/hash_methods.rb +1 -1
- data/lib/rubocop/cop/style/hash_syntax.rb +36 -7
- data/lib/rubocop/cop/style/lambda_call.rb +36 -11
- data/lib/rubocop/cop/style/method_call_parentheses.rb +1 -1
- data/lib/rubocop/cop/style/method_called_on_do_end_block.rb +41 -0
- data/lib/rubocop/cop/style/method_length.rb +2 -13
- data/lib/rubocop/cop/style/method_name.rb +42 -0
- data/lib/rubocop/cop/style/numeric_literals.rb +4 -0
- data/lib/rubocop/cop/style/perl_backrefs.rb +1 -1
- data/lib/rubocop/cop/style/raise_args.rb +60 -0
- data/lib/rubocop/cop/style/redundant_exception.rb +32 -0
- data/lib/rubocop/cop/style/redundant_return.rb +14 -5
- data/lib/rubocop/cop/style/redundant_self.rb +1 -1
- data/lib/rubocop/cop/style/semicolon.rb +13 -4
- data/lib/rubocop/cop/style/signal_exception.rb +63 -14
- data/lib/rubocop/cop/style/special_global_vars.rb +1 -1
- data/lib/rubocop/cop/style/string_help.rb +4 -1
- data/lib/rubocop/cop/style/string_literals.rb +34 -11
- data/lib/rubocop/cop/style/surrounding_space.rb +64 -17
- data/lib/rubocop/cop/style/tab.rb +1 -1
- data/lib/rubocop/cop/style/variable_name.rb +44 -0
- data/lib/rubocop/cop/style/when_then.rb +1 -1
- data/lib/rubocop/cop/style/while_until_do.rb +1 -1
- data/lib/rubocop/cop/team.rb +4 -7
- data/lib/rubocop/cop/util.rb +12 -0
- data/lib/rubocop/formatter/clang_style_formatter.rb +1 -1
- data/lib/rubocop/formatter/emacs_style_formatter.rb +5 -2
- data/lib/rubocop/formatter/json_formatter.rb +1 -0
- data/lib/rubocop/formatter/progress_formatter.rb +9 -13
- data/lib/rubocop/formatter/simple_text_formatter.rb +63 -15
- data/lib/rubocop/options.rb +184 -0
- data/lib/rubocop/processed_source.rb +4 -0
- data/lib/rubocop/version.rb +1 -1
- data/rubocop.gemspec +1 -1
- data/spec/rubocop/cli_spec.rb +870 -1001
- data/spec/rubocop/config_spec.rb +13 -13
- data/spec/rubocop/config_store_spec.rb +38 -37
- data/spec/rubocop/cop/commissioner_spec.rb +42 -46
- data/spec/rubocop/cop/cop_spec.rb +72 -77
- data/spec/rubocop/cop/corrector_spec.rb +51 -55
- data/spec/rubocop/cop/lint/assignment_in_condition_spec.rb +100 -106
- data/spec/rubocop/cop/lint/block_alignment_spec.rb +403 -409
- data/spec/rubocop/cop/lint/debugger_spec.rb +39 -0
- data/spec/rubocop/cop/lint/empty_ensure_spec.rb +19 -25
- data/spec/rubocop/cop/lint/end_alignment_spec.rb +50 -56
- data/spec/rubocop/cop/lint/end_in_method_spec.rb +20 -26
- data/spec/rubocop/cop/lint/ensure_return_spec.rb +30 -36
- data/spec/rubocop/cop/lint/eval_spec.rb +25 -31
- data/spec/rubocop/cop/lint/handle_exceptions_spec.rb +22 -28
- data/spec/rubocop/cop/lint/literal_in_condition_spec.rb +51 -57
- data/spec/rubocop/cop/lint/loop_spec.rb +17 -23
- data/spec/rubocop/cop/lint/parentheses_as_grouped_expression_spec.rb +51 -57
- data/spec/rubocop/cop/lint/rescue_exception_spec.rb +105 -111
- data/spec/rubocop/cop/lint/shadowing_outer_local_variable_spec.rb +230 -236
- data/spec/rubocop/cop/lint/syntax_spec.rb +33 -0
- data/spec/rubocop/cop/lint/unreachable_code_spec.rb +51 -57
- data/spec/rubocop/cop/lint/useless_assignment_spec.rb +1544 -1550
- data/spec/rubocop/cop/lint/useless_comparison_spec.rb +21 -27
- data/spec/rubocop/cop/lint/useless_setter_call_spec.rb +119 -125
- data/spec/rubocop/cop/lint/void_spec.rb +50 -56
- data/spec/rubocop/cop/offence_spec.rb +101 -131
- data/spec/rubocop/cop/rails/has_and_belongs_to_many_spec.rb +6 -12
- data/spec/rubocop/cop/rails/read_attribute_spec.rb +6 -12
- data/spec/rubocop/cop/rails/validation_spec.rb +13 -19
- data/spec/rubocop/cop/style/access_control_spec.rb +146 -152
- data/spec/rubocop/cop/style/alias_spec.rb +30 -36
- data/spec/rubocop/cop/style/align_array_spec.rb +57 -56
- data/spec/rubocop/cop/style/align_hash_spec.rb +256 -237
- data/spec/rubocop/cop/style/align_parameters_spec.rb +216 -202
- data/spec/rubocop/cop/style/and_or_spec.rb +51 -55
- data/spec/rubocop/cop/style/ascii_comments_spec.rb +14 -20
- data/spec/rubocop/cop/style/ascii_identifiers_spec.rb +26 -32
- data/spec/rubocop/cop/style/attr_spec.rb +11 -17
- data/spec/rubocop/cop/style/begin_block_spec.rb +6 -12
- data/spec/rubocop/cop/style/block_comments_spec.rb +13 -19
- data/spec/rubocop/cop/style/block_nesting_spec.rb +134 -140
- data/spec/rubocop/cop/style/blocks_spec.rb +81 -84
- data/spec/rubocop/cop/style/case_equality_spec.rb +5 -11
- data/spec/rubocop/cop/style/case_indentation_spec.rb +71 -77
- data/spec/rubocop/cop/style/character_literal_spec.rb +31 -37
- data/spec/rubocop/cop/style/class_and_module_camel_case_spec.rb +31 -37
- data/spec/rubocop/cop/style/class_length_spec.rb +65 -0
- data/spec/rubocop/cop/style/class_methods_spec.rb +35 -41
- data/spec/rubocop/cop/style/class_vars_spec.rb +11 -17
- data/spec/rubocop/cop/style/collection_methods_spec.rb +41 -47
- data/spec/rubocop/cop/style/colon_method_call_spec.rb +45 -51
- data/spec/rubocop/cop/style/comment_annotation_spec.rb +79 -85
- data/spec/rubocop/cop/style/constant_name_spec.rb +45 -51
- data/spec/rubocop/cop/style/def_with_parentheses_spec.rb +28 -34
- data/spec/rubocop/cop/style/def_without_parentheses_spec.rb +23 -29
- data/spec/rubocop/cop/style/documentation_spec.rb +60 -66
- data/spec/rubocop/cop/style/dot_position_spec.rb +50 -56
- data/spec/rubocop/cop/style/empty_line_between_defs_spec.rb +109 -110
- data/spec/rubocop/cop/style/empty_lines_spec.rb +28 -34
- data/spec/rubocop/cop/style/empty_literal_spec.rb +80 -86
- data/spec/rubocop/cop/style/encoding_spec.rb +50 -56
- data/spec/rubocop/cop/style/end_block_spec.rb +6 -12
- data/spec/rubocop/cop/style/end_of_line_spec.rb +13 -19
- data/spec/rubocop/cop/style/even_odd_spec.rb +69 -41
- data/spec/rubocop/cop/style/favor_join_spec.rb +21 -27
- data/spec/rubocop/cop/style/favor_modifier_spec.rb +180 -176
- data/spec/rubocop/cop/style/favor_sprintf_spec.rb +41 -47
- data/spec/rubocop/cop/style/favor_unless_over_negated_if_spec.rb +63 -69
- data/spec/rubocop/cop/style/favor_until_over_negated_while_spec.rb +32 -38
- data/spec/rubocop/cop/style/final_newline_spec.rb +16 -22
- data/spec/rubocop/cop/style/for_spec.rb +18 -24
- data/spec/rubocop/cop/style/global_vars_spec.rb +23 -29
- data/spec/rubocop/cop/style/hash_methods_spec.rb +39 -45
- data/spec/rubocop/cop/style/hash_syntax_spec.rb +93 -65
- data/spec/rubocop/cop/style/if_with_semicolon_spec.rb +11 -17
- data/spec/rubocop/cop/style/indentation_width_spec.rb +377 -383
- data/spec/rubocop/cop/style/lambda_call_spec.rb +40 -22
- data/spec/rubocop/cop/style/lambda_spec.rb +30 -34
- data/spec/rubocop/cop/style/leading_comment_space_spec.rb +44 -50
- data/spec/rubocop/cop/style/line_length_spec.rb +11 -17
- data/spec/rubocop/cop/style/method_call_parentheses_spec.rb +14 -20
- data/spec/rubocop/cop/style/method_called_on_do_end_block_spec.rb +60 -0
- data/spec/rubocop/cop/style/method_length_spec.rb +127 -133
- data/spec/rubocop/cop/style/method_name_spec.rb +103 -0
- data/spec/rubocop/cop/style/module_function_spec.rb +16 -22
- data/spec/rubocop/cop/style/multiline_block_chain_spec.rb +64 -70
- data/spec/rubocop/cop/style/multiline_if_then_spec.rb +74 -80
- data/spec/rubocop/cop/style/nil_comparison_spec.rb +20 -26
- data/spec/rubocop/cop/style/not_spec.rb +13 -19
- data/spec/rubocop/cop/style/numeric_literals_spec.rb +36 -35
- data/spec/rubocop/cop/style/one_line_conditional_spec.rb +5 -11
- data/spec/rubocop/cop/style/op_method_spec.rb +61 -67
- data/spec/rubocop/cop/style/parameter_lists_spec.rb +31 -37
- data/spec/rubocop/cop/style/parentheses_around_condition_spec.rb +62 -68
- data/spec/rubocop/cop/style/perl_backrefs_spec.rb +9 -15
- data/spec/rubocop/cop/style/proc_spec.rb +13 -19
- data/spec/rubocop/cop/style/raise_args_spec.rb +55 -0
- data/spec/rubocop/cop/style/reduce_arguments_spec.rb +49 -55
- data/spec/rubocop/cop/style/redundant_begin_spec.rb +47 -53
- data/spec/rubocop/cop/style/redundant_exception_spec.rb +27 -0
- data/spec/rubocop/cop/style/redundant_return_spec.rb +164 -72
- data/spec/rubocop/cop/style/redundant_self_spec.rb +109 -115
- data/spec/rubocop/cop/style/regexp_literal_spec.rb +57 -63
- data/spec/rubocop/cop/style/rescue_modifier_spec.rb +99 -105
- data/spec/rubocop/cop/style/semicolon_spec.rb +95 -90
- data/spec/rubocop/cop/style/signal_exception_spec.rb +248 -95
- data/spec/rubocop/cop/style/single_line_methods_spec.rb +45 -51
- data/spec/rubocop/cop/style/space_after_colon_spec.rb +14 -20
- data/spec/rubocop/cop/style/space_after_comma_spec.rb +16 -22
- data/spec/rubocop/cop/style/space_after_control_keyword_spec.rb +48 -54
- data/spec/rubocop/cop/style/space_after_method_name_spec.rb +49 -55
- data/spec/rubocop/cop/style/space_after_semicolon_spec.rb +10 -16
- data/spec/rubocop/cop/style/space_around_block_braces_spec.rb +118 -50
- data/spec/rubocop/cop/style/space_around_equals_in_default_parameter_spec.rb +18 -24
- data/spec/rubocop/cop/style/space_around_operators_spec.rb +204 -210
- data/spec/rubocop/cop/style/space_before_modifier_keyword_spec.rb +36 -42
- data/spec/rubocop/cop/style/space_inside_brackets_spec.rb +39 -45
- data/spec/rubocop/cop/style/space_inside_hash_literal_braces_spec.rb +62 -68
- data/spec/rubocop/cop/style/space_inside_parens_spec.rb +18 -24
- data/spec/rubocop/cop/style/special_global_vars_spec.rb +40 -46
- data/spec/rubocop/cop/style/string_literals_spec.rb +148 -70
- data/spec/rubocop/cop/style/symbol_array_spec.rb +28 -34
- data/spec/rubocop/cop/style/symbol_name_spec.rb +132 -138
- data/spec/rubocop/cop/style/tab_spec.rb +9 -15
- data/spec/rubocop/cop/style/ternary_operator_spec.rb +25 -31
- data/spec/rubocop/cop/style/trailing_blank_lines_spec.rb +10 -16
- data/spec/rubocop/cop/style/trailing_whitespace_spec.rb +14 -20
- data/spec/rubocop/cop/style/trivial_accessors_spec.rb +374 -380
- data/spec/rubocop/cop/style/unless_else_spec.rb +17 -23
- data/spec/rubocop/cop/style/variable_interpolation_spec.rb +36 -42
- data/spec/rubocop/cop/style/variable_name_spec.rb +83 -0
- data/spec/rubocop/cop/style/when_then_spec.rb +31 -37
- data/spec/rubocop/cop/style/while_until_do_spec.rb +47 -53
- data/spec/rubocop/cop/style/word_array_spec.rb +49 -55
- data/spec/rubocop/cop/team_spec.rb +125 -127
- data/spec/rubocop/cop/variable_inspector/assignment_spec.rb +176 -180
- data/spec/rubocop/cop/variable_inspector/locatable_spec.rb +580 -586
- data/spec/rubocop/cop/variable_inspector/scope_spec.rb +140 -146
- data/spec/rubocop/cop/variable_inspector/variable_spec.rb +52 -58
- data/spec/rubocop/cop/variable_inspector/variable_table_spec.rb +217 -223
- data/spec/rubocop/cop/variable_inspector_spec.rb +15 -19
- data/spec/rubocop/formatter/clang_style_formatter_spec.rb +35 -36
- data/spec/rubocop/formatter/disabled_config_formatter_spec.rb +2 -2
- data/spec/rubocop/formatter/emacs_style_formatter_spec.rb +24 -1
- data/spec/rubocop/formatter/file_list_formatter_spec.rb +1 -1
- data/spec/rubocop/formatter/formatter_set_spec.rb +3 -3
- data/spec/rubocop/formatter/json_formatter_spec.rb +7 -2
- data/spec/rubocop/formatter/offence_count_formatter_spec.rb +1 -1
- data/spec/rubocop/formatter/progress_formatter_spec.rb +1 -1
- data/spec/rubocop/formatter/simple_text_formatter_spec.rb +55 -6
- data/spec/rubocop/options_spec.rb +233 -0
- data/spec/rubocop/processed_source_spec.rb +85 -42
- data/spec/rubocop/source_parser_spec.rb +108 -110
- data/spec/rubocop/target_finder_spec.rb +125 -127
- data/spec/rubocop/token_spec.rb +15 -17
- metadata +32 -8
- data/lib/rubocop/backports/bsearch.rb +0 -39
- data/lib/rubocop/cop/style/method_and_variable_snake_case.rb +0 -77
- 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
|
-
#
|
22
|
-
return unless selector == :call
|
19
|
+
# we care only about `call` methods
|
20
|
+
return unless selector == :call
|
23
21
|
|
24
|
-
|
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
|
30
|
+
def autocorrect(node)
|
28
31
|
@corrections << lambda do |corrector|
|
29
|
-
|
30
|
-
|
31
|
-
|
32
|
-
|
33
|
-
|
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
|
@@ -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 =
|
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
|
@@ -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
|
40
|
+
def autocorrect(node)
|
41
41
|
@corrections << lambda do |corrector|
|
42
|
-
|
43
|
-
|
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
|
-
|
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
|
-
|
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
|
@@ -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
|
-
|
12
|
+
if style == :semantic
|
13
|
+
begin_node, rescue_node = *node
|
13
14
|
|
14
|
-
|
15
|
-
|
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
|
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 =
|
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
|
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
|
-
|
31
|
-
|
32
|
-
convention(send_node, :selector,
|
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
|
38
|
-
|
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?(
|
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
|