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
@@ -2,62 +2,58 @@
|
|
2
2
|
|
3
3
|
require 'spec_helper'
|
4
4
|
|
5
|
-
|
6
|
-
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
node = processed_source.ast
|
15
|
-
corrector.remove(node.loc.operator)
|
16
|
-
end
|
17
|
-
|
18
|
-
corrector = Corrector.new(processed_source.buffer, [correction])
|
19
|
-
expect(corrector.rewrite).to eq 'true false'
|
20
|
-
end
|
21
|
-
|
22
|
-
it 'allows insertion before a source range' do
|
23
|
-
source = 'true and false'
|
24
|
-
processed_source = parse_source(source)
|
25
|
-
|
26
|
-
correction = lambda do |corrector|
|
27
|
-
node = processed_source.ast
|
28
|
-
corrector.insert_before(node.loc.operator, ';nil ')
|
29
|
-
end
|
30
|
-
|
31
|
-
corrector = Corrector.new(processed_source.buffer, [correction])
|
32
|
-
expect(corrector.rewrite).to eq 'true ;nil and false'
|
33
|
-
end
|
34
|
-
|
35
|
-
it 'allows insertion after a source range' do
|
36
|
-
source = 'true and false'
|
37
|
-
processed_source = parse_source(source)
|
38
|
-
|
39
|
-
correction = lambda do |corrector|
|
40
|
-
node = processed_source.ast
|
41
|
-
corrector.insert_after(node.loc.operator, ' nil;')
|
42
|
-
end
|
43
|
-
|
44
|
-
corrector = Corrector.new(processed_source.buffer, [correction])
|
45
|
-
expect(corrector.rewrite).to eq 'true and nil; false'
|
46
|
-
end
|
47
|
-
|
48
|
-
it 'allows replacement of a range' do
|
49
|
-
source = 'true and false'
|
50
|
-
processed_source = parse_source(source)
|
51
|
-
|
52
|
-
correction = lambda do |corrector|
|
53
|
-
node = processed_source.ast
|
54
|
-
corrector.replace(node.loc.operator, 'or')
|
55
|
-
end
|
56
|
-
|
57
|
-
corrector = Corrector.new(processed_source.buffer, [correction])
|
58
|
-
expect(corrector.rewrite).to eq 'true or false'
|
59
|
-
end
|
5
|
+
describe Rubocop::Cop::Corrector do
|
6
|
+
describe '#rewrite' do
|
7
|
+
it 'allows removal of a range' do
|
8
|
+
source = 'true and false'
|
9
|
+
processed_source = parse_source(source)
|
10
|
+
|
11
|
+
correction = lambda do |corrector|
|
12
|
+
node = processed_source.ast
|
13
|
+
corrector.remove(node.loc.operator)
|
60
14
|
end
|
15
|
+
|
16
|
+
corrector = described_class.new(processed_source.buffer, [correction])
|
17
|
+
expect(corrector.rewrite).to eq 'true false'
|
18
|
+
end
|
19
|
+
|
20
|
+
it 'allows insertion before a source range' do
|
21
|
+
source = 'true and false'
|
22
|
+
processed_source = parse_source(source)
|
23
|
+
|
24
|
+
correction = lambda do |corrector|
|
25
|
+
node = processed_source.ast
|
26
|
+
corrector.insert_before(node.loc.operator, ';nil ')
|
27
|
+
end
|
28
|
+
|
29
|
+
corrector = described_class.new(processed_source.buffer, [correction])
|
30
|
+
expect(corrector.rewrite).to eq 'true ;nil and false'
|
31
|
+
end
|
32
|
+
|
33
|
+
it 'allows insertion after a source range' do
|
34
|
+
source = 'true and false'
|
35
|
+
processed_source = parse_source(source)
|
36
|
+
|
37
|
+
correction = lambda do |corrector|
|
38
|
+
node = processed_source.ast
|
39
|
+
corrector.insert_after(node.loc.operator, ' nil;')
|
40
|
+
end
|
41
|
+
|
42
|
+
corrector = described_class.new(processed_source.buffer, [correction])
|
43
|
+
expect(corrector.rewrite).to eq 'true and nil; false'
|
44
|
+
end
|
45
|
+
|
46
|
+
it 'allows replacement of a range' do
|
47
|
+
source = 'true and false'
|
48
|
+
processed_source = parse_source(source)
|
49
|
+
|
50
|
+
correction = lambda do |corrector|
|
51
|
+
node = processed_source.ast
|
52
|
+
corrector.replace(node.loc.operator, 'or')
|
53
|
+
end
|
54
|
+
|
55
|
+
corrector = described_class.new(processed_source.buffer, [correction])
|
56
|
+
expect(corrector.rewrite).to eq 'true or false'
|
61
57
|
end
|
62
58
|
end
|
63
59
|
end
|
@@ -2,112 +2,106 @@
|
|
2
2
|
|
3
3
|
require 'spec_helper'
|
4
4
|
|
5
|
-
|
6
|
-
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
|
24
|
-
|
25
|
-
|
26
|
-
|
27
|
-
|
28
|
-
|
29
|
-
|
30
|
-
|
31
|
-
|
32
|
-
|
33
|
-
|
34
|
-
|
35
|
-
|
36
|
-
|
37
|
-
|
38
|
-
|
39
|
-
|
40
|
-
|
41
|
-
|
42
|
-
|
43
|
-
|
44
|
-
|
45
|
-
|
46
|
-
|
47
|
-
|
48
|
-
|
49
|
-
|
50
|
-
|
51
|
-
|
52
|
-
|
53
|
-
|
54
|
-
|
55
|
-
|
56
|
-
|
57
|
-
|
58
|
-
|
59
|
-
|
60
|
-
|
61
|
-
|
62
|
-
|
63
|
-
|
64
|
-
|
65
|
-
|
66
|
-
|
67
|
-
|
68
|
-
|
69
|
-
|
70
|
-
|
71
|
-
|
72
|
-
|
73
|
-
|
74
|
-
|
75
|
-
|
76
|
-
|
77
|
-
|
78
|
-
|
79
|
-
|
80
|
-
|
81
|
-
|
82
|
-
|
83
|
-
|
84
|
-
|
85
|
-
|
86
|
-
|
87
|
-
|
88
|
-
|
89
|
-
|
90
|
-
|
91
|
-
|
92
|
-
|
93
|
-
|
94
|
-
|
95
|
-
|
96
|
-
|
97
|
-
|
98
|
-
|
99
|
-
|
100
|
-
|
101
|
-
|
102
|
-
|
103
|
-
|
104
|
-
|
105
|
-
'end'
|
106
|
-
])
|
107
|
-
expect(cop.offences.size).to eq(1)
|
108
|
-
end
|
109
|
-
end
|
110
|
-
end
|
5
|
+
describe Rubocop::Cop::Lint::AssignmentInCondition, :config do
|
6
|
+
subject(:cop) { described_class.new(config) }
|
7
|
+
let(:cop_config) { { 'AllowSafeAssignment' => true } }
|
8
|
+
|
9
|
+
it 'registers an offence for lvar assignment in condition' do
|
10
|
+
inspect_source(cop,
|
11
|
+
['if test = 10',
|
12
|
+
'end'
|
13
|
+
])
|
14
|
+
expect(cop.offences.size).to eq(1)
|
15
|
+
end
|
16
|
+
|
17
|
+
it 'registers an offence for lvar assignment in while condition' do
|
18
|
+
inspect_source(cop,
|
19
|
+
['while test = 10',
|
20
|
+
'end'
|
21
|
+
])
|
22
|
+
expect(cop.offences.size).to eq(1)
|
23
|
+
end
|
24
|
+
|
25
|
+
it 'registers an offence for lvar assignment in until condition' do
|
26
|
+
inspect_source(cop,
|
27
|
+
['until test = 10',
|
28
|
+
'end'
|
29
|
+
])
|
30
|
+
expect(cop.offences.size).to eq(1)
|
31
|
+
end
|
32
|
+
|
33
|
+
it 'registers an offence for ivar assignment in condition' do
|
34
|
+
inspect_source(cop,
|
35
|
+
['if @test = 10',
|
36
|
+
'end'
|
37
|
+
])
|
38
|
+
expect(cop.offences.size).to eq(1)
|
39
|
+
end
|
40
|
+
|
41
|
+
it 'registers an offence for clvar assignment in condition' do
|
42
|
+
inspect_source(cop,
|
43
|
+
['if @@test = 10',
|
44
|
+
'end'
|
45
|
+
])
|
46
|
+
expect(cop.offences.size).to eq(1)
|
47
|
+
end
|
48
|
+
|
49
|
+
it 'registers an offence for gvar assignment in condition' do
|
50
|
+
inspect_source(cop,
|
51
|
+
['if $test = 10',
|
52
|
+
'end'
|
53
|
+
])
|
54
|
+
expect(cop.offences.size).to eq(1)
|
55
|
+
end
|
56
|
+
|
57
|
+
it 'registers an offence for constant assignment in condition' do
|
58
|
+
inspect_source(cop,
|
59
|
+
['if TEST = 10',
|
60
|
+
'end'
|
61
|
+
])
|
62
|
+
expect(cop.offences.size).to eq(1)
|
63
|
+
end
|
64
|
+
|
65
|
+
it 'accepts == in condition' do
|
66
|
+
inspect_source(cop,
|
67
|
+
['if test == 10',
|
68
|
+
'end'
|
69
|
+
])
|
70
|
+
expect(cop.offences).to be_empty
|
71
|
+
end
|
72
|
+
|
73
|
+
it 'accepts = in a block that is called in a condition' do
|
74
|
+
inspect_source(cop,
|
75
|
+
['return 1 if any_errors? { o = inspect(file) }'])
|
76
|
+
expect(cop.offences).to be_empty
|
77
|
+
end
|
78
|
+
|
79
|
+
it 'accepts ||= in condition' do
|
80
|
+
inspect_source(cop,
|
81
|
+
['raise StandardError unless foo ||= bar'])
|
82
|
+
expect(cop.offences).to be_empty
|
83
|
+
end
|
84
|
+
|
85
|
+
context 'safe assignment is allowed' do
|
86
|
+
it 'accepts = in condition surrounded with braces' do
|
87
|
+
inspect_source(cop,
|
88
|
+
['if (test = 10)',
|
89
|
+
'end'
|
90
|
+
])
|
91
|
+
expect(cop.offences).to be_empty
|
92
|
+
end
|
93
|
+
|
94
|
+
end
|
95
|
+
|
96
|
+
context 'safe assignment is not allowed' do
|
97
|
+
let(:cop_config) { { 'AllowSafeAssignment' => false } }
|
98
|
+
|
99
|
+
it 'does not accepts = in condition surrounded with braces' do
|
100
|
+
inspect_source(cop,
|
101
|
+
['if (test = 10)',
|
102
|
+
'end'
|
103
|
+
])
|
104
|
+
expect(cop.offences.size).to eq(1)
|
111
105
|
end
|
112
106
|
end
|
113
107
|
end
|
@@ -3,415 +3,409 @@
|
|
3
3
|
|
4
4
|
require 'spec_helper'
|
5
5
|
|
6
|
-
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
|
24
|
-
|
25
|
-
|
26
|
-
|
27
|
-
|
28
|
-
'end',
|
29
|
-
])
|
30
|
-
expect(cop.offences).to be_empty
|
31
|
-
end
|
32
|
-
end
|
33
|
-
|
34
|
-
it 'accepts end aligned with a variable' do
|
35
|
-
inspect_source(cop,
|
36
|
-
['variable = test do |ala|',
|
37
|
-
'end'
|
38
|
-
])
|
39
|
-
expect(cop.offences).to be_empty
|
40
|
-
end
|
41
|
-
|
42
|
-
context 'when there is an assignment chain' do
|
43
|
-
it 'registers an offence for an end aligned with the 2nd variable' do
|
44
|
-
inspect_source(cop,
|
45
|
-
['a = b = c = test do |ala|',
|
46
|
-
' end'
|
47
|
-
])
|
48
|
-
expect(cop.messages)
|
49
|
-
.to eq(['end at 2, 4 is not aligned with a = b = c = test do |ala| at 1, 0'])
|
50
|
-
end
|
51
|
-
|
52
|
-
it 'accepts end aligned with the first variable' do
|
53
|
-
inspect_source(cop,
|
54
|
-
['a = b = c = test do |ala|',
|
55
|
-
'end',
|
56
|
-
])
|
57
|
-
expect(cop.offences).to be_empty
|
58
|
-
end
|
59
|
-
end
|
60
|
-
|
61
|
-
context 'and the block is an operand' do
|
62
|
-
it 'accepts end aligned with a variable' do
|
63
|
-
inspect_source(cop,
|
64
|
-
['b = 1 + preceding_line.reduce(0) do |a, e|',
|
65
|
-
' a + e.length + newline_length',
|
66
|
-
'end + 1'
|
67
|
-
])
|
68
|
-
expect(cop.offences).to be_empty
|
69
|
-
end
|
70
|
-
end
|
71
|
-
|
72
|
-
it 'registers an offence for mismatched block end with a variable' do
|
73
|
-
inspect_source(cop,
|
74
|
-
['variable = test do |ala|',
|
75
|
-
' end'
|
76
|
-
])
|
77
|
-
expect(cop.messages)
|
78
|
-
.to eq(['end at 2, 2 is not aligned with variable = test do |ala| at 1, 0'])
|
79
|
-
end
|
80
|
-
|
81
|
-
context 'when the block is defined on the next line' do
|
82
|
-
it 'accepts end aligned with the block expression' do
|
83
|
-
inspect_source(cop,
|
84
|
-
['variable =',
|
85
|
-
' a_long_method_that_dont_fit_on_the_line do |v|',
|
86
|
-
' v.foo',
|
87
|
-
' end'
|
88
|
-
])
|
89
|
-
expect(cop.offences).to be_empty
|
90
|
-
end
|
91
|
-
|
92
|
-
it 'registers an offences for mismatched end alignment' do
|
93
|
-
inspect_source(cop,
|
94
|
-
['variable =',
|
95
|
-
' a_long_method_that_dont_fit_on_the_line do |v|',
|
96
|
-
' v.foo',
|
97
|
-
'end'
|
98
|
-
])
|
99
|
-
expect(cop.messages)
|
100
|
-
.to eq(['end at 4, 0 is not aligned with a_long_method_that_dont_fit_on_the_line ' +
|
101
|
-
'do |v| at 2, 2'])
|
102
|
-
end
|
103
|
-
end
|
104
|
-
|
105
|
-
context 'when the method part is a call chain that spans several lines' do
|
106
|
-
# Example from issue 346 of bbatsov/rubocop on github:
|
107
|
-
it 'accepts pretty alignment style' do
|
108
|
-
src = ['def foo(bar)',
|
109
|
-
' bar.get_stuffs',
|
110
|
-
' .reject do |stuff| ',
|
111
|
-
' stuff.with_a_very_long_expression_that_doesnt_fit_the_line',
|
112
|
-
' end.select do |stuff|',
|
113
|
-
' stuff.another_very_long_expression_that_doesnt_fit_the_line',
|
114
|
-
' end',
|
115
|
-
' .select do |stuff|',
|
116
|
-
' stuff.another_very_long_expression_that_doesnt_fit_the_line',
|
117
|
-
' end',
|
118
|
-
'end']
|
119
|
-
inspect_source(cop, src)
|
120
|
-
expect(cop.offences).to be_empty
|
121
|
-
end
|
122
|
-
|
123
|
-
it 'registers offences for misaligned ends' do
|
124
|
-
src = ['def foo(bar)',
|
125
|
-
' bar.get_stuffs',
|
126
|
-
' .reject do |stuff|',
|
127
|
-
' stuff.with_a_very_long_expression_that_doesnt_fit_the_line',
|
128
|
-
' end.select do |stuff|',
|
129
|
-
' stuff.another_very_long_expression_that_doesnt_fit_the_line',
|
130
|
-
' end',
|
131
|
-
' .select do |stuff|',
|
132
|
-
' stuff.another_very_long_expression_that_doesnt_fit_the_line',
|
133
|
-
' end',
|
134
|
-
'end']
|
135
|
-
inspect_source(cop, src)
|
136
|
-
expect(cop.messages)
|
137
|
-
.to eq(['end at 10, 8 is not aligned with bar.get_stuffs at 2, 2 or' +
|
138
|
-
' .select do |stuff| at 8, 6',
|
139
|
-
'end at 7, 4 is not aligned with bar.get_stuffs at 2, 2 or' +
|
140
|
-
' end.select do |stuff| at 5, 8',
|
141
|
-
'end at 5, 8 is not aligned with bar.get_stuffs at 2, 2 or' +
|
142
|
-
' .reject do |stuff| at 3, 6'])
|
143
|
-
end
|
144
|
-
|
145
|
-
# Example from issue 393 of bbatsov/rubocop on github:
|
146
|
-
it 'accepts end indented as the start of the block' do
|
147
|
-
src = ['my_object.chaining_this_very_long_method(with_a_parameter)',
|
148
|
-
' .and_one_with_a_block do',
|
149
|
-
' do_something',
|
150
|
-
'end',
|
151
|
-
'', # Other variant:
|
152
|
-
'my_object.chaining_this_very_long_method(',
|
153
|
-
' with_a_parameter).and_one_with_a_block do',
|
154
|
-
' do_something',
|
155
|
-
'end']
|
156
|
-
inspect_source(cop, src)
|
157
|
-
expect(cop.offences).to be_empty
|
158
|
-
end
|
159
|
-
|
160
|
-
# Example from issue 447 of bbatsov/rubocop on github:
|
161
|
-
it 'accepts two kinds of end alignment' do
|
162
|
-
src = [
|
163
|
-
# Aligned with start of line where do is:
|
164
|
-
'params = default_options.merge(options)',
|
165
|
-
' .delete_if { |k, v| v.nil? }',
|
166
|
-
' .each_with_object({}) do |(k, v), new_hash|',
|
167
|
-
' new_hash[k.to_s] = v.to_s',
|
168
|
-
' end',
|
169
|
-
# Aligned with start of the whole expression:
|
170
|
-
'params = default_options.merge(options)',
|
171
|
-
' .delete_if { |k, v| v.nil? }',
|
172
|
-
' .each_with_object({}) do |(k, v), new_hash|',
|
173
|
-
' new_hash[k.to_s] = v.to_s',
|
174
|
-
'end'
|
175
|
-
]
|
176
|
-
inspect_source(cop, src)
|
177
|
-
expect(cop.offences).to be_empty
|
178
|
-
end
|
179
|
-
end
|
180
|
-
|
181
|
-
context 'when variables of a mass assignment spans several lines' do
|
182
|
-
it 'accepts end aligned with the variables' do
|
183
|
-
src = ['e,',
|
184
|
-
'f = [5, 6].map do |i|',
|
185
|
-
' i - 5',
|
186
|
-
'end']
|
187
|
-
inspect_source(cop, src)
|
188
|
-
expect(cop.offences).to be_empty
|
189
|
-
end
|
190
|
-
|
191
|
-
it 'registers an offence for end aligned with the block' do
|
192
|
-
src = ['e,',
|
193
|
-
'f = [5, 6].map do |i|',
|
194
|
-
' i - 5',
|
195
|
-
' end']
|
196
|
-
inspect_source(cop, src)
|
197
|
-
expect(cop.messages)
|
198
|
-
.to eq(['end at 4, 4 is not aligned with e, at 1, 0 or f = [5, 6].map do |i| at 2, 0'])
|
199
|
-
end
|
200
|
-
end
|
201
|
-
|
202
|
-
it 'accepts end aligned with an instance variable' do
|
203
|
-
inspect_source(cop,
|
204
|
-
['@variable = test do |ala|',
|
205
|
-
'end'
|
206
|
-
])
|
207
|
-
expect(cop.offences).to be_empty
|
208
|
-
end
|
209
|
-
|
210
|
-
it 'registers an offence for mismatched block end with an instance variable' do
|
211
|
-
inspect_source(cop,
|
212
|
-
['@variable = test do |ala|',
|
213
|
-
' end'
|
214
|
-
])
|
215
|
-
expect(cop.messages)
|
216
|
-
.to eq(['end at 2, 2 is not aligned with @variable = test do |ala| at 1, 0'])
|
217
|
-
end
|
218
|
-
|
219
|
-
it 'accepts end aligned with a class variable' do
|
220
|
-
inspect_source(cop,
|
221
|
-
['@@variable = test do |ala|',
|
222
|
-
'end'
|
223
|
-
])
|
224
|
-
expect(cop.offences).to be_empty
|
225
|
-
end
|
226
|
-
|
227
|
-
it 'registers an offence for mismatched block end with a class variable' do
|
228
|
-
inspect_source(cop,
|
229
|
-
['@@variable = test do |ala|',
|
230
|
-
' end'
|
231
|
-
])
|
232
|
-
expect(cop.messages)
|
233
|
-
.to eq(['end at 2, 2 is not aligned with @@variable = test do |ala| at 1, 0'])
|
234
|
-
end
|
235
|
-
|
236
|
-
it 'accepts end aligned with a global variable' do
|
237
|
-
inspect_source(cop,
|
238
|
-
['$variable = test do |ala|',
|
239
|
-
'end'
|
240
|
-
])
|
241
|
-
expect(cop.offences).to be_empty
|
242
|
-
end
|
243
|
-
|
244
|
-
it 'registers an offence for mismatched block end with a global variable' do
|
245
|
-
inspect_source(cop,
|
246
|
-
['$variable = test do |ala|',
|
247
|
-
' end'
|
248
|
-
])
|
249
|
-
expect(cop.messages)
|
250
|
-
.to eq(['end at 2, 2 is not aligned with $variable = test do |ala| at 1, 0'])
|
251
|
-
end
|
252
|
-
|
253
|
-
it 'accepts end aligned with a constant' do
|
254
|
-
inspect_source(cop,
|
255
|
-
['CONSTANT = test do |ala|',
|
256
|
-
'end'
|
257
|
-
])
|
258
|
-
expect(cop.offences).to be_empty
|
259
|
-
end
|
260
|
-
|
261
|
-
it 'registers an offence for mismatched block end with a constant' do
|
262
|
-
inspect_source(cop,
|
263
|
-
['Module::CONSTANT = test do |ala|',
|
264
|
-
' end'
|
265
|
-
])
|
266
|
-
expect(cop.messages)
|
267
|
-
.to eq(['end at 2, 2 is not aligned with Module::CONSTANT = test do |ala| at 1, 0'])
|
268
|
-
end
|
269
|
-
|
270
|
-
it 'accepts end aligned with a method call' do
|
271
|
-
inspect_source(cop,
|
272
|
-
['parser.childs << lambda do |token|',
|
273
|
-
' token << 1',
|
274
|
-
'end'
|
275
|
-
])
|
276
|
-
expect(cop.offences).to be_empty
|
277
|
-
end
|
278
|
-
|
279
|
-
it 'registers an offence for mismatched block end with a method call' do
|
280
|
-
inspect_source(cop,
|
281
|
-
['parser.childs << lambda do |token|',
|
282
|
-
' token << 1',
|
283
|
-
' end'
|
284
|
-
])
|
285
|
-
expect(cop.messages)
|
286
|
-
.to eq(['end at 3, 2 is not aligned with parser.childs << lambda do |token| at 1, 0'])
|
287
|
-
end
|
288
|
-
|
289
|
-
it 'accepts end aligned with a method call with arguments' do
|
290
|
-
inspect_source(cop,
|
291
|
-
['@h[:f] = f.each_pair.map do |f, v|',
|
292
|
-
' v = 1',
|
293
|
-
'end'
|
294
|
-
])
|
295
|
-
expect(cop.offences).to be_empty
|
296
|
-
end
|
297
|
-
|
298
|
-
it 'registers an offence for mismatched end with a method call with arguments' do
|
299
|
-
inspect_source(cop,
|
300
|
-
['@h[:f] = f.each_pair.map do |f, v|',
|
301
|
-
' v = 1',
|
302
|
-
' end'
|
303
|
-
])
|
304
|
-
expect(cop.messages)
|
305
|
-
.to eq(['end at 3, 2 is not aligned with @h[:f] = f.each_pair.map do |f, v| at 1, 0'])
|
306
|
-
end
|
307
|
-
|
308
|
-
it 'does not raise an error for nested block in a method call' do
|
309
|
-
inspect_source(cop,
|
310
|
-
['expect(arr.all? { |o| o.valid? })'
|
311
|
-
])
|
312
|
-
expect(cop.offences).to be_empty
|
313
|
-
end
|
314
|
-
|
315
|
-
it 'accepts end aligned with the block when the block is a method argument' do
|
316
|
-
inspect_source(cop,
|
317
|
-
['expect(arr.all? do |o|',
|
318
|
-
' o.valid?',
|
319
|
-
' end)'
|
320
|
-
])
|
321
|
-
expect(cop.offences).to be_empty
|
322
|
-
end
|
323
|
-
|
324
|
-
it 'registers an offence for mismatched end not aligned with the block that is an argument' do
|
325
|
-
inspect_source(cop,
|
326
|
-
['expect(arr.all? do |o|',
|
327
|
-
' o.valid?',
|
328
|
-
' end)'
|
329
|
-
])
|
330
|
-
expect(cop.messages)
|
331
|
-
.to eq(['end at 3, 2 is not aligned with arr.all? do |o| at 1, 7 or ' +
|
332
|
-
'expect(arr.all? do |o| at 1, 0'])
|
333
|
-
end
|
334
|
-
|
335
|
-
it 'accepts end aligned with an op-asgn (+=, -=)' do
|
336
|
-
inspect_source(cop,
|
337
|
-
['rb += files.select do |file|',
|
338
|
-
' file << something',
|
339
|
-
'end'
|
340
|
-
])
|
341
|
-
expect(cop.offences).to be_empty
|
342
|
-
end
|
343
|
-
|
344
|
-
it 'registers an offence for mismatched block end with an op-asgn (+=, -=)' do
|
345
|
-
inspect_source(cop,
|
346
|
-
['rb += files.select do |file|',
|
347
|
-
' file << something',
|
348
|
-
' end'
|
349
|
-
])
|
350
|
-
expect(cop.messages)
|
351
|
-
.to eq(['end at 3, 2 is not aligned with rb at 1, 0'])
|
352
|
-
end
|
353
|
-
|
354
|
-
it 'accepts end aligned with an and-asgn (&&=)' do
|
355
|
-
inspect_source(cop,
|
356
|
-
['variable &&= test do |ala|',
|
357
|
-
'end'
|
358
|
-
])
|
359
|
-
expect(cop.offences).to be_empty
|
360
|
-
end
|
361
|
-
|
362
|
-
it 'registers an offence for mismatched block end with an and-asgn (&&=)' do
|
363
|
-
inspect_source(cop,
|
364
|
-
['variable &&= test do |ala|',
|
365
|
-
' end'
|
366
|
-
])
|
367
|
-
expect(cop.messages)
|
368
|
-
.to eq(['end at 2, 2 is not aligned with variable &&= test do |ala| at 1, 0'])
|
369
|
-
end
|
370
|
-
|
371
|
-
it 'accepts end aligned with an or-asgn (||=)' do
|
372
|
-
inspect_source(cop,
|
373
|
-
['variable ||= test do |ala|',
|
374
|
-
'end'
|
375
|
-
])
|
376
|
-
expect(cop.offences).to be_empty
|
377
|
-
end
|
378
|
-
|
379
|
-
it 'registers an offence for mismatched block end with an or-asgn (||=)' do
|
380
|
-
inspect_source(cop,
|
381
|
-
['variable ||= test do |ala|',
|
382
|
-
' end'
|
383
|
-
])
|
384
|
-
expect(cop.messages)
|
385
|
-
.to eq(['end at 2, 2 is not aligned with variable ||= test do |ala| at 1, 0'])
|
386
|
-
end
|
387
|
-
|
388
|
-
it 'accepts end aligned with a mass assignment' do
|
389
|
-
inspect_source(cop,
|
390
|
-
['var1, var2 = lambda do |test|',
|
391
|
-
' [1, 2]',
|
392
|
-
'end'
|
393
|
-
])
|
394
|
-
expect(cop.offences).to be_empty
|
395
|
-
end
|
396
|
-
|
397
|
-
it 'accepts end aligned with a call chain left hand side' do
|
398
|
-
inspect_source(cop,
|
399
|
-
['parser.diagnostics.consumer = lambda do |diagnostic|',
|
400
|
-
' diagnostics << diagnostic',
|
401
|
-
'end'])
|
402
|
-
expect(cop.offences).to be_empty
|
403
|
-
end
|
404
|
-
|
405
|
-
it 'registers an offence for mismatched block end with a mass assignment' do
|
406
|
-
inspect_source(cop,
|
407
|
-
['var1, var2 = lambda do |test|',
|
408
|
-
' [1, 2]',
|
409
|
-
' end'
|
410
|
-
])
|
411
|
-
expect(cop.messages)
|
412
|
-
.to eq(['end at 3, 2 is not aligned with var1, var2 at 1, 0'])
|
413
|
-
end
|
414
|
-
end
|
6
|
+
describe Rubocop::Cop::Lint::BlockAlignment do
|
7
|
+
subject(:cop) { described_class.new }
|
8
|
+
|
9
|
+
it 'registers an offence for mismatched block end' do
|
10
|
+
inspect_source(cop,
|
11
|
+
['test do |ala|',
|
12
|
+
' end'
|
13
|
+
])
|
14
|
+
expect(cop.messages)
|
15
|
+
.to eq(['end at 2, 2 is not aligned with test do |ala| at 1, 0'])
|
16
|
+
end
|
17
|
+
|
18
|
+
context 'when the block is a logical operand' do
|
19
|
+
it 'accepts a correctly aligned block end' do
|
20
|
+
inspect_source(cop,
|
21
|
+
['(value.is_a? Array) && value.all? do |subvalue|',
|
22
|
+
' type_check_value(subvalue, array_type)',
|
23
|
+
'end',
|
24
|
+
'a || b do',
|
25
|
+
'end',
|
26
|
+
])
|
27
|
+
expect(cop.offences).to be_empty
|
415
28
|
end
|
416
29
|
end
|
30
|
+
|
31
|
+
it 'accepts end aligned with a variable' do
|
32
|
+
inspect_source(cop,
|
33
|
+
['variable = test do |ala|',
|
34
|
+
'end'
|
35
|
+
])
|
36
|
+
expect(cop.offences).to be_empty
|
37
|
+
end
|
38
|
+
|
39
|
+
context 'when there is an assignment chain' do
|
40
|
+
it 'registers an offence for an end aligned with the 2nd variable' do
|
41
|
+
inspect_source(cop,
|
42
|
+
['a = b = c = test do |ala|',
|
43
|
+
' end'
|
44
|
+
])
|
45
|
+
expect(cop.messages)
|
46
|
+
.to eq(['end at 2, 4 is not aligned with a = b = c = test do |ala| at 1, 0'])
|
47
|
+
end
|
48
|
+
|
49
|
+
it 'accepts end aligned with the first variable' do
|
50
|
+
inspect_source(cop,
|
51
|
+
['a = b = c = test do |ala|',
|
52
|
+
'end',
|
53
|
+
])
|
54
|
+
expect(cop.offences).to be_empty
|
55
|
+
end
|
56
|
+
end
|
57
|
+
|
58
|
+
context 'and the block is an operand' do
|
59
|
+
it 'accepts end aligned with a variable' do
|
60
|
+
inspect_source(cop,
|
61
|
+
['b = 1 + preceding_line.reduce(0) do |a, e|',
|
62
|
+
' a + e.length + newline_length',
|
63
|
+
'end + 1'
|
64
|
+
])
|
65
|
+
expect(cop.offences).to be_empty
|
66
|
+
end
|
67
|
+
end
|
68
|
+
|
69
|
+
it 'registers an offence for mismatched block end with a variable' do
|
70
|
+
inspect_source(cop,
|
71
|
+
['variable = test do |ala|',
|
72
|
+
' end'
|
73
|
+
])
|
74
|
+
expect(cop.messages)
|
75
|
+
.to eq(['end at 2, 2 is not aligned with variable = test do |ala| at 1, 0'])
|
76
|
+
end
|
77
|
+
|
78
|
+
context 'when the block is defined on the next line' do
|
79
|
+
it 'accepts end aligned with the block expression' do
|
80
|
+
inspect_source(cop,
|
81
|
+
['variable =',
|
82
|
+
' a_long_method_that_dont_fit_on_the_line do |v|',
|
83
|
+
' v.foo',
|
84
|
+
' end'
|
85
|
+
])
|
86
|
+
expect(cop.offences).to be_empty
|
87
|
+
end
|
88
|
+
|
89
|
+
it 'registers an offences for mismatched end alignment' do
|
90
|
+
inspect_source(cop,
|
91
|
+
['variable =',
|
92
|
+
' a_long_method_that_dont_fit_on_the_line do |v|',
|
93
|
+
' v.foo',
|
94
|
+
'end'
|
95
|
+
])
|
96
|
+
expect(cop.messages)
|
97
|
+
.to eq(['end at 4, 0 is not aligned with a_long_method_that_dont_fit_on_the_line ' +
|
98
|
+
'do |v| at 2, 2'])
|
99
|
+
end
|
100
|
+
end
|
101
|
+
|
102
|
+
context 'when the method part is a call chain that spans several lines' do
|
103
|
+
# Example from issue 346 of bbatsov/rubocop on github:
|
104
|
+
it 'accepts pretty alignment style' do
|
105
|
+
src = ['def foo(bar)',
|
106
|
+
' bar.get_stuffs',
|
107
|
+
' .reject do |stuff| ',
|
108
|
+
' stuff.with_a_very_long_expression_that_doesnt_fit_the_line',
|
109
|
+
' end.select do |stuff|',
|
110
|
+
' stuff.another_very_long_expression_that_doesnt_fit_the_line',
|
111
|
+
' end',
|
112
|
+
' .select do |stuff|',
|
113
|
+
' stuff.another_very_long_expression_that_doesnt_fit_the_line',
|
114
|
+
' end',
|
115
|
+
'end']
|
116
|
+
inspect_source(cop, src)
|
117
|
+
expect(cop.offences).to be_empty
|
118
|
+
end
|
119
|
+
|
120
|
+
it 'registers offences for misaligned ends' do
|
121
|
+
src = ['def foo(bar)',
|
122
|
+
' bar.get_stuffs',
|
123
|
+
' .reject do |stuff|',
|
124
|
+
' stuff.with_a_very_long_expression_that_doesnt_fit_the_line',
|
125
|
+
' end.select do |stuff|',
|
126
|
+
' stuff.another_very_long_expression_that_doesnt_fit_the_line',
|
127
|
+
' end',
|
128
|
+
' .select do |stuff|',
|
129
|
+
' stuff.another_very_long_expression_that_doesnt_fit_the_line',
|
130
|
+
' end',
|
131
|
+
'end']
|
132
|
+
inspect_source(cop, src)
|
133
|
+
expect(cop.messages)
|
134
|
+
.to eq(['end at 10, 8 is not aligned with bar.get_stuffs at 2, 2 or' +
|
135
|
+
' .select do |stuff| at 8, 6',
|
136
|
+
'end at 7, 4 is not aligned with bar.get_stuffs at 2, 2 or' +
|
137
|
+
' end.select do |stuff| at 5, 8',
|
138
|
+
'end at 5, 8 is not aligned with bar.get_stuffs at 2, 2 or' +
|
139
|
+
' .reject do |stuff| at 3, 6'])
|
140
|
+
end
|
141
|
+
|
142
|
+
# Example from issue 393 of bbatsov/rubocop on github:
|
143
|
+
it 'accepts end indented as the start of the block' do
|
144
|
+
src = ['my_object.chaining_this_very_long_method(with_a_parameter)',
|
145
|
+
' .and_one_with_a_block do',
|
146
|
+
' do_something',
|
147
|
+
'end',
|
148
|
+
'', # Other variant:
|
149
|
+
'my_object.chaining_this_very_long_method(',
|
150
|
+
' with_a_parameter).and_one_with_a_block do',
|
151
|
+
' do_something',
|
152
|
+
'end']
|
153
|
+
inspect_source(cop, src)
|
154
|
+
expect(cop.offences).to be_empty
|
155
|
+
end
|
156
|
+
|
157
|
+
# Example from issue 447 of bbatsov/rubocop on github:
|
158
|
+
it 'accepts two kinds of end alignment' do
|
159
|
+
src = [
|
160
|
+
# Aligned with start of line where do is:
|
161
|
+
'params = default_options.merge(options)',
|
162
|
+
' .delete_if { |k, v| v.nil? }',
|
163
|
+
' .each_with_object({}) do |(k, v), new_hash|',
|
164
|
+
' new_hash[k.to_s] = v.to_s',
|
165
|
+
' end',
|
166
|
+
# Aligned with start of the whole expression:
|
167
|
+
'params = default_options.merge(options)',
|
168
|
+
' .delete_if { |k, v| v.nil? }',
|
169
|
+
' .each_with_object({}) do |(k, v), new_hash|',
|
170
|
+
' new_hash[k.to_s] = v.to_s',
|
171
|
+
'end'
|
172
|
+
]
|
173
|
+
inspect_source(cop, src)
|
174
|
+
expect(cop.offences).to be_empty
|
175
|
+
end
|
176
|
+
end
|
177
|
+
|
178
|
+
context 'when variables of a mass assignment spans several lines' do
|
179
|
+
it 'accepts end aligned with the variables' do
|
180
|
+
src = ['e,',
|
181
|
+
'f = [5, 6].map do |i|',
|
182
|
+
' i - 5',
|
183
|
+
'end']
|
184
|
+
inspect_source(cop, src)
|
185
|
+
expect(cop.offences).to be_empty
|
186
|
+
end
|
187
|
+
|
188
|
+
it 'registers an offence for end aligned with the block' do
|
189
|
+
src = ['e,',
|
190
|
+
'f = [5, 6].map do |i|',
|
191
|
+
' i - 5',
|
192
|
+
' end']
|
193
|
+
inspect_source(cop, src)
|
194
|
+
expect(cop.messages)
|
195
|
+
.to eq(['end at 4, 4 is not aligned with e, at 1, 0 or f = [5, 6].map do |i| at 2, 0'])
|
196
|
+
end
|
197
|
+
end
|
198
|
+
|
199
|
+
it 'accepts end aligned with an instance variable' do
|
200
|
+
inspect_source(cop,
|
201
|
+
['@variable = test do |ala|',
|
202
|
+
'end'
|
203
|
+
])
|
204
|
+
expect(cop.offences).to be_empty
|
205
|
+
end
|
206
|
+
|
207
|
+
it 'registers an offence for mismatched block end with an instance variable' do
|
208
|
+
inspect_source(cop,
|
209
|
+
['@variable = test do |ala|',
|
210
|
+
' end'
|
211
|
+
])
|
212
|
+
expect(cop.messages)
|
213
|
+
.to eq(['end at 2, 2 is not aligned with @variable = test do |ala| at 1, 0'])
|
214
|
+
end
|
215
|
+
|
216
|
+
it 'accepts end aligned with a class variable' do
|
217
|
+
inspect_source(cop,
|
218
|
+
['@@variable = test do |ala|',
|
219
|
+
'end'
|
220
|
+
])
|
221
|
+
expect(cop.offences).to be_empty
|
222
|
+
end
|
223
|
+
|
224
|
+
it 'registers an offence for mismatched block end with a class variable' do
|
225
|
+
inspect_source(cop,
|
226
|
+
['@@variable = test do |ala|',
|
227
|
+
' end'
|
228
|
+
])
|
229
|
+
expect(cop.messages)
|
230
|
+
.to eq(['end at 2, 2 is not aligned with @@variable = test do |ala| at 1, 0'])
|
231
|
+
end
|
232
|
+
|
233
|
+
it 'accepts end aligned with a global variable' do
|
234
|
+
inspect_source(cop,
|
235
|
+
['$variable = test do |ala|',
|
236
|
+
'end'
|
237
|
+
])
|
238
|
+
expect(cop.offences).to be_empty
|
239
|
+
end
|
240
|
+
|
241
|
+
it 'registers an offence for mismatched block end with a global variable' do
|
242
|
+
inspect_source(cop,
|
243
|
+
['$variable = test do |ala|',
|
244
|
+
' end'
|
245
|
+
])
|
246
|
+
expect(cop.messages)
|
247
|
+
.to eq(['end at 2, 2 is not aligned with $variable = test do |ala| at 1, 0'])
|
248
|
+
end
|
249
|
+
|
250
|
+
it 'accepts end aligned with a constant' do
|
251
|
+
inspect_source(cop,
|
252
|
+
['CONSTANT = test do |ala|',
|
253
|
+
'end'
|
254
|
+
])
|
255
|
+
expect(cop.offences).to be_empty
|
256
|
+
end
|
257
|
+
|
258
|
+
it 'registers an offence for mismatched block end with a constant' do
|
259
|
+
inspect_source(cop,
|
260
|
+
['Module::CONSTANT = test do |ala|',
|
261
|
+
' end'
|
262
|
+
])
|
263
|
+
expect(cop.messages)
|
264
|
+
.to eq(['end at 2, 2 is not aligned with Module::CONSTANT = test do |ala| at 1, 0'])
|
265
|
+
end
|
266
|
+
|
267
|
+
it 'accepts end aligned with a method call' do
|
268
|
+
inspect_source(cop,
|
269
|
+
['parser.childs << lambda do |token|',
|
270
|
+
' token << 1',
|
271
|
+
'end'
|
272
|
+
])
|
273
|
+
expect(cop.offences).to be_empty
|
274
|
+
end
|
275
|
+
|
276
|
+
it 'registers an offence for mismatched block end with a method call' do
|
277
|
+
inspect_source(cop,
|
278
|
+
['parser.childs << lambda do |token|',
|
279
|
+
' token << 1',
|
280
|
+
' end'
|
281
|
+
])
|
282
|
+
expect(cop.messages)
|
283
|
+
.to eq(['end at 3, 2 is not aligned with parser.childs << lambda do |token| at 1, 0'])
|
284
|
+
end
|
285
|
+
|
286
|
+
it 'accepts end aligned with a method call with arguments' do
|
287
|
+
inspect_source(cop,
|
288
|
+
['@h[:f] = f.each_pair.map do |f, v|',
|
289
|
+
' v = 1',
|
290
|
+
'end'
|
291
|
+
])
|
292
|
+
expect(cop.offences).to be_empty
|
293
|
+
end
|
294
|
+
|
295
|
+
it 'registers an offence for mismatched end with a method call with arguments' do
|
296
|
+
inspect_source(cop,
|
297
|
+
['@h[:f] = f.each_pair.map do |f, v|',
|
298
|
+
' v = 1',
|
299
|
+
' end'
|
300
|
+
])
|
301
|
+
expect(cop.messages)
|
302
|
+
.to eq(['end at 3, 2 is not aligned with @h[:f] = f.each_pair.map do |f, v| at 1, 0'])
|
303
|
+
end
|
304
|
+
|
305
|
+
it 'does not raise an error for nested block in a method call' do
|
306
|
+
inspect_source(cop,
|
307
|
+
['expect(arr.all? { |o| o.valid? })'
|
308
|
+
])
|
309
|
+
expect(cop.offences).to be_empty
|
310
|
+
end
|
311
|
+
|
312
|
+
it 'accepts end aligned with the block when the block is a method argument' do
|
313
|
+
inspect_source(cop,
|
314
|
+
['expect(arr.all? do |o|',
|
315
|
+
' o.valid?',
|
316
|
+
' end)'
|
317
|
+
])
|
318
|
+
expect(cop.offences).to be_empty
|
319
|
+
end
|
320
|
+
|
321
|
+
it 'registers an offence for mismatched end not aligned with the block that is an argument' do
|
322
|
+
inspect_source(cop,
|
323
|
+
['expect(arr.all? do |o|',
|
324
|
+
' o.valid?',
|
325
|
+
' end)'
|
326
|
+
])
|
327
|
+
expect(cop.messages)
|
328
|
+
.to eq(['end at 3, 2 is not aligned with arr.all? do |o| at 1, 7 or ' +
|
329
|
+
'expect(arr.all? do |o| at 1, 0'])
|
330
|
+
end
|
331
|
+
|
332
|
+
it 'accepts end aligned with an op-asgn (+=, -=)' do
|
333
|
+
inspect_source(cop,
|
334
|
+
['rb += files.select do |file|',
|
335
|
+
' file << something',
|
336
|
+
'end'
|
337
|
+
])
|
338
|
+
expect(cop.offences).to be_empty
|
339
|
+
end
|
340
|
+
|
341
|
+
it 'registers an offence for mismatched block end with an op-asgn (+=, -=)' do
|
342
|
+
inspect_source(cop,
|
343
|
+
['rb += files.select do |file|',
|
344
|
+
' file << something',
|
345
|
+
' end'
|
346
|
+
])
|
347
|
+
expect(cop.messages)
|
348
|
+
.to eq(['end at 3, 2 is not aligned with rb at 1, 0'])
|
349
|
+
end
|
350
|
+
|
351
|
+
it 'accepts end aligned with an and-asgn (&&=)' do
|
352
|
+
inspect_source(cop,
|
353
|
+
['variable &&= test do |ala|',
|
354
|
+
'end'
|
355
|
+
])
|
356
|
+
expect(cop.offences).to be_empty
|
357
|
+
end
|
358
|
+
|
359
|
+
it 'registers an offence for mismatched block end with an and-asgn (&&=)' do
|
360
|
+
inspect_source(cop,
|
361
|
+
['variable &&= test do |ala|',
|
362
|
+
' end'
|
363
|
+
])
|
364
|
+
expect(cop.messages)
|
365
|
+
.to eq(['end at 2, 2 is not aligned with variable &&= test do |ala| at 1, 0'])
|
366
|
+
end
|
367
|
+
|
368
|
+
it 'accepts end aligned with an or-asgn (||=)' do
|
369
|
+
inspect_source(cop,
|
370
|
+
['variable ||= test do |ala|',
|
371
|
+
'end'
|
372
|
+
])
|
373
|
+
expect(cop.offences).to be_empty
|
374
|
+
end
|
375
|
+
|
376
|
+
it 'registers an offence for mismatched block end with an or-asgn (||=)' do
|
377
|
+
inspect_source(cop,
|
378
|
+
['variable ||= test do |ala|',
|
379
|
+
' end'
|
380
|
+
])
|
381
|
+
expect(cop.messages)
|
382
|
+
.to eq(['end at 2, 2 is not aligned with variable ||= test do |ala| at 1, 0'])
|
383
|
+
end
|
384
|
+
|
385
|
+
it 'accepts end aligned with a mass assignment' do
|
386
|
+
inspect_source(cop,
|
387
|
+
['var1, var2 = lambda do |test|',
|
388
|
+
' [1, 2]',
|
389
|
+
'end'
|
390
|
+
])
|
391
|
+
expect(cop.offences).to be_empty
|
392
|
+
end
|
393
|
+
|
394
|
+
it 'accepts end aligned with a call chain left hand side' do
|
395
|
+
inspect_source(cop,
|
396
|
+
['parser.diagnostics.consumer = lambda do |diagnostic|',
|
397
|
+
' diagnostics << diagnostic',
|
398
|
+
'end'])
|
399
|
+
expect(cop.offences).to be_empty
|
400
|
+
end
|
401
|
+
|
402
|
+
it 'registers an offence for mismatched block end with a mass assignment' do
|
403
|
+
inspect_source(cop,
|
404
|
+
['var1, var2 = lambda do |test|',
|
405
|
+
' [1, 2]',
|
406
|
+
' end'
|
407
|
+
])
|
408
|
+
expect(cop.messages)
|
409
|
+
.to eq(['end at 3, 2 is not aligned with var1, var2 at 1, 0'])
|
410
|
+
end
|
417
411
|
end
|