sabat-rubocop 0.9.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- data/.gitignore +50 -0
- data/.rspec +1 -0
- data/.rubocop.yml +7 -0
- data/.travis.yml +7 -0
- data/.yardopts +2 -0
- data/CHANGELOG.md +268 -0
- data/CONTRIBUTING.md +16 -0
- data/Gemfile +7 -0
- data/LICENSE.txt +20 -0
- data/README.md +324 -0
- data/Rakefile +29 -0
- data/bin/rubocop +22 -0
- data/config/default.yml +58 -0
- data/config/disabled.yml +5 -0
- data/config/enabled.yml +403 -0
- data/lib/rubocop.rb +116 -0
- data/lib/rubocop/cli.rb +407 -0
- data/lib/rubocop/config.rb +250 -0
- data/lib/rubocop/config_store.rb +39 -0
- data/lib/rubocop/cop/cop.rb +138 -0
- data/lib/rubocop/cop/lint/assignment_in_condition.rb +54 -0
- data/lib/rubocop/cop/lint/end_alignment.rb +189 -0
- data/lib/rubocop/cop/lint/end_in_method.rb +30 -0
- data/lib/rubocop/cop/lint/ensure_return.rb +22 -0
- data/lib/rubocop/cop/lint/eval.rb +22 -0
- data/lib/rubocop/cop/lint/handle_exceptions.rb +20 -0
- data/lib/rubocop/cop/lint/literal_in_condition.rb +81 -0
- data/lib/rubocop/cop/lint/loop.rb +29 -0
- data/lib/rubocop/cop/lint/rescue_exception.rb +29 -0
- data/lib/rubocop/cop/lint/shadowing_outer_local_variable.rb +34 -0
- data/lib/rubocop/cop/lint/unreachable_code.rb +35 -0
- data/lib/rubocop/cop/lint/unused_local_variable.rb +32 -0
- data/lib/rubocop/cop/lint/void.rb +58 -0
- data/lib/rubocop/cop/offence.rb +136 -0
- data/lib/rubocop/cop/rails/validation.rb +30 -0
- data/lib/rubocop/cop/style/access_control.rb +58 -0
- data/lib/rubocop/cop/style/alias.rb +28 -0
- data/lib/rubocop/cop/style/align_parameters.rb +39 -0
- data/lib/rubocop/cop/style/and_or.rb +45 -0
- data/lib/rubocop/cop/style/ascii_comments.rb +21 -0
- data/lib/rubocop/cop/style/ascii_identifiers.rb +22 -0
- data/lib/rubocop/cop/style/attr.rb +20 -0
- data/lib/rubocop/cop/style/avoid_class_vars.rb +20 -0
- data/lib/rubocop/cop/style/avoid_for.rb +18 -0
- data/lib/rubocop/cop/style/avoid_global_vars.rb +65 -0
- data/lib/rubocop/cop/style/avoid_perl_backrefs.rb +21 -0
- data/lib/rubocop/cop/style/avoid_perlisms.rb +50 -0
- data/lib/rubocop/cop/style/begin_block.rb +18 -0
- data/lib/rubocop/cop/style/block_comments.rb +20 -0
- data/lib/rubocop/cop/style/block_nesting.rb +47 -0
- data/lib/rubocop/cop/style/blocks.rb +27 -0
- data/lib/rubocop/cop/style/case_equality.rb +22 -0
- data/lib/rubocop/cop/style/case_indentation.rb +28 -0
- data/lib/rubocop/cop/style/character_literal.rb +37 -0
- data/lib/rubocop/cop/style/class_and_module_camel_case.rb +33 -0
- data/lib/rubocop/cop/style/class_methods.rb +22 -0
- data/lib/rubocop/cop/style/collection_methods.rb +56 -0
- data/lib/rubocop/cop/style/colon_method_call.rb +29 -0
- data/lib/rubocop/cop/style/constant_name.rb +31 -0
- data/lib/rubocop/cop/style/def_parentheses.rb +70 -0
- data/lib/rubocop/cop/style/documentation.rb +58 -0
- data/lib/rubocop/cop/style/dot_position.rb +25 -0
- data/lib/rubocop/cop/style/empty_line_between_defs.rb +26 -0
- data/lib/rubocop/cop/style/empty_lines.rb +40 -0
- data/lib/rubocop/cop/style/empty_literal.rb +53 -0
- data/lib/rubocop/cop/style/encoding.rb +29 -0
- data/lib/rubocop/cop/style/end_block.rb +18 -0
- data/lib/rubocop/cop/style/end_of_line.rb +23 -0
- data/lib/rubocop/cop/style/favor_join.rb +29 -0
- data/lib/rubocop/cop/style/favor_modifier.rb +118 -0
- data/lib/rubocop/cop/style/favor_sprintf.rb +28 -0
- data/lib/rubocop/cop/style/favor_unless_over_negated_if.rb +54 -0
- data/lib/rubocop/cop/style/hash_syntax.rb +47 -0
- data/lib/rubocop/cop/style/if_then_else.rb +29 -0
- data/lib/rubocop/cop/style/if_with_semicolon.rb +20 -0
- data/lib/rubocop/cop/style/lambda.rb +47 -0
- data/lib/rubocop/cop/style/leading_comment_space.rb +25 -0
- data/lib/rubocop/cop/style/line_continuation.rb +26 -0
- data/lib/rubocop/cop/style/line_length.rb +30 -0
- data/lib/rubocop/cop/style/method_and_variable_snake_case.rb +61 -0
- data/lib/rubocop/cop/style/method_call_parentheses.rb +22 -0
- data/lib/rubocop/cop/style/method_length.rb +57 -0
- data/lib/rubocop/cop/style/multiline_if_then.rb +47 -0
- data/lib/rubocop/cop/style/not.rb +24 -0
- data/lib/rubocop/cop/style/numeric_literals.rb +25 -0
- data/lib/rubocop/cop/style/one_line_conditional.rb +20 -0
- data/lib/rubocop/cop/style/op_method.rb +29 -0
- data/lib/rubocop/cop/style/parameter_lists.rb +42 -0
- data/lib/rubocop/cop/style/parentheses_around_condition.rb +42 -0
- data/lib/rubocop/cop/style/proc.rb +30 -0
- data/lib/rubocop/cop/style/reduce_arguments.rb +34 -0
- data/lib/rubocop/cop/style/regexp_literal.rb +39 -0
- data/lib/rubocop/cop/style/rescue_modifier.rb +55 -0
- data/lib/rubocop/cop/style/semicolon.rb +51 -0
- data/lib/rubocop/cop/style/single_line_methods.rb +48 -0
- data/lib/rubocop/cop/style/space_after_comma_etc.rb +69 -0
- data/lib/rubocop/cop/style/space_after_control_keyword.rb +32 -0
- data/lib/rubocop/cop/style/string_literals.rb +36 -0
- data/lib/rubocop/cop/style/surrounding_space.rb +314 -0
- data/lib/rubocop/cop/style/symbol_array.rb +31 -0
- data/lib/rubocop/cop/style/symbol_name.rb +27 -0
- data/lib/rubocop/cop/style/tab.rb +25 -0
- data/lib/rubocop/cop/style/ternary_operator.rb +49 -0
- data/lib/rubocop/cop/style/trailing_whitespace.rb +24 -0
- data/lib/rubocop/cop/style/trivial_accessors.rb +32 -0
- data/lib/rubocop/cop/style/unless_else.rb +26 -0
- data/lib/rubocop/cop/style/variable_interpolation.rb +32 -0
- data/lib/rubocop/cop/style/when_then.rb +25 -0
- data/lib/rubocop/cop/style/while_until_do.rb +45 -0
- data/lib/rubocop/cop/style/word_array.rb +44 -0
- data/lib/rubocop/cop/util.rb +27 -0
- data/lib/rubocop/cop/variable_inspector.rb +280 -0
- data/lib/rubocop/formatter/base_formatter.rb +119 -0
- data/lib/rubocop/formatter/clang_style_formatter.rb +21 -0
- data/lib/rubocop/formatter/emacs_style_formatter.rb +17 -0
- data/lib/rubocop/formatter/formatter_set.rb +77 -0
- data/lib/rubocop/formatter/json_formatter.rb +76 -0
- data/lib/rubocop/formatter/progress_formatter.rb +63 -0
- data/lib/rubocop/formatter/simple_text_formatter.rb +62 -0
- data/lib/rubocop/version.rb +21 -0
- data/rubocop.gemspec +36 -0
- data/spec/.rubocop.yml +5 -0
- data/spec/project_spec.rb +24 -0
- data/spec/rubocop/cli_spec.rb +906 -0
- data/spec/rubocop/config_spec.rb +470 -0
- data/spec/rubocop/config_store_spec.rb +66 -0
- data/spec/rubocop/cops/cop_spec.rb +38 -0
- data/spec/rubocop/cops/lint/assignment_in_condition_spec.rb +111 -0
- data/spec/rubocop/cops/lint/end_alignment_spec.rb +333 -0
- data/spec/rubocop/cops/lint/end_in_method_spec.rb +35 -0
- data/spec/rubocop/cops/lint/ensure_return_spec.rb +37 -0
- data/spec/rubocop/cops/lint/eval_spec.rb +41 -0
- data/spec/rubocop/cops/lint/handle_exceptions_spec.rb +36 -0
- data/spec/rubocop/cops/lint/literal_in_condition_spec.rb +42 -0
- data/spec/rubocop/cops/lint/loop_spec.rb +33 -0
- data/spec/rubocop/cops/lint/rescue_exception_spec.rb +127 -0
- data/spec/rubocop/cops/lint/shadowing_outer_local_variable_spec.rb +243 -0
- data/spec/rubocop/cops/lint/unreachable_code_spec.rb +69 -0
- data/spec/rubocop/cops/lint/unused_local_variable_spec.rb +497 -0
- data/spec/rubocop/cops/lint/void_spec.rb +63 -0
- data/spec/rubocop/cops/offence_spec.rb +133 -0
- data/spec/rubocop/cops/rails/validation_spec.rb +27 -0
- data/spec/rubocop/cops/style/access_control_spec.rb +142 -0
- data/spec/rubocop/cops/style/alias_spec.rb +47 -0
- data/spec/rubocop/cops/style/align_parameters_spec.rb +199 -0
- data/spec/rubocop/cops/style/and_or_spec.rb +39 -0
- data/spec/rubocop/cops/style/ascii_comments_spec.rb +28 -0
- data/spec/rubocop/cops/style/ascii_identifiers_spec.rb +28 -0
- data/spec/rubocop/cops/style/attr_spec.rb +20 -0
- data/spec/rubocop/cops/style/avoid_class_vars_spec.rb +27 -0
- data/spec/rubocop/cops/style/avoid_for_spec.rb +37 -0
- data/spec/rubocop/cops/style/avoid_global_vars_spec.rb +34 -0
- data/spec/rubocop/cops/style/avoid_perl_backrefs_spec.rb +20 -0
- data/spec/rubocop/cops/style/avoid_perlisms_spec.rb +47 -0
- data/spec/rubocop/cops/style/begin_block_spec.rb +19 -0
- data/spec/rubocop/cops/style/block_comments_spec.rb +27 -0
- data/spec/rubocop/cops/style/block_nesting_spec.rb +159 -0
- data/spec/rubocop/cops/style/blocks_spec.rb +35 -0
- data/spec/rubocop/cops/style/case_equality_spec.rb +18 -0
- data/spec/rubocop/cops/style/case_indentation_spec.rb +88 -0
- data/spec/rubocop/cops/style/character_literal_spec.rb +28 -0
- data/spec/rubocop/cops/style/class_and_module_camel_case_spec.rb +46 -0
- data/spec/rubocop/cops/style/class_methods_spec.rb +51 -0
- data/spec/rubocop/cops/style/collection_methods_spec.rb +41 -0
- data/spec/rubocop/cops/style/colon_method_call_spec.rb +55 -0
- data/spec/rubocop/cops/style/constant_name_spec.rb +56 -0
- data/spec/rubocop/cops/style/def_with_parentheses_spec.rb +40 -0
- data/spec/rubocop/cops/style/def_without_parentheses_spec.rb +34 -0
- data/spec/rubocop/cops/style/documentation_spec.rb +79 -0
- data/spec/rubocop/cops/style/dot_position_spec.rb +30 -0
- data/spec/rubocop/cops/style/empty_line_between_defs_spec.rb +85 -0
- data/spec/rubocop/cops/style/empty_lines_spec.rb +40 -0
- data/spec/rubocop/cops/style/empty_literal_spec.rb +91 -0
- data/spec/rubocop/cops/style/encoding_spec.rb +49 -0
- data/spec/rubocop/cops/style/end_block_spec.rb +19 -0
- data/spec/rubocop/cops/style/end_of_line_spec.rb +25 -0
- data/spec/rubocop/cops/style/favor_join_spec.rb +37 -0
- data/spec/rubocop/cops/style/favor_modifier_spec.rb +160 -0
- data/spec/rubocop/cops/style/favor_sprintf_spec.rb +53 -0
- data/spec/rubocop/cops/style/favor_unless_over_negated_if_spec.rb +64 -0
- data/spec/rubocop/cops/style/favor_until_over_negated_while_spec.rb +47 -0
- data/spec/rubocop/cops/style/hash_syntax_spec.rb +51 -0
- data/spec/rubocop/cops/style/if_with_semicolon_spec.rb +25 -0
- data/spec/rubocop/cops/style/lambda_spec.rb +45 -0
- data/spec/rubocop/cops/style/leading_comment_space_spec.rb +65 -0
- data/spec/rubocop/cops/style/line_continuation_spec.rb +26 -0
- data/spec/rubocop/cops/style/line_length_spec.rb +25 -0
- data/spec/rubocop/cops/style/method_and_variable_snake_case_spec.rb +95 -0
- data/spec/rubocop/cops/style/method_call_parentheses_spec.rb +25 -0
- data/spec/rubocop/cops/style/method_length_spec.rb +151 -0
- data/spec/rubocop/cops/style/multiline_if_then_spec.rb +97 -0
- data/spec/rubocop/cops/style/not_spec.rb +28 -0
- data/spec/rubocop/cops/style/numeric_literals_spec.rb +51 -0
- data/spec/rubocop/cops/style/one_line_conditional_spec.rb +18 -0
- data/spec/rubocop/cops/style/op_method_spec.rb +80 -0
- data/spec/rubocop/cops/style/parameter_lists_spec.rb +49 -0
- data/spec/rubocop/cops/style/parentheses_around_condition_spec.rb +59 -0
- data/spec/rubocop/cops/style/proc_spec.rb +28 -0
- data/spec/rubocop/cops/style/reduce_arguments_spec.rb +59 -0
- data/spec/rubocop/cops/style/regexp_literal_spec.rb +83 -0
- data/spec/rubocop/cops/style/rescue_modifier_spec.rb +122 -0
- data/spec/rubocop/cops/style/semicolon_spec.rb +95 -0
- data/spec/rubocop/cops/style/single_line_methods_spec.rb +54 -0
- data/spec/rubocop/cops/style/space_after_colon_spec.rb +29 -0
- data/spec/rubocop/cops/style/space_after_comma_spec.rb +31 -0
- data/spec/rubocop/cops/style/space_after_control_keyword_spec.rb +69 -0
- data/spec/rubocop/cops/style/space_after_semicolon_spec.rb +24 -0
- data/spec/rubocop/cops/style/space_around_braces_spec.rb +49 -0
- data/spec/rubocop/cops/style/space_around_equals_in_default_parameter_spec.rb +34 -0
- data/spec/rubocop/cops/style/space_around_operators_spec.rb +216 -0
- data/spec/rubocop/cops/style/space_inside_brackets_spec.rb +51 -0
- data/spec/rubocop/cops/style/space_inside_hash_literal_braces_spec.rb +99 -0
- data/spec/rubocop/cops/style/space_inside_parens_spec.rb +33 -0
- data/spec/rubocop/cops/style/string_literals_spec.rb +62 -0
- data/spec/rubocop/cops/style/symbol_array_spec.rb +45 -0
- data/spec/rubocop/cops/style/symbol_name_spec.rb +122 -0
- data/spec/rubocop/cops/style/tab_spec.rb +23 -0
- data/spec/rubocop/cops/style/ternary_operator_spec.rb +42 -0
- data/spec/rubocop/cops/style/trailing_whitespace_spec.rb +29 -0
- data/spec/rubocop/cops/style/trivial_accessors_spec.rb +338 -0
- data/spec/rubocop/cops/style/unless_else_spec.rb +31 -0
- data/spec/rubocop/cops/style/variable_interpolation_spec.rb +53 -0
- data/spec/rubocop/cops/style/when_then_spec.rb +40 -0
- data/spec/rubocop/cops/style/while_until_do_spec.rb +47 -0
- data/spec/rubocop/cops/style/word_array_spec.rb +61 -0
- data/spec/rubocop/cops/variable_inspector_spec.rb +374 -0
- data/spec/rubocop/formatter/base_formatter_spec.rb +190 -0
- data/spec/rubocop/formatter/clang_style_formatter_spec.rb +70 -0
- data/spec/rubocop/formatter/emacs_style_formatter_spec.rb +32 -0
- data/spec/rubocop/formatter/formatter_set_spec.rb +132 -0
- data/spec/rubocop/formatter/json_formatter_spec.rb +142 -0
- data/spec/rubocop/formatter/progress_formatter_spec.rb +196 -0
- data/spec/rubocop/formatter/simple_text_formatter_spec.rb +74 -0
- data/spec/spec_helper.rb +92 -0
- data/spec/support/file_helper.rb +21 -0
- data/spec/support/isolated_environment.rb +27 -0
- data/spec/support/mri_syntax_checker.rb +69 -0
- data/spec/support/shared_examples.rb +33 -0
- metadata +517 -0
@@ -0,0 +1,66 @@
|
|
1
|
+
# encoding: utf-8
|
2
|
+
|
3
|
+
require 'spec_helper'
|
4
|
+
|
5
|
+
module Rubocop
|
6
|
+
describe ConfigStore do
|
7
|
+
before(:each) { ConfigStore.prepare }
|
8
|
+
before do
|
9
|
+
Config.stub(:configuration_file_for) do |arg|
|
10
|
+
# File tree:
|
11
|
+
# file1
|
12
|
+
# dir/.rubocop.yml
|
13
|
+
# dir/file2
|
14
|
+
# dir/subdir/file3
|
15
|
+
(arg =~ /dir/ ? 'dir' : '.') + '/.rubocop.yml'
|
16
|
+
end
|
17
|
+
Config.stub(:configuration_from_file) { |arg| arg }
|
18
|
+
Config.stub(:load_file) { |arg| "#{arg} loaded" }
|
19
|
+
Config.stub(:merge_with_default) { |config, file| "merged #{config}" }
|
20
|
+
end
|
21
|
+
|
22
|
+
describe '.prepare' do
|
23
|
+
it 'resets @options_config' do
|
24
|
+
ConfigStore.set_options_config(:options_config)
|
25
|
+
ConfigStore.prepare
|
26
|
+
Config.should_receive(:configuration_file_for)
|
27
|
+
ConfigStore.for('file1')
|
28
|
+
end
|
29
|
+
|
30
|
+
it 'resets @config_cache' do
|
31
|
+
ConfigStore.for('file1')
|
32
|
+
ConfigStore.prepare
|
33
|
+
Config.should_receive(:configuration_file_for)
|
34
|
+
ConfigStore.for('file1')
|
35
|
+
end
|
36
|
+
end
|
37
|
+
|
38
|
+
describe '.for' do
|
39
|
+
it 'always uses config specified in command line' do
|
40
|
+
ConfigStore.set_options_config(:options_config)
|
41
|
+
expect(ConfigStore.for('file1')).to eq('merged options_config loaded')
|
42
|
+
end
|
43
|
+
|
44
|
+
context 'when no config specified in command line' do
|
45
|
+
it 'gets config path and config from cache if available' do
|
46
|
+
Config.should_receive(:configuration_file_for).once.with('dir')
|
47
|
+
Config.should_receive(:configuration_file_for).once.with('dir/' +
|
48
|
+
'subdir')
|
49
|
+
# The stub returns the same config path for dir and dir/subdir.
|
50
|
+
Config.should_receive(:configuration_from_file).once
|
51
|
+
.with('dir/.rubocop.yml')
|
52
|
+
|
53
|
+
ConfigStore.for('dir/file2')
|
54
|
+
ConfigStore.for('dir/file2')
|
55
|
+
ConfigStore.for('dir/subdir/file3')
|
56
|
+
end
|
57
|
+
|
58
|
+
it 'searches for config path if not available in cache' do
|
59
|
+
Config.should_receive(:configuration_file_for).once
|
60
|
+
Config.should_receive(:configuration_from_file).once
|
61
|
+
ConfigStore.for('file1')
|
62
|
+
end
|
63
|
+
end
|
64
|
+
end
|
65
|
+
end
|
66
|
+
end
|
@@ -0,0 +1,38 @@
|
|
1
|
+
# encoding: utf-8
|
2
|
+
|
3
|
+
require 'spec_helper'
|
4
|
+
|
5
|
+
module Rubocop
|
6
|
+
module Cop
|
7
|
+
describe Cop do
|
8
|
+
let(:cop) { Cop.new }
|
9
|
+
let(:location) do
|
10
|
+
source_buffer = Parser::Source::Buffer.new('test', 1)
|
11
|
+
source_buffer.source = "a\n"
|
12
|
+
Parser::Source::Range.new(source_buffer, 0, 1)
|
13
|
+
end
|
14
|
+
|
15
|
+
it 'initially has 0 offences' do
|
16
|
+
expect(cop.offences).to be_empty
|
17
|
+
end
|
18
|
+
|
19
|
+
it 'keeps track of offences' do
|
20
|
+
cop.add_offence(:convention, location, 'message')
|
21
|
+
|
22
|
+
expect(cop.offences.size).to eq(1)
|
23
|
+
end
|
24
|
+
|
25
|
+
it 'will report registered offences' do
|
26
|
+
cop.add_offence(:convention, location, 'message')
|
27
|
+
|
28
|
+
expect(cop.offences).not_to be_empty
|
29
|
+
end
|
30
|
+
|
31
|
+
it 'registers offence with its name' do
|
32
|
+
cop = Style::AvoidFor.new
|
33
|
+
cop.add_offence(:convention, location, 'message')
|
34
|
+
expect(cop.offences.first.cop_name).to eq('AvoidFor')
|
35
|
+
end
|
36
|
+
end
|
37
|
+
end
|
38
|
+
end
|
@@ -0,0 +1,111 @@
|
|
1
|
+
# encoding: utf-8
|
2
|
+
|
3
|
+
require 'spec_helper'
|
4
|
+
|
5
|
+
module Rubocop
|
6
|
+
module Cop
|
7
|
+
module Lint
|
8
|
+
describe AssignmentInCondition do
|
9
|
+
let(:cop) { AssignmentInCondition.new }
|
10
|
+
before do
|
11
|
+
AssignmentInCondition.config = { 'AllowSafeAssignment' => true }
|
12
|
+
end
|
13
|
+
|
14
|
+
it 'registers an offence for lvar assignment in condition' do
|
15
|
+
inspect_source(cop,
|
16
|
+
['if test = 10',
|
17
|
+
'end'
|
18
|
+
])
|
19
|
+
expect(cop.offences.size).to eq(1)
|
20
|
+
end
|
21
|
+
|
22
|
+
it 'registers an offence for lvar assignment in while condition' do
|
23
|
+
inspect_source(cop,
|
24
|
+
['while test = 10',
|
25
|
+
'end'
|
26
|
+
])
|
27
|
+
expect(cop.offences.size).to eq(1)
|
28
|
+
end
|
29
|
+
|
30
|
+
it 'registers an offence for lvar assignment in until condition' do
|
31
|
+
inspect_source(cop,
|
32
|
+
['until test = 10',
|
33
|
+
'end'
|
34
|
+
])
|
35
|
+
expect(cop.offences.size).to eq(1)
|
36
|
+
end
|
37
|
+
|
38
|
+
it 'registers an offence for ivar assignment in condition' do
|
39
|
+
inspect_source(cop,
|
40
|
+
['if @test = 10',
|
41
|
+
'end'
|
42
|
+
])
|
43
|
+
expect(cop.offences.size).to eq(1)
|
44
|
+
end
|
45
|
+
|
46
|
+
it 'registers an offence for clvar assignment in condition' do
|
47
|
+
inspect_source(cop,
|
48
|
+
['if @@test = 10',
|
49
|
+
'end'
|
50
|
+
])
|
51
|
+
expect(cop.offences.size).to eq(1)
|
52
|
+
end
|
53
|
+
|
54
|
+
it 'registers an offence for gvar assignment in condition' do
|
55
|
+
inspect_source(cop,
|
56
|
+
['if $test = 10',
|
57
|
+
'end'
|
58
|
+
])
|
59
|
+
expect(cop.offences.size).to eq(1)
|
60
|
+
end
|
61
|
+
|
62
|
+
it 'registers an offence for constant assignment in condition' do
|
63
|
+
inspect_source(cop,
|
64
|
+
['if TEST = 10',
|
65
|
+
'end'
|
66
|
+
])
|
67
|
+
expect(cop.offences.size).to eq(1)
|
68
|
+
end
|
69
|
+
|
70
|
+
it 'accepts == in condition' do
|
71
|
+
inspect_source(cop,
|
72
|
+
['if test == 10',
|
73
|
+
'end'
|
74
|
+
])
|
75
|
+
expect(cop.offences).to be_empty
|
76
|
+
end
|
77
|
+
|
78
|
+
it 'accepts ||= in condition' do
|
79
|
+
inspect_source(cop,
|
80
|
+
['raise StandardError unless foo ||= bar'])
|
81
|
+
expect(cop.offences).to be_empty
|
82
|
+
end
|
83
|
+
|
84
|
+
context 'safe assignment is allowed' do
|
85
|
+
it 'accepts = in condition surrounded with braces' do
|
86
|
+
inspect_source(cop,
|
87
|
+
['if (test = 10)',
|
88
|
+
'end'
|
89
|
+
])
|
90
|
+
expect(cop.offences).to be_empty
|
91
|
+
end
|
92
|
+
|
93
|
+
end
|
94
|
+
|
95
|
+
context 'safe assignment is not allowed' do
|
96
|
+
before do
|
97
|
+
AssignmentInCondition.config['AllowSafeAssignment'] = false
|
98
|
+
end
|
99
|
+
|
100
|
+
it 'does not accepts = in condition surrounded with braces' do
|
101
|
+
inspect_source(cop,
|
102
|
+
['if (test == 10)',
|
103
|
+
'end'
|
104
|
+
])
|
105
|
+
expect(cop.offences).to be_empty
|
106
|
+
end
|
107
|
+
end
|
108
|
+
end
|
109
|
+
end
|
110
|
+
end
|
111
|
+
end
|
@@ -0,0 +1,333 @@
|
|
1
|
+
# encoding: utf-8
|
2
|
+
# rubocop:disable LineLength
|
3
|
+
|
4
|
+
require 'spec_helper'
|
5
|
+
|
6
|
+
module Rubocop
|
7
|
+
module Cop
|
8
|
+
module Lint
|
9
|
+
describe EndAlignment do
|
10
|
+
let(:cop) { EndAlignment.new }
|
11
|
+
|
12
|
+
it 'registers an offence for mismatched class end' do
|
13
|
+
inspect_source(cop,
|
14
|
+
['class Test',
|
15
|
+
' end'
|
16
|
+
])
|
17
|
+
expect(cop.offences.size).to eq(1)
|
18
|
+
end
|
19
|
+
|
20
|
+
it 'registers an offence for mismatched module end' do
|
21
|
+
inspect_source(cop,
|
22
|
+
['module Test',
|
23
|
+
' end'
|
24
|
+
])
|
25
|
+
expect(cop.offences.size).to eq(1)
|
26
|
+
end
|
27
|
+
|
28
|
+
it 'registers an offence for mismatched def end' do
|
29
|
+
inspect_source(cop,
|
30
|
+
['def test',
|
31
|
+
' end'
|
32
|
+
])
|
33
|
+
expect(cop.offences.size).to eq(1)
|
34
|
+
end
|
35
|
+
|
36
|
+
it 'registers an offence for mismatched defs end' do
|
37
|
+
inspect_source(cop,
|
38
|
+
['def Test.test',
|
39
|
+
' end'
|
40
|
+
])
|
41
|
+
expect(cop.offences.size).to eq(1)
|
42
|
+
end
|
43
|
+
|
44
|
+
it 'registers an offence for mismatched if end' do
|
45
|
+
inspect_source(cop,
|
46
|
+
['if test',
|
47
|
+
' end'
|
48
|
+
])
|
49
|
+
expect(cop.offences.size).to eq(1)
|
50
|
+
end
|
51
|
+
|
52
|
+
it 'registers an offence for mismatched while end' do
|
53
|
+
inspect_source(cop,
|
54
|
+
['while test',
|
55
|
+
' end'
|
56
|
+
])
|
57
|
+
expect(cop.offences.size).to eq(1)
|
58
|
+
end
|
59
|
+
|
60
|
+
it 'registers an offence for mismatched until end' do
|
61
|
+
inspect_source(cop,
|
62
|
+
['until test',
|
63
|
+
' end'
|
64
|
+
])
|
65
|
+
expect(cop.offences.size).to eq(1)
|
66
|
+
end
|
67
|
+
|
68
|
+
it 'registers an offence for mismatched block end' do
|
69
|
+
inspect_source(cop,
|
70
|
+
['test do |ala|',
|
71
|
+
' end'
|
72
|
+
])
|
73
|
+
expect(cop.offences.size).to eq(1)
|
74
|
+
end
|
75
|
+
|
76
|
+
context 'when the block is a logical operand' do
|
77
|
+
it 'accepts a correctly aligned block end' do
|
78
|
+
inspect_source(cop,
|
79
|
+
['(value.is_a? Array) && value.all? do |subvalue|',
|
80
|
+
' type_check_value(subvalue, array_type)',
|
81
|
+
'end',
|
82
|
+
'a || b do',
|
83
|
+
'end',
|
84
|
+
])
|
85
|
+
expect(cop.offences).to be_empty
|
86
|
+
end
|
87
|
+
end
|
88
|
+
|
89
|
+
it 'accepts end aligned with a variable' do
|
90
|
+
inspect_source(cop,
|
91
|
+
['variable = test do |ala|',
|
92
|
+
'end'
|
93
|
+
])
|
94
|
+
expect(cop.offences).to be_empty
|
95
|
+
end
|
96
|
+
|
97
|
+
context 'and the block is an operand' do
|
98
|
+
it 'accepts end aligned with a variable' do
|
99
|
+
inspect_source(cop,
|
100
|
+
['b = 1 + preceding_line.reduce(0) do |a, e|',
|
101
|
+
' a + e.length + newline_length',
|
102
|
+
'end + 1'
|
103
|
+
])
|
104
|
+
expect(cop.offences).to be_empty
|
105
|
+
end
|
106
|
+
end
|
107
|
+
|
108
|
+
it 'registers an offence for mismatched block end with a variable' do
|
109
|
+
inspect_source(cop,
|
110
|
+
['variable = test do |ala|',
|
111
|
+
' end'
|
112
|
+
])
|
113
|
+
expect(cop.offences.size).to eq(1)
|
114
|
+
end
|
115
|
+
|
116
|
+
context 'when the block is defined on the next line' do
|
117
|
+
it 'accepts end aligned with the block expression' do
|
118
|
+
inspect_source(cop,
|
119
|
+
['variable =',
|
120
|
+
' a_long_method_that_dont_fit_on_the_line do |v|',
|
121
|
+
' v.foo',
|
122
|
+
' end'
|
123
|
+
])
|
124
|
+
expect(cop.offences).to be_empty
|
125
|
+
end
|
126
|
+
|
127
|
+
it 'registers an offences for mismatched end alignment' do
|
128
|
+
inspect_source(cop,
|
129
|
+
['variable =',
|
130
|
+
' a_long_method_that_dont_fit_on_the_line do |v|',
|
131
|
+
' v.foo',
|
132
|
+
'end'
|
133
|
+
])
|
134
|
+
expect(cop.offences.size).to eq(1)
|
135
|
+
end
|
136
|
+
end
|
137
|
+
|
138
|
+
it 'accepts end aligned with an instance variable' do
|
139
|
+
inspect_source(cop,
|
140
|
+
['@variable = test do |ala|',
|
141
|
+
'end'
|
142
|
+
])
|
143
|
+
expect(cop.offences).to be_empty
|
144
|
+
end
|
145
|
+
|
146
|
+
it 'registers an offence for mismatched block end with an instance variable' do
|
147
|
+
inspect_source(cop,
|
148
|
+
['@variable = test do |ala|',
|
149
|
+
' end'
|
150
|
+
])
|
151
|
+
expect(cop.offences.size).to eq(1)
|
152
|
+
end
|
153
|
+
|
154
|
+
it 'accepts end aligned with a class variable' do
|
155
|
+
inspect_source(cop,
|
156
|
+
['@@variable = test do |ala|',
|
157
|
+
'end'
|
158
|
+
])
|
159
|
+
expect(cop.offences).to be_empty
|
160
|
+
end
|
161
|
+
|
162
|
+
it 'registers an offence for mismatched block end with a class variable' do
|
163
|
+
inspect_source(cop,
|
164
|
+
['@@variable = test do |ala|',
|
165
|
+
' end'
|
166
|
+
])
|
167
|
+
expect(cop.offences.size).to eq(1)
|
168
|
+
end
|
169
|
+
|
170
|
+
it 'accepts end aligned with a global variable' do
|
171
|
+
inspect_source(cop,
|
172
|
+
['$variable = test do |ala|',
|
173
|
+
'end'
|
174
|
+
])
|
175
|
+
expect(cop.offences).to be_empty
|
176
|
+
end
|
177
|
+
|
178
|
+
it 'registers an offence for mismatched block end with a global variable' do
|
179
|
+
inspect_source(cop,
|
180
|
+
['$variable = test do |ala|',
|
181
|
+
' end'
|
182
|
+
])
|
183
|
+
expect(cop.offences.size).to eq(1)
|
184
|
+
end
|
185
|
+
|
186
|
+
it 'accepts end aligned with a constant' do
|
187
|
+
inspect_source(cop,
|
188
|
+
['CONSTANT = test do |ala|',
|
189
|
+
'end'
|
190
|
+
])
|
191
|
+
expect(cop.offences).to be_empty
|
192
|
+
end
|
193
|
+
|
194
|
+
it 'registers an offence for mismatched block end with a constant' do
|
195
|
+
inspect_source(cop,
|
196
|
+
['Module::CONSTANT = test do |ala|',
|
197
|
+
' end'
|
198
|
+
])
|
199
|
+
expect(cop.offences.size).to eq(1)
|
200
|
+
end
|
201
|
+
|
202
|
+
it 'accepts end aligned with a method call' do
|
203
|
+
inspect_source(cop,
|
204
|
+
['parser.childs << lambda do |token|',
|
205
|
+
' token << 1',
|
206
|
+
'end'
|
207
|
+
])
|
208
|
+
expect(cop.offences).to be_empty
|
209
|
+
end
|
210
|
+
|
211
|
+
it 'registers an offence for mismatched block end with a method call' do
|
212
|
+
inspect_source(cop,
|
213
|
+
['parser.childs << lambda do |token|',
|
214
|
+
' token << 1',
|
215
|
+
' end'
|
216
|
+
])
|
217
|
+
expect(cop.offences.size).to eq(1)
|
218
|
+
end
|
219
|
+
|
220
|
+
it 'accepts end aligned with a method call with arguments' do
|
221
|
+
inspect_source(cop,
|
222
|
+
['@h[:f] = f.each_pair.map do |f, v|',
|
223
|
+
' v = 1',
|
224
|
+
'end'
|
225
|
+
])
|
226
|
+
expect(cop.offences).to be_empty
|
227
|
+
end
|
228
|
+
|
229
|
+
it 'registers an offence for mismatched end with a method call with arguments' do
|
230
|
+
inspect_source(cop,
|
231
|
+
['@h[:f] = f.each_pair.map do |f, v|',
|
232
|
+
' v = 1',
|
233
|
+
' end'
|
234
|
+
])
|
235
|
+
expect(cop.offences.size).to eq(1)
|
236
|
+
end
|
237
|
+
|
238
|
+
it 'does not raise an error for nested block in a method call' do
|
239
|
+
inspect_source(cop,
|
240
|
+
['expect(arr.all? { |o| o.valid? })'
|
241
|
+
])
|
242
|
+
expect(cop.offences).to be_empty
|
243
|
+
end
|
244
|
+
|
245
|
+
it 'accepts end aligned with the outermost method in the method chain that calls the block' do
|
246
|
+
inspect_source(cop,
|
247
|
+
['expect(arr.all? do |o|',
|
248
|
+
' o.valid?',
|
249
|
+
'end)'
|
250
|
+
])
|
251
|
+
expect(cop.offences).to be_empty
|
252
|
+
end
|
253
|
+
|
254
|
+
it 'registers an offence for mismatched end aligned with the outermost method in the method chain that calls the block' do
|
255
|
+
inspect_source(cop,
|
256
|
+
['expect(arr.all? do |o|',
|
257
|
+
' o.valid?',
|
258
|
+
' end)'
|
259
|
+
])
|
260
|
+
expect(cop.offences.size).to eq(1)
|
261
|
+
end
|
262
|
+
|
263
|
+
it 'accepts end aligned with an op-asgn (+=, -=)' do
|
264
|
+
inspect_source(cop,
|
265
|
+
['rb += files.select do |file|',
|
266
|
+
' file << something',
|
267
|
+
'end'
|
268
|
+
])
|
269
|
+
expect(cop.offences).to be_empty
|
270
|
+
end
|
271
|
+
|
272
|
+
it 'registers an offence for mismatched block end with an op-asgn (+=, -=)' do
|
273
|
+
inspect_source(cop,
|
274
|
+
['rb += files.select do |file|',
|
275
|
+
' file << something',
|
276
|
+
' end'
|
277
|
+
])
|
278
|
+
expect(cop.offences.size).to eq(1)
|
279
|
+
end
|
280
|
+
|
281
|
+
it 'accepts end aligned with an and-asgn (&&=)' do
|
282
|
+
inspect_source(cop,
|
283
|
+
['variable &&= test do |ala|',
|
284
|
+
'end'
|
285
|
+
])
|
286
|
+
expect(cop.offences).to be_empty
|
287
|
+
end
|
288
|
+
|
289
|
+
it 'registers an offence for mismatched block end with an and-asgn (&&=)' do
|
290
|
+
inspect_source(cop,
|
291
|
+
['variable &&= test do |ala|',
|
292
|
+
' end'
|
293
|
+
])
|
294
|
+
expect(cop.offences.size).to eq(1)
|
295
|
+
end
|
296
|
+
|
297
|
+
it 'accepts end aligned with an or-asgn (||=)' do
|
298
|
+
inspect_source(cop,
|
299
|
+
['variable ||= test do |ala|',
|
300
|
+
'end'
|
301
|
+
])
|
302
|
+
expect(cop.offences).to be_empty
|
303
|
+
end
|
304
|
+
|
305
|
+
it 'registers an offence for mismatched block end with an or-asgn (||=)' do
|
306
|
+
inspect_source(cop,
|
307
|
+
['variable ||= test do |ala|',
|
308
|
+
' end'
|
309
|
+
])
|
310
|
+
expect(cop.offences.size).to eq(1)
|
311
|
+
end
|
312
|
+
|
313
|
+
it 'accepts end aligned with a mass assignment' do
|
314
|
+
inspect_source(cop,
|
315
|
+
['var1, var2 = lambda do |test|',
|
316
|
+
' [1, 2]',
|
317
|
+
'end'
|
318
|
+
])
|
319
|
+
expect(cop.offences).to be_empty
|
320
|
+
end
|
321
|
+
|
322
|
+
it 'registers an offence for mismatched block end with a mass assignment' do
|
323
|
+
inspect_source(cop,
|
324
|
+
['var1, var2 = lambda do |test|',
|
325
|
+
' [1, 2]',
|
326
|
+
' end'
|
327
|
+
])
|
328
|
+
expect(cop.offences.size).to eq(1)
|
329
|
+
end
|
330
|
+
end
|
331
|
+
end
|
332
|
+
end
|
333
|
+
end
|