rubocop 0.13.1 → 0.14.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.
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,65 +2,108 @@
|
|
2
2
|
|
3
3
|
require 'spec_helper'
|
4
4
|
|
5
|
-
|
6
|
-
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
|
5
|
+
describe Rubocop::ProcessedSource do
|
6
|
+
subject(:processed_source) do
|
7
|
+
described_class.new(
|
8
|
+
buffer,
|
9
|
+
double('ast'),
|
10
|
+
double('comments'),
|
11
|
+
double('tokens'),
|
12
|
+
diagnostics
|
13
|
+
)
|
14
|
+
end
|
15
|
+
|
16
|
+
let(:diagnostics) { double('diagnostics') }
|
17
|
+
|
18
|
+
let(:source) do
|
19
|
+
[
|
20
|
+
'def some_method',
|
21
|
+
" puts 'foo'",
|
22
|
+
'end',
|
23
|
+
'some_method'
|
24
|
+
].join("\n")
|
25
|
+
end
|
26
|
+
|
27
|
+
let(:buffer) do
|
28
|
+
buffer = Parser::Source::Buffer.new('(string)', 1)
|
29
|
+
buffer.source = source
|
30
|
+
buffer
|
31
|
+
end
|
32
|
+
|
33
|
+
describe '#lines' do
|
34
|
+
it 'is an array' do
|
35
|
+
expect(processed_source.lines).to be_a(Array)
|
15
36
|
end
|
16
37
|
|
17
|
-
|
18
|
-
|
19
|
-
'def some_method',
|
20
|
-
" puts 'foo'",
|
21
|
-
'end',
|
22
|
-
'some_method'
|
23
|
-
].join("\n")
|
38
|
+
it 'has same number of elements as line count' do
|
39
|
+
expect(processed_source.lines.size).to eq(4)
|
24
40
|
end
|
25
41
|
|
26
|
-
|
27
|
-
|
28
|
-
|
29
|
-
buffer
|
42
|
+
it 'contains lines as string without linefeed' do
|
43
|
+
first_line = processed_source.lines.first
|
44
|
+
expect(first_line).to eq('def some_method')
|
30
45
|
end
|
46
|
+
end
|
31
47
|
|
32
|
-
|
33
|
-
|
34
|
-
|
48
|
+
describe '#[]' do
|
49
|
+
context 'when an index is passed' do
|
50
|
+
it 'returns the line' do
|
51
|
+
expect(processed_source[2]).to eq('end')
|
35
52
|
end
|
53
|
+
end
|
36
54
|
|
37
|
-
|
38
|
-
|
55
|
+
context 'when a range is passed' do
|
56
|
+
it 'returns the array of lines' do
|
57
|
+
expect(processed_source[2..3]).to eq(%w(end some_method))
|
39
58
|
end
|
59
|
+
end
|
40
60
|
|
41
|
-
|
42
|
-
|
43
|
-
expect(
|
61
|
+
context 'when start index and length are passed' do
|
62
|
+
it 'returns the array of lines' do
|
63
|
+
expect(processed_source[2, 2]).to eq(%w(end some_method))
|
44
64
|
end
|
45
65
|
end
|
66
|
+
end
|
46
67
|
|
47
|
-
|
48
|
-
|
49
|
-
|
50
|
-
|
51
|
-
|
68
|
+
describe 'valid_syntax?' do
|
69
|
+
let(:diagnostics) do
|
70
|
+
[Parser::Diagnostic.new(level, 'message', double('location'))]
|
71
|
+
end
|
72
|
+
|
73
|
+
context 'when the source has diagnostic with error level' do
|
74
|
+
let(:level) { :error }
|
75
|
+
|
76
|
+
it 'returns false' do
|
77
|
+
expect(processed_source.valid_syntax?).to be_false
|
78
|
+
end
|
79
|
+
end
|
80
|
+
|
81
|
+
context 'when the source has diagnostic with error level' do
|
82
|
+
let(:level) { :fatal }
|
83
|
+
|
84
|
+
it 'returns false' do
|
85
|
+
expect(processed_source.valid_syntax?).to be_false
|
52
86
|
end
|
87
|
+
end
|
88
|
+
|
89
|
+
context 'when the source has diagnostic with error level' do
|
90
|
+
let(:level) { :warning }
|
91
|
+
|
92
|
+
it 'returns false' do
|
93
|
+
expect(processed_source.valid_syntax?).to be_true
|
94
|
+
end
|
95
|
+
end
|
53
96
|
|
54
|
-
|
55
|
-
|
56
|
-
|
57
|
-
|
97
|
+
context 'when the source has diagnostics with error and warning level' do
|
98
|
+
let(:diagnostics) do
|
99
|
+
[
|
100
|
+
Parser::Diagnostic.new(:error, 'message', double('location')),
|
101
|
+
Parser::Diagnostic.new(:warning, 'message', double('location'))
|
102
|
+
]
|
58
103
|
end
|
59
104
|
|
60
|
-
|
61
|
-
|
62
|
-
expect(processed_source[2, 2]).to eq(%w(end some_method))
|
63
|
-
end
|
105
|
+
it 'returns false' do
|
106
|
+
expect(processed_source.valid_syntax?).to be_false
|
64
107
|
end
|
65
108
|
end
|
66
109
|
end
|
@@ -2,139 +2,137 @@
|
|
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
|
-
end
|
5
|
+
describe Rubocop::SourceParser, :isolated_environment do
|
6
|
+
include FileHelper
|
7
|
+
|
8
|
+
describe '.parse_file' do
|
9
|
+
let(:file) { 'example.rb' }
|
10
|
+
|
11
|
+
let(:source) do
|
12
|
+
[
|
13
|
+
'# encoding: utf-8',
|
14
|
+
'',
|
15
|
+
'def some_method',
|
16
|
+
" puts 'foo'",
|
17
|
+
'end',
|
18
|
+
'',
|
19
|
+
'some_method'
|
20
|
+
]
|
21
|
+
end
|
23
22
|
|
24
|
-
|
25
|
-
|
26
|
-
|
23
|
+
before do
|
24
|
+
create_file(file, source)
|
25
|
+
end
|
27
26
|
|
28
|
-
|
29
|
-
|
30
|
-
|
27
|
+
let(:processed_source) do
|
28
|
+
described_class.parse_file(file)
|
29
|
+
end
|
30
|
+
|
31
|
+
it 'returns ProcessedSource' do
|
32
|
+
expect(processed_source).to be_a(Rubocop::ProcessedSource)
|
33
|
+
end
|
31
34
|
|
32
|
-
|
33
|
-
|
35
|
+
describe 'the returned processed source' do
|
36
|
+
it 'has the root node of AST' do
|
37
|
+
expect(processed_source.ast).to be_a(Parser::AST::Node)
|
34
38
|
end
|
35
39
|
|
36
|
-
|
37
|
-
|
38
|
-
|
39
|
-
|
40
|
+
it 'has an array of comments' do
|
41
|
+
expect(processed_source.comments).to be_a(Array)
|
42
|
+
expect(processed_source.comments.first)
|
43
|
+
.to be_a(Parser::Source::Comment)
|
44
|
+
end
|
40
45
|
|
41
|
-
|
42
|
-
|
43
|
-
|
44
|
-
|
45
|
-
end
|
46
|
+
it 'has an array of tokens' do
|
47
|
+
expect(processed_source.tokens).to be_a(Array)
|
48
|
+
expect(processed_source.tokens.first).to be_a(Rubocop::Token)
|
49
|
+
end
|
46
50
|
|
47
|
-
|
48
|
-
|
49
|
-
|
50
|
-
end
|
51
|
+
it 'has a source buffer' do
|
52
|
+
expect(processed_source.buffer).to be_a(Parser::Source::Buffer)
|
53
|
+
end
|
51
54
|
|
52
|
-
|
53
|
-
|
55
|
+
context 'when the source is valid' do
|
56
|
+
it 'does not have diagnostics' do
|
57
|
+
expect(processed_source.diagnostics).to be_a(Array)
|
58
|
+
expect(processed_source.diagnostics).to be_empty
|
54
59
|
end
|
60
|
+
end
|
55
61
|
|
56
|
-
|
57
|
-
|
58
|
-
|
59
|
-
|
60
|
-
|
62
|
+
context 'when the source has invalid syntax' do
|
63
|
+
let(:source) do
|
64
|
+
[
|
65
|
+
'# encoding: utf-8',
|
66
|
+
'',
|
67
|
+
'def some_method',
|
68
|
+
" puts 'foo'",
|
69
|
+
'end',
|
70
|
+
'',
|
71
|
+
'some_method',
|
72
|
+
'',
|
73
|
+
'?invalid_syntax'
|
74
|
+
]
|
61
75
|
end
|
62
76
|
|
63
|
-
|
64
|
-
|
65
|
-
|
66
|
-
|
67
|
-
'',
|
68
|
-
'def some_method',
|
69
|
-
" puts 'foo'",
|
70
|
-
'end',
|
71
|
-
'',
|
72
|
-
'some_method',
|
73
|
-
'',
|
74
|
-
'?invalid_syntax'
|
75
|
-
]
|
76
|
-
end
|
77
|
-
|
78
|
-
it 'has an array of diagnostics' do
|
79
|
-
expect(processed_source.diagnostics).to be_a(Array)
|
80
|
-
expect(processed_source.diagnostics.first)
|
81
|
-
.to be_a(Parser::Diagnostic)
|
82
|
-
end
|
77
|
+
it 'has an array of diagnostics' do
|
78
|
+
expect(processed_source.diagnostics).to be_a(Array)
|
79
|
+
expect(processed_source.diagnostics.first)
|
80
|
+
.to be_a(Parser::Diagnostic)
|
83
81
|
end
|
84
82
|
end
|
85
83
|
end
|
84
|
+
end
|
86
85
|
|
87
|
-
|
88
|
-
|
89
|
-
|
90
|
-
|
91
|
-
|
92
|
-
|
93
|
-
|
94
|
-
|
95
|
-
|
96
|
-
|
97
|
-
|
98
|
-
|
99
|
-
|
100
|
-
|
101
|
-
|
102
|
-
|
103
|
-
|
104
|
-
|
105
|
-
|
106
|
-
|
86
|
+
describe '.cop_disabled_lines_in' do
|
87
|
+
let(:source) do
|
88
|
+
[
|
89
|
+
'# encoding: utf-8',
|
90
|
+
'',
|
91
|
+
'# rubocop:disable MethodLength',
|
92
|
+
'def some_method',
|
93
|
+
" puts 'foo'",
|
94
|
+
'end',
|
95
|
+
'# rubocop:enable MethodLength',
|
96
|
+
'',
|
97
|
+
'# rubocop:disable all',
|
98
|
+
'some_method',
|
99
|
+
'# rubocop:enable all',
|
100
|
+
'',
|
101
|
+
"code = 'This is evil.'",
|
102
|
+
'eval(code) # rubocop:disable Eval',
|
103
|
+
"puts 'This is not evil.'"
|
104
|
+
]
|
105
|
+
end
|
107
106
|
|
108
|
-
|
107
|
+
let(:disabled_lines) { described_class.cop_disabled_lines_in(source) }
|
109
108
|
|
110
|
-
|
111
|
-
|
112
|
-
|
113
|
-
|
109
|
+
it 'has keys for disabled cops' do
|
110
|
+
expect(disabled_lines).to have_key('MethodLength')
|
111
|
+
expect(disabled_lines).to have_key('Eval')
|
112
|
+
end
|
114
113
|
|
115
|
-
|
116
|
-
|
117
|
-
|
118
|
-
|
119
|
-
|
120
|
-
|
114
|
+
it 'supports disabling multiple lines with a pair of directive' do
|
115
|
+
method_length_disabled_lines = disabled_lines['MethodLength']
|
116
|
+
expected_part = (3..6).to_a
|
117
|
+
expect(method_length_disabled_lines & expected_part)
|
118
|
+
.to eq(expected_part)
|
119
|
+
end
|
121
120
|
|
122
|
-
|
123
|
-
|
124
|
-
|
125
|
-
|
126
|
-
|
121
|
+
it 'supports disabling single line with a direcive at end of line' do
|
122
|
+
eval_disabled_lines = disabled_lines['Eval']
|
123
|
+
expect(eval_disabled_lines).to include(14)
|
124
|
+
expect(eval_disabled_lines).not_to include(15)
|
125
|
+
end
|
127
126
|
|
128
|
-
|
129
|
-
|
130
|
-
|
127
|
+
it 'supports disabling all cops with keyword all' do
|
128
|
+
all_cop_names = Rubocop::Cop::Cop.all.map(&:cop_name).sort
|
129
|
+
expect(disabled_lines.keys.sort).to eq(all_cop_names)
|
131
130
|
|
132
|
-
|
131
|
+
expected_part = (9..10).to_a
|
133
132
|
|
134
|
-
|
135
|
-
|
136
|
-
|
137
|
-
end
|
133
|
+
disabled_lines.each_value do |each_cop_disabled_lines|
|
134
|
+
expect(each_cop_disabled_lines & expected_part)
|
135
|
+
.to eq(expected_part)
|
138
136
|
end
|
139
137
|
end
|
140
138
|
end
|
@@ -2,177 +2,175 @@
|
|
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
|
-
end
|
5
|
+
describe Rubocop::TargetFinder, :isolated_environment do
|
6
|
+
include FileHelper
|
7
|
+
|
8
|
+
subject(:target_finder) { described_class.new(config_store, debug) }
|
9
|
+
let(:config_store) { Rubocop::ConfigStore.new }
|
10
|
+
let(:debug) { false }
|
11
|
+
|
12
|
+
before do
|
13
|
+
create_file('dir1/ruby1.rb', '# encoding: utf-8')
|
14
|
+
create_file('dir1/ruby2.rb', '# encoding: utf-8')
|
15
|
+
create_file('dir1/file.txt', '# encoding: utf-8')
|
16
|
+
create_file('dir1/file', '# encoding: utf-8')
|
17
|
+
create_file('dir1/executable', '#!/usr/bin/env ruby')
|
18
|
+
create_file('dir2/ruby3.rb', '# encoding: utf-8')
|
19
|
+
end
|
21
20
|
|
22
|
-
|
23
|
-
|
24
|
-
|
25
|
-
|
21
|
+
describe '#find' do
|
22
|
+
let(:found_files) { target_finder.find(args) }
|
23
|
+
let(:found_basenames) { found_files.map { |f| File.basename(f) } }
|
24
|
+
let(:args) { [] }
|
26
25
|
|
27
|
-
|
28
|
-
|
29
|
-
|
30
|
-
|
31
|
-
end
|
26
|
+
it 'returns absolute paths' do
|
27
|
+
expect(found_files).not_to be_empty
|
28
|
+
found_files.each do |file|
|
29
|
+
expect(file).to start_with('/')
|
32
30
|
end
|
31
|
+
end
|
33
32
|
|
34
|
-
|
35
|
-
|
33
|
+
context 'when no argument is passed' do
|
34
|
+
let(:args) { [] }
|
36
35
|
|
37
|
-
|
38
|
-
|
39
|
-
|
40
|
-
|
41
|
-
|
42
|
-
|
43
|
-
end
|
36
|
+
it 'finds files under the current directory' do
|
37
|
+
Dir.chdir('dir1') do
|
38
|
+
expect(found_files).not_to be_empty
|
39
|
+
found_files.each do |file|
|
40
|
+
expect(file).to include('/dir1/')
|
41
|
+
expect(file).not_to include('/dir2/')
|
44
42
|
end
|
45
43
|
end
|
46
44
|
end
|
45
|
+
end
|
47
46
|
|
48
|
-
|
49
|
-
|
47
|
+
context 'when a directory path is passed' do
|
48
|
+
let(:args) { ['../dir2'] }
|
50
49
|
|
51
|
-
|
52
|
-
|
53
|
-
|
54
|
-
|
55
|
-
|
56
|
-
|
57
|
-
end
|
50
|
+
it 'finds files under the specified directory' do
|
51
|
+
Dir.chdir('dir1') do
|
52
|
+
expect(found_files).not_to be_empty
|
53
|
+
found_files.each do |file|
|
54
|
+
expect(file).to include('/dir2/')
|
55
|
+
expect(file).not_to include('/dir1/')
|
58
56
|
end
|
59
57
|
end
|
60
58
|
end
|
59
|
+
end
|
61
60
|
|
62
|
-
|
63
|
-
|
61
|
+
context 'when a file is passed' do
|
62
|
+
let(:args) { ['dir2/file'] }
|
64
63
|
|
65
|
-
|
66
|
-
|
67
|
-
end
|
64
|
+
it 'picks the file' do
|
65
|
+
expect(found_basenames).to eq(['file'])
|
68
66
|
end
|
67
|
+
end
|
69
68
|
|
70
|
-
|
71
|
-
|
69
|
+
context 'when a pattern is passed' do
|
70
|
+
let(:args) { ['dir1/*2.rb'] }
|
72
71
|
|
73
|
-
|
74
|
-
|
75
|
-
end
|
72
|
+
it 'finds files which match the pattern' do
|
73
|
+
expect(found_basenames).to eq(['ruby2.rb'])
|
76
74
|
end
|
75
|
+
end
|
77
76
|
|
78
|
-
|
79
|
-
|
77
|
+
context 'when same paths are passed' do
|
78
|
+
let(:args) { %w(dir1 dir1) }
|
80
79
|
|
81
|
-
|
82
|
-
|
83
|
-
|
84
|
-
end
|
80
|
+
it 'does not return duplicated file paths' do
|
81
|
+
count = found_basenames.count { |f| f == 'ruby1.rb' }
|
82
|
+
expect(count).to eq(1)
|
85
83
|
end
|
86
84
|
end
|
85
|
+
end
|
87
86
|
|
88
|
-
|
89
|
-
|
90
|
-
|
91
|
-
|
92
|
-
|
93
|
-
it 'picks files with extension .rb' do
|
94
|
-
rb_file_count = found_files.count { |f| f.end_with?('.rb') }
|
95
|
-
expect(rb_file_count).to eq(3)
|
96
|
-
end
|
87
|
+
describe '#target_files_in_dir' do
|
88
|
+
let(:found_files) { target_finder.target_files_in_dir(base_dir) }
|
89
|
+
let(:found_basenames) { found_files.map { |f| File.basename(f) } }
|
90
|
+
let(:base_dir) { '.' }
|
97
91
|
|
98
|
-
|
99
|
-
|
100
|
-
|
92
|
+
it 'picks files with extension .rb' do
|
93
|
+
rb_file_count = found_files.count { |f| f.end_with?('.rb') }
|
94
|
+
expect(rb_file_count).to eq(3)
|
95
|
+
end
|
101
96
|
|
102
|
-
|
103
|
-
|
104
|
-
|
97
|
+
it 'picks ruby executable files with no extension' do
|
98
|
+
expect(found_basenames).to include('executable')
|
99
|
+
end
|
105
100
|
|
106
|
-
|
107
|
-
|
108
|
-
|
101
|
+
it 'does not pick files with no extension and no ruby shebang' do
|
102
|
+
expect(found_basenames).not_to include('file')
|
103
|
+
end
|
109
104
|
|
110
|
-
|
111
|
-
|
112
|
-
|
113
|
-
end
|
105
|
+
it 'picks ruby executable files with no extension' do
|
106
|
+
expect(found_basenames).to include('executable')
|
107
|
+
end
|
114
108
|
|
115
|
-
|
116
|
-
|
117
|
-
|
118
|
-
|
119
|
-
end
|
120
|
-
config.stub(:file_to_exclude?).and_return(false)
|
121
|
-
config_store.stub(:for).and_return(config)
|
109
|
+
it 'does not pick directories' do
|
110
|
+
found_basenames = found_files.map { |f| File.basename(f) }
|
111
|
+
expect(found_basenames).not_to include('dir1')
|
112
|
+
end
|
122
113
|
|
123
|
-
|
114
|
+
it 'picks files specified to be included in config' do
|
115
|
+
config = double('config')
|
116
|
+
config.stub(:file_to_include?) do |file|
|
117
|
+
File.basename(file) == 'file'
|
124
118
|
end
|
119
|
+
config.stub(:file_to_exclude?).and_return(false)
|
120
|
+
config_store.stub(:for).and_return(config)
|
125
121
|
|
126
|
-
|
127
|
-
|
128
|
-
config.stub(:file_to_include?).and_return(false)
|
129
|
-
config.stub(:file_to_exclude?) do |file|
|
130
|
-
File.basename(file) == 'ruby2.rb'
|
131
|
-
end
|
132
|
-
config_store.stub(:for).and_return(config)
|
122
|
+
expect(found_basenames).to include('file')
|
123
|
+
end
|
133
124
|
|
134
|
-
|
125
|
+
it 'does not pick files specified to be excluded in config' do
|
126
|
+
config = double('config').as_null_object
|
127
|
+
config.stub(:file_to_include?).and_return(false)
|
128
|
+
config.stub(:file_to_exclude?) do |file|
|
129
|
+
File.basename(file) == 'ruby2.rb'
|
135
130
|
end
|
131
|
+
config_store.stub(:for).and_return(config)
|
132
|
+
|
133
|
+
expect(found_basenames).not_to include('ruby2.rb')
|
134
|
+
end
|
136
135
|
|
137
|
-
|
138
|
-
|
139
|
-
|
140
|
-
|
141
|
-
|
136
|
+
it 'does not return duplicated paths' do
|
137
|
+
config = double('config').as_null_object
|
138
|
+
config.stub(:file_to_include?).and_return(true)
|
139
|
+
config.stub(:file_to_exclude?).and_return(false)
|
140
|
+
config_store.stub(:for).and_return(config)
|
142
141
|
|
143
|
-
|
144
|
-
|
145
|
-
|
142
|
+
count = found_basenames.count { |f| f == 'ruby1.rb' }
|
143
|
+
expect(count).to eq(1)
|
144
|
+
end
|
146
145
|
|
147
|
-
|
148
|
-
|
149
|
-
|
146
|
+
context 'when an exception is raised while reading file' do
|
147
|
+
around do |example|
|
148
|
+
File.any_instance.stub(:readline).and_raise(EOFError)
|
150
149
|
|
151
|
-
|
152
|
-
|
153
|
-
|
154
|
-
|
155
|
-
|
156
|
-
|
157
|
-
end
|
150
|
+
original_stderr = $stderr
|
151
|
+
$stderr = StringIO.new
|
152
|
+
begin
|
153
|
+
example.run
|
154
|
+
ensure
|
155
|
+
$stderr = original_stderr
|
158
156
|
end
|
157
|
+
end
|
159
158
|
|
160
|
-
|
161
|
-
|
159
|
+
context 'and debug mode is enabled' do
|
160
|
+
let(:debug) { true }
|
162
161
|
|
163
|
-
|
164
|
-
|
165
|
-
|
166
|
-
end
|
162
|
+
it 'outputs error message' do
|
163
|
+
found_files
|
164
|
+
expect($stderr.string).to include('Unprocessable file')
|
167
165
|
end
|
166
|
+
end
|
168
167
|
|
169
|
-
|
170
|
-
|
168
|
+
context 'and debug mode is disabled' do
|
169
|
+
let(:debug) { false }
|
171
170
|
|
172
|
-
|
173
|
-
|
174
|
-
|
175
|
-
end
|
171
|
+
it 'outputs nothing' do
|
172
|
+
found_files
|
173
|
+
expect($stderr.string).to be_empty
|
176
174
|
end
|
177
175
|
end
|
178
176
|
end
|