rubocop 0.4.0 → 0.8.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 +7 -0
- data/.gitignore +50 -0
- data/.rubocop.yml +5 -127
- data/.travis.yml +7 -1
- data/CHANGELOG.md +157 -0
- data/CONTRIBUTING.md +13 -6
- data/Gemfile +3 -8
- data/README.md +160 -9
- data/Rakefile +3 -17
- data/bin/rubocop +16 -10
- data/config/default.yml +46 -0
- data/config/disabled.yml +5 -0
- data/config/enabled.yml +322 -0
- data/lib/rubocop/cli.rb +248 -93
- data/lib/rubocop/config.rb +205 -0
- data/lib/rubocop/config_store.rb +37 -0
- data/lib/rubocop/cop/access_control.rb +41 -0
- data/lib/rubocop/cop/alias.rb +17 -0
- data/lib/rubocop/cop/align_parameters.rb +20 -95
- data/lib/rubocop/cop/and_or.rb +26 -0
- data/lib/rubocop/cop/ascii_comments.rb +13 -0
- data/lib/rubocop/cop/ascii_identifiers.rb +19 -0
- data/lib/rubocop/cop/avoid_class_vars.rb +15 -0
- data/lib/rubocop/cop/avoid_for.rb +17 -0
- data/lib/rubocop/cop/avoid_global_vars.rb +61 -0
- data/lib/rubocop/cop/avoid_perl_backrefs.rb +17 -0
- data/lib/rubocop/cop/avoid_perlisms.rb +47 -0
- data/lib/rubocop/cop/block_comments.rb +15 -0
- data/lib/rubocop/cop/blocks.rb +11 -47
- data/lib/rubocop/cop/case_indentation.rb +22 -0
- data/lib/rubocop/cop/class_and_module_camel_case.rb +20 -11
- data/lib/rubocop/cop/class_methods.rb +15 -0
- data/lib/rubocop/cop/collection_methods.rb +16 -16
- data/lib/rubocop/cop/colon_method_call.rb +20 -0
- data/lib/rubocop/cop/constant_name.rb +24 -0
- data/lib/rubocop/cop/cop.rb +34 -47
- data/lib/rubocop/cop/def_parentheses.rb +43 -35
- data/lib/rubocop/cop/empty_line_between_defs.rb +22 -0
- data/lib/rubocop/cop/empty_lines.rb +21 -13
- data/lib/rubocop/cop/empty_literal.rb +47 -0
- data/lib/rubocop/cop/encoding.rb +3 -3
- data/lib/rubocop/cop/end_of_line.rb +3 -3
- data/lib/rubocop/cop/ensure_return.rb +19 -0
- data/lib/rubocop/cop/eval.rb +19 -0
- data/lib/rubocop/cop/favor_join.rb +22 -0
- data/lib/rubocop/cop/favor_modifier.rb +38 -48
- data/lib/rubocop/cop/favor_percent_r.rb +19 -0
- data/lib/rubocop/cop/favor_sprintf.rb +21 -0
- data/lib/rubocop/cop/favor_unless_over_negated_if.rb +19 -17
- data/lib/rubocop/cop/handle_exceptions.rb +17 -0
- data/lib/rubocop/cop/hash_syntax.rb +29 -14
- data/lib/rubocop/cop/if_then_else.rb +32 -29
- data/lib/rubocop/cop/leading_comment_space.rb +17 -0
- data/lib/rubocop/cop/line_continuation.rb +15 -0
- data/lib/rubocop/cop/line_length.rb +4 -4
- data/lib/rubocop/cop/loop.rb +33 -0
- data/lib/rubocop/cop/method_and_variable_snake_case.rb +41 -17
- data/lib/rubocop/cop/method_length.rb +52 -0
- data/lib/rubocop/cop/new_lambda_literal.rb +8 -6
- data/lib/rubocop/cop/not.rb +21 -0
- data/lib/rubocop/cop/numeric_literals.rb +9 -7
- data/lib/rubocop/cop/offence.rb +12 -1
- data/lib/rubocop/cop/op_method.rb +26 -0
- data/lib/rubocop/cop/parameter_lists.rb +12 -6
- data/lib/rubocop/cop/parentheses_around_condition.rb +11 -11
- data/lib/rubocop/cop/percent_r.rb +19 -0
- data/lib/rubocop/cop/reduce_arguments.rb +29 -0
- data/lib/rubocop/cop/rescue_exception.rb +26 -0
- data/lib/rubocop/cop/rescue_modifier.rb +17 -0
- data/lib/rubocop/cop/semicolon.rb +31 -0
- data/lib/rubocop/cop/single_line_methods.rb +44 -0
- data/lib/rubocop/cop/space_after_comma_etc.rb +30 -10
- data/lib/rubocop/cop/space_after_control_keyword.rb +29 -0
- data/lib/rubocop/cop/string_literals.rb +9 -23
- data/lib/rubocop/cop/surrounding_space.rb +223 -83
- data/lib/rubocop/cop/symbol_array.rb +31 -0
- data/lib/rubocop/cop/symbol_name.rb +23 -0
- data/lib/rubocop/cop/syntax.rb +35 -5
- data/lib/rubocop/cop/tab.rb +3 -3
- data/lib/rubocop/cop/ternary_operator.rb +26 -24
- data/lib/rubocop/cop/trailing_whitespace.rb +3 -5
- data/lib/rubocop/cop/trivial_accessors.rb +26 -0
- data/lib/rubocop/cop/unless_else.rb +11 -7
- data/lib/rubocop/cop/util.rb +26 -0
- data/lib/rubocop/cop/variable_interpolation.rb +29 -0
- data/lib/rubocop/cop/when_then.rb +6 -14
- data/lib/rubocop/cop/word_array.rb +37 -0
- data/lib/rubocop/report/emacs_style.rb +2 -2
- data/lib/rubocop/report/plain_text.rb +1 -1
- data/lib/rubocop/version.rb +3 -1
- data/lib/rubocop.rb +48 -8
- data/rubocop.gemspec +32 -151
- data/spec/project_spec.rb +27 -0
- data/spec/rubocop/cli_spec.rb +573 -200
- data/spec/rubocop/config_spec.rb +409 -0
- data/spec/rubocop/config_store_spec.rb +66 -0
- data/spec/rubocop/cops/access_control_spec.rb +129 -0
- data/spec/rubocop/cops/alias_spec.rb +39 -0
- data/spec/rubocop/cops/align_parameters_spec.rb +66 -70
- data/spec/rubocop/cops/and_or_spec.rb +37 -0
- data/spec/rubocop/cops/ascii_comments_spec.rb +26 -0
- data/spec/rubocop/cops/ascii_identifiers_spec.rb +26 -0
- data/spec/rubocop/cops/avoid_class_vars_spec.rb +25 -0
- data/spec/rubocop/cops/avoid_for_spec.rb +35 -0
- data/spec/rubocop/cops/avoid_global_vars_spec.rb +32 -0
- data/spec/rubocop/cops/avoid_perl_backrefs_spec.rb +18 -0
- data/spec/rubocop/cops/avoid_perlisms_spec.rb +44 -0
- data/spec/rubocop/cops/block_comments_spec.rb +25 -0
- data/spec/rubocop/cops/blocks_spec.rb +33 -0
- data/spec/rubocop/cops/{indentation_spec.rb → case_indentation_spec.rb} +7 -7
- data/spec/rubocop/cops/class_and_module_camel_case_spec.rb +15 -5
- data/spec/rubocop/cops/class_methods_spec.rb +49 -0
- data/spec/rubocop/cops/collection_methods_spec.rb +9 -4
- data/spec/rubocop/cops/colon_method_call_spec.rb +53 -0
- data/spec/rubocop/cops/constant_name_spec.rb +42 -0
- data/spec/rubocop/cops/def_with_parentheses_spec.rb +13 -8
- data/spec/rubocop/cops/def_without_parentheses_spec.rb +11 -5
- data/spec/rubocop/cops/empty_line_between_defs_spec.rb +83 -0
- data/spec/rubocop/cops/empty_lines_spec.rb +14 -59
- data/spec/rubocop/cops/empty_literal_spec.rb +90 -0
- data/spec/rubocop/cops/encoding_spec.rb +11 -11
- data/spec/rubocop/cops/end_of_line_spec.rb +2 -2
- data/spec/rubocop/cops/ensure_return_spec.rb +35 -0
- data/spec/rubocop/cops/eval_spec.rb +39 -0
- data/spec/rubocop/cops/favor_join_spec.rb +35 -0
- data/spec/rubocop/cops/favor_modifier_spec.rb +16 -14
- data/spec/rubocop/cops/favor_percent_r_spec.rb +29 -0
- data/spec/rubocop/cops/favor_sprintf_spec.rb +51 -0
- data/spec/rubocop/cops/favor_unless_over_negated_if_spec.rb +4 -4
- data/spec/rubocop/cops/favor_until_over_negated_while_spec.rb +3 -3
- data/spec/rubocop/cops/handle_exceptions_spec.rb +34 -0
- data/spec/rubocop/cops/hash_syntax_spec.rb +11 -6
- data/spec/rubocop/cops/if_with_semicolon_spec.rb +7 -1
- data/spec/rubocop/cops/leading_comment_space_spec.rb +54 -0
- data/spec/rubocop/cops/line_continuation_spec.rb +24 -0
- data/spec/rubocop/cops/line_length_spec.rb +3 -2
- data/spec/rubocop/cops/loop_spec.rb +31 -0
- data/spec/rubocop/cops/method_and_variable_snake_case_spec.rb +55 -9
- data/spec/rubocop/cops/method_length_spec.rb +147 -0
- data/spec/rubocop/cops/multiline_if_then_spec.rb +15 -15
- data/spec/rubocop/cops/new_lambda_literal_spec.rb +5 -6
- data/spec/rubocop/cops/not_spec.rb +31 -0
- data/spec/rubocop/cops/numeric_literals_spec.rb +13 -13
- data/spec/rubocop/cops/offence_spec.rb +13 -0
- data/spec/rubocop/cops/one_line_conditional_spec.rb +1 -1
- data/spec/rubocop/cops/op_method_spec.rb +78 -0
- data/spec/rubocop/cops/parameter_lists_spec.rb +7 -7
- data/spec/rubocop/cops/parentheses_around_condition_spec.rb +41 -44
- data/spec/rubocop/cops/percent_r_spec.rb +29 -0
- data/spec/rubocop/cops/reduce_arguments_spec.rb +57 -0
- data/spec/rubocop/cops/rescue_exception_spec.rb +125 -0
- data/spec/rubocop/cops/rescue_modifier_spec.rb +37 -0
- data/spec/rubocop/cops/semicolon_spec.rb +88 -0
- data/spec/rubocop/cops/single_line_methods_spec.rb +50 -0
- data/spec/rubocop/cops/space_after_colon_spec.rb +3 -3
- data/spec/rubocop/cops/space_after_comma_spec.rb +14 -2
- data/spec/rubocop/cops/space_after_control_keyword_spec.rb +67 -0
- data/spec/rubocop/cops/space_after_semicolon_spec.rb +6 -1
- data/spec/rubocop/cops/space_around_braces_spec.rb +18 -3
- data/spec/rubocop/cops/space_around_equals_in_default_parameter_spec.rb +12 -2
- data/spec/rubocop/cops/space_around_operators_spec.rb +88 -26
- data/spec/rubocop/cops/space_inside_brackets_spec.rb +13 -7
- data/spec/rubocop/cops/space_inside_hash_literal_braces_spec.rb +79 -0
- data/spec/rubocop/cops/space_inside_parens_spec.rb +7 -3
- data/spec/rubocop/cops/string_literals_spec.rb +21 -6
- data/spec/rubocop/cops/symbol_array_spec.rb +41 -0
- data/spec/rubocop/cops/symbol_name_spec.rb +119 -0
- data/spec/rubocop/cops/syntax_spec.rb +28 -5
- data/spec/rubocop/cops/tab_spec.rb +2 -2
- data/spec/rubocop/cops/ternary_operator_spec.rb +13 -17
- data/spec/rubocop/cops/trailing_whitespace_spec.rb +3 -3
- data/spec/rubocop/cops/trivial_accessors_spec.rb +329 -0
- data/spec/rubocop/cops/unless_else_spec.rb +8 -8
- data/spec/rubocop/cops/variable_interpolation_spec.rb +49 -0
- data/spec/rubocop/cops/when_then_spec.rb +14 -14
- data/spec/rubocop/cops/word_array_spec.rb +47 -0
- data/spec/spec_helper.rb +30 -9
- data/spec/support/file_helper.rb +21 -0
- data/spec/support/isolated_environment.rb +27 -0
- metadata +235 -76
- data/.document +0 -5
- data/Gemfile.lock +0 -41
- data/VERSION +0 -1
- data/lib/rubocop/cop/ampersands_pipes_vs_and_or.rb +0 -25
- data/lib/rubocop/cop/grammar.rb +0 -135
- data/lib/rubocop/cop/indentation.rb +0 -44
- data/spec/rubocop/cops/ampersands_pipes_vs_and_or_spec.rb +0 -57
- data/spec/rubocop/cops/grammar_spec.rb +0 -71
- data/spec/rubocop/cops/multiline_blocks_spec.rb +0 -24
- data/spec/rubocop/cops/single_line_blocks_spec.rb +0 -22
@@ -8,16 +8,14 @@ module Rubocop
|
|
8
8
|
let(:op) { MultilineTernaryOperator.new }
|
9
9
|
|
10
10
|
it 'registers an offence for a multiline ternary operator expression' do
|
11
|
-
inspect_source(op,
|
12
|
-
|
13
|
-
expect(op.offences.
|
14
|
-
['Avoid multi-line ?: (the ternary operator); use if/unless ' +
|
15
|
-
'instead.'])
|
11
|
+
inspect_source(op, ['a = cond ?',
|
12
|
+
' b : c'])
|
13
|
+
expect(op.offences.size).to eq(1)
|
16
14
|
end
|
17
15
|
|
18
16
|
it 'accepts a single line ternary operator expression' do
|
19
|
-
inspect_source(op,
|
20
|
-
expect(op.offences
|
17
|
+
inspect_source(op, ['a = cond ? b : c'])
|
18
|
+
expect(op.offences).to be_empty
|
21
19
|
end
|
22
20
|
end
|
23
21
|
|
@@ -25,19 +23,17 @@ module Rubocop
|
|
25
23
|
let(:op) { NestedTernaryOperator.new }
|
26
24
|
|
27
25
|
it 'registers an offence for a nested ternary operator expression' do
|
28
|
-
inspect_source(op,
|
29
|
-
expect(op.offences.
|
30
|
-
['Ternary operators must not be nested. Prefer if/else constructs ' +
|
31
|
-
'instead.'])
|
26
|
+
inspect_source(op, ['a ? (b ? b1 : b2) : a2'])
|
27
|
+
expect(op.offences.size).to eq(1)
|
32
28
|
end
|
33
29
|
|
34
30
|
it 'accepts a non-nested ternary operator within an if' do
|
35
|
-
inspect_source(op,
|
36
|
-
|
37
|
-
|
38
|
-
|
39
|
-
|
40
|
-
expect(op.offences
|
31
|
+
inspect_source(op, ['a = if x',
|
32
|
+
' cond ? b : c',
|
33
|
+
'else',
|
34
|
+
' d',
|
35
|
+
'end'])
|
36
|
+
expect(op.offences).to be_empty
|
41
37
|
end
|
42
38
|
end
|
43
39
|
end
|
@@ -9,17 +9,17 @@ module Rubocop
|
|
9
9
|
|
10
10
|
it 'registers an offence for a line ending with space' do
|
11
11
|
source = ['x = 0 ']
|
12
|
-
tws.inspect(
|
12
|
+
tws.inspect(source, nil, nil, nil)
|
13
13
|
expect(tws.offences.size).to eq(1)
|
14
14
|
end
|
15
15
|
|
16
16
|
it 'registers an offence for a line ending with tab' do
|
17
|
-
tws.inspect(
|
17
|
+
tws.inspect(["x = 0\t"], nil, nil, nil)
|
18
18
|
expect(tws.offences.size).to eq(1)
|
19
19
|
end
|
20
20
|
|
21
21
|
it 'accepts a line without trailing whitespace' do
|
22
|
-
tws.inspect(
|
22
|
+
tws.inspect(["x = 0\n"], nil, nil, nil)
|
23
23
|
expect(tws.offences).to be_empty
|
24
24
|
end
|
25
25
|
end
|
@@ -0,0 +1,329 @@
|
|
1
|
+
# encoding: utf-8
|
2
|
+
|
3
|
+
require 'spec_helper'
|
4
|
+
|
5
|
+
module Rubocop
|
6
|
+
module Cop
|
7
|
+
describe TrivialAccessors do
|
8
|
+
let(:trivial_accessors_finder) { TrivialAccessors.new }
|
9
|
+
|
10
|
+
before :each do
|
11
|
+
trivial_accessors_finder.offences.clear
|
12
|
+
end
|
13
|
+
|
14
|
+
it 'finds trivial reader' do
|
15
|
+
inspect_source(trivial_accessors_finder,
|
16
|
+
['def foo',
|
17
|
+
' @foo',
|
18
|
+
'end',
|
19
|
+
'',
|
20
|
+
'def Foo',
|
21
|
+
' @Foo',
|
22
|
+
'end'])
|
23
|
+
expect(trivial_accessors_finder.offences.size).to eq(2)
|
24
|
+
expect(trivial_accessors_finder.offences
|
25
|
+
.map(&:line_number).sort).to eq([1, 5])
|
26
|
+
end
|
27
|
+
|
28
|
+
it 'finds trivial reader in a class' do
|
29
|
+
inspect_source(trivial_accessors_finder,
|
30
|
+
['class TrivialFoo',
|
31
|
+
' def foo',
|
32
|
+
' @foo',
|
33
|
+
' end',
|
34
|
+
' def bar',
|
35
|
+
' !foo',
|
36
|
+
' end',
|
37
|
+
'end'])
|
38
|
+
expect(trivial_accessors_finder.offences.size).to eq(1)
|
39
|
+
expect(trivial_accessors_finder.offences
|
40
|
+
.map(&:line_number).sort).to eq([2])
|
41
|
+
end
|
42
|
+
|
43
|
+
it 'finds trivial reader in a nested class' do
|
44
|
+
inspect_source(trivial_accessors_finder,
|
45
|
+
['class TrivialFoo',
|
46
|
+
' class Nested',
|
47
|
+
' def foo',
|
48
|
+
' @foo',
|
49
|
+
' end',
|
50
|
+
' end',
|
51
|
+
'end'])
|
52
|
+
expect(trivial_accessors_finder.offences.size).to eq(1)
|
53
|
+
expect(trivial_accessors_finder.offences
|
54
|
+
.map(&:line_number).sort).to eq([3])
|
55
|
+
end
|
56
|
+
|
57
|
+
it 'finds trivial readers in a little less trivial class' do
|
58
|
+
inspect_source(trivial_accessors_finder,
|
59
|
+
['class TrivialFoo',
|
60
|
+
' def foo',
|
61
|
+
' @foo',
|
62
|
+
' end',
|
63
|
+
' def foo_and_bar',
|
64
|
+
' @foo_bar = @foo + @bar',
|
65
|
+
' end',
|
66
|
+
' def foo_bar',
|
67
|
+
' @foo_bar',
|
68
|
+
' end',
|
69
|
+
' def foo?',
|
70
|
+
' foo.present?',
|
71
|
+
' end',
|
72
|
+
' def bar?',
|
73
|
+
' !bar',
|
74
|
+
' end',
|
75
|
+
' def foobar',
|
76
|
+
' foo? ? foo.value : "bar"',
|
77
|
+
' end',
|
78
|
+
' def bar',
|
79
|
+
' foo.bar',
|
80
|
+
' end',
|
81
|
+
' def foo_required?',
|
82
|
+
' super && !bar_required?',
|
83
|
+
' end',
|
84
|
+
' def self.from_omniauth(auth)',
|
85
|
+
' foobars.each do |f|',
|
86
|
+
' # do stuff',
|
87
|
+
' end',
|
88
|
+
' end',
|
89
|
+
' def regex',
|
90
|
+
' %r{\A#{visit node}\Z}',
|
91
|
+
' end',
|
92
|
+
' def array',
|
93
|
+
' [foo, bar].join',
|
94
|
+
' end',
|
95
|
+
' def string',
|
96
|
+
' "string"',
|
97
|
+
' end',
|
98
|
+
' def class',
|
99
|
+
' Foo.class',
|
100
|
+
' end',
|
101
|
+
' def with_return',
|
102
|
+
' return foo',
|
103
|
+
' end',
|
104
|
+
' def captures',
|
105
|
+
' (length - 1).times.map { |i| self[i + 1] }',
|
106
|
+
' end',
|
107
|
+
' def foo val',
|
108
|
+
' super',
|
109
|
+
' @val',
|
110
|
+
' end',
|
111
|
+
'end'])
|
112
|
+
expect(trivial_accessors_finder.offences.size).to eq(2)
|
113
|
+
expect(trivial_accessors_finder.offences
|
114
|
+
.map(&:line_number).sort).to eq([2, 8])
|
115
|
+
end
|
116
|
+
|
117
|
+
it 'finds trivial reader with braces' do
|
118
|
+
inspect_source(trivial_accessors_finder,
|
119
|
+
['class Test',
|
120
|
+
' # trivial reader with braces',
|
121
|
+
' def name()',
|
122
|
+
' @name',
|
123
|
+
' end',
|
124
|
+
'end'])
|
125
|
+
expect(trivial_accessors_finder.offences.size).to eq(1)
|
126
|
+
expect(trivial_accessors_finder.offences
|
127
|
+
.map(&:line_number).sort).to eq([3])
|
128
|
+
end
|
129
|
+
|
130
|
+
it 'finds trivial writer without braces' do
|
131
|
+
inspect_source(trivial_accessors_finder,
|
132
|
+
['class Test',
|
133
|
+
' # trivial writer without braces',
|
134
|
+
' def name= name',
|
135
|
+
' @name = name',
|
136
|
+
' end',
|
137
|
+
'end'])
|
138
|
+
expect(trivial_accessors_finder.offences.size).to eq(1)
|
139
|
+
expect(trivial_accessors_finder.offences
|
140
|
+
.map(&:line_number).sort).to eq([3])
|
141
|
+
end
|
142
|
+
|
143
|
+
it 'does not find trivial writer with function calls' do
|
144
|
+
inspect_source(trivial_accessors_finder,
|
145
|
+
['class TrivialTest',
|
146
|
+
' def test=(val)',
|
147
|
+
' @test = val',
|
148
|
+
' some_function_call',
|
149
|
+
' or_more_of_them',
|
150
|
+
' end',
|
151
|
+
'end'])
|
152
|
+
expect(trivial_accessors_finder.offences).to be_empty
|
153
|
+
end
|
154
|
+
|
155
|
+
it 'finds trivials with less peculiar methods' do
|
156
|
+
inspect_source(trivial_accessors_finder,
|
157
|
+
['class NilStats',
|
158
|
+
'def most_traded_pair',
|
159
|
+
'end',
|
160
|
+
'def win_ratio',
|
161
|
+
'end',
|
162
|
+
'def win_ratio_percentage()',
|
163
|
+
'end',
|
164
|
+
'def pips_won',
|
165
|
+
' 0.0',
|
166
|
+
'end',
|
167
|
+
'def gain_at(date)',
|
168
|
+
' 1',
|
169
|
+
'end',
|
170
|
+
'def gain_percentage',
|
171
|
+
' 0',
|
172
|
+
'end',
|
173
|
+
'def gain_breakdown(options = {})',
|
174
|
+
' []',
|
175
|
+
'end',
|
176
|
+
'def copy_to_all_ratio',
|
177
|
+
' nil',
|
178
|
+
'end',
|
179
|
+
'def trade_population',
|
180
|
+
' {}',
|
181
|
+
'end',
|
182
|
+
'def average_leverage',
|
183
|
+
' 1',
|
184
|
+
'end',
|
185
|
+
'def with_yield',
|
186
|
+
' yield',
|
187
|
+
'rescue Error => e',
|
188
|
+
' #do stuff',
|
189
|
+
'end',
|
190
|
+
'end'])
|
191
|
+
expect(trivial_accessors_finder.offences).to be_empty
|
192
|
+
end
|
193
|
+
|
194
|
+
it 'finds oneliner trivials' do
|
195
|
+
inspect_source(trivial_accessors_finder,
|
196
|
+
['class Oneliner',
|
197
|
+
' def foo; @foo; end',
|
198
|
+
' def foo= foo; @foo = foo; end',
|
199
|
+
'end'])
|
200
|
+
expect(trivial_accessors_finder.offences.size).to eq(2)
|
201
|
+
expect(trivial_accessors_finder.offences
|
202
|
+
.map(&:line_number).sort).to eq([2, 3])
|
203
|
+
end
|
204
|
+
|
205
|
+
it 'does not find a trivial reader' do
|
206
|
+
inspect_source(trivial_accessors_finder,
|
207
|
+
['def bar',
|
208
|
+
' @bar + foo',
|
209
|
+
'end'])
|
210
|
+
expect(trivial_accessors_finder.offences).to be_empty
|
211
|
+
end
|
212
|
+
|
213
|
+
it 'finds trivial writer' do
|
214
|
+
inspect_source(trivial_accessors_finder,
|
215
|
+
['def foo=(val)',
|
216
|
+
' @foo = val',
|
217
|
+
'end'])
|
218
|
+
expect(trivial_accessors_finder.offences.size).to eq(1)
|
219
|
+
expect(trivial_accessors_finder.offences
|
220
|
+
.map(&:line_number).sort).to eq([1])
|
221
|
+
end
|
222
|
+
|
223
|
+
it 'finds trivial writer in a class' do
|
224
|
+
inspect_source(trivial_accessors_finder,
|
225
|
+
['class TrivialFoo',
|
226
|
+
' def foo=(val)',
|
227
|
+
' @foo = val',
|
228
|
+
' end',
|
229
|
+
' def void(no_value)',
|
230
|
+
' end',
|
231
|
+
' def inspect(sexp)',
|
232
|
+
' each(:def, sexp) do |item|',
|
233
|
+
' #do stuff',
|
234
|
+
' end',
|
235
|
+
' end',
|
236
|
+
' def if_method(foo)',
|
237
|
+
' if true',
|
238
|
+
' unless false',
|
239
|
+
' #do stuff',
|
240
|
+
' end',
|
241
|
+
' end',
|
242
|
+
' end',
|
243
|
+
'end'])
|
244
|
+
expect(trivial_accessors_finder.offences.size).to eq(1)
|
245
|
+
expect(trivial_accessors_finder.offences
|
246
|
+
.map(&:line_number).sort).to eq([2])
|
247
|
+
end
|
248
|
+
|
249
|
+
it 'finds trivial accessors in a little less trivial class' do
|
250
|
+
inspect_source(trivial_accessors_finder,
|
251
|
+
['class TrivialFoo',
|
252
|
+
' def foo',
|
253
|
+
' @foo',
|
254
|
+
' end',
|
255
|
+
' def foo_and_bar',
|
256
|
+
' @foo_bar = @foo + @bar',
|
257
|
+
' end',
|
258
|
+
' def foo_bar',
|
259
|
+
' @foo_bar',
|
260
|
+
' end',
|
261
|
+
' def bar=(bar_value)',
|
262
|
+
' @bar = bar_value',
|
263
|
+
' end',
|
264
|
+
'end'])
|
265
|
+
expect(trivial_accessors_finder.offences.size).to eq(3)
|
266
|
+
expect(trivial_accessors_finder.offences
|
267
|
+
.map(&:line_number).sort).to eq([2, 8, 11])
|
268
|
+
end
|
269
|
+
|
270
|
+
it 'does not find a trivial writer' do
|
271
|
+
inspect_source(trivial_accessors_finder,
|
272
|
+
['def bar=(value)',
|
273
|
+
' @bar = value + 42',
|
274
|
+
'end'])
|
275
|
+
expect(trivial_accessors_finder.offences).to be_empty
|
276
|
+
end
|
277
|
+
|
278
|
+
it 'finds trivial writers in a little less trivial class' do
|
279
|
+
inspect_source(trivial_accessors_finder,
|
280
|
+
['class TrivialFoo',
|
281
|
+
' def foo_bar=(foo, bar)',
|
282
|
+
' @foo_bar = foo + bar',
|
283
|
+
' end',
|
284
|
+
' def universal=(answer=42)',
|
285
|
+
' @universal = answer',
|
286
|
+
' end',
|
287
|
+
' def bar=(bar_value)',
|
288
|
+
' @bar = bar_value',
|
289
|
+
' end',
|
290
|
+
'end'])
|
291
|
+
expect(trivial_accessors_finder.offences.size).to eq(2)
|
292
|
+
expect(trivial_accessors_finder.offences
|
293
|
+
.map(&:line_number).sort).to eq([5, 8])
|
294
|
+
end
|
295
|
+
|
296
|
+
it 'does not find trivial accessors with method calls' do
|
297
|
+
inspect_source(trivial_accessors_finder,
|
298
|
+
['class TrivialFoo',
|
299
|
+
' def foo_bar(foo)',
|
300
|
+
' foo_bar = foo + 42',
|
301
|
+
' end',
|
302
|
+
' def foo(value)',
|
303
|
+
' foo = []',
|
304
|
+
' # do stuff',
|
305
|
+
' foo',
|
306
|
+
' end',
|
307
|
+
' def bar',
|
308
|
+
' foo_method',
|
309
|
+
' end',
|
310
|
+
'end'])
|
311
|
+
expect(trivial_accessors_finder.offences).to be_empty
|
312
|
+
end
|
313
|
+
|
314
|
+
it 'does not find trivial writer with exceptions' do
|
315
|
+
inspect_source(trivial_accessors_finder,
|
316
|
+
[' def expiration_formatted=(value)',
|
317
|
+
' begin',
|
318
|
+
' @expiration = foo_stuff',
|
319
|
+
' rescue ArgumentError',
|
320
|
+
' @expiration = nil',
|
321
|
+
' end',
|
322
|
+
' self[:expiration] = @expiration',
|
323
|
+
' end'])
|
324
|
+
expect(trivial_accessors_finder.offences).to be_empty
|
325
|
+
end
|
326
|
+
|
327
|
+
end # describe TrivialAccessors
|
328
|
+
end # Cop
|
329
|
+
end # Rubocop
|
@@ -8,20 +8,20 @@ module Rubocop
|
|
8
8
|
let(:ue) { UnlessElse.new }
|
9
9
|
|
10
10
|
it 'registers an offence for an unless with else' do
|
11
|
-
inspect_source(ue,
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
|
11
|
+
inspect_source(ue, ['unless x',
|
12
|
+
' a = 1',
|
13
|
+
'else',
|
14
|
+
' a = 0',
|
15
|
+
'end'])
|
16
16
|
expect(ue.offences.map(&:message)).to eq(
|
17
17
|
['Never use unless with else. Rewrite these with the ' +
|
18
18
|
'positive case first.'])
|
19
19
|
end
|
20
20
|
|
21
21
|
it 'accepts an unless without else' do
|
22
|
-
inspect_source(ue,
|
23
|
-
|
24
|
-
|
22
|
+
inspect_source(ue, ['unless x',
|
23
|
+
' a = 1',
|
24
|
+
'end'])
|
25
25
|
expect(ue.offences.map(&:message)).to be_empty
|
26
26
|
end
|
27
27
|
end
|
@@ -0,0 +1,49 @@
|
|
1
|
+
# encoding: utf-8
|
2
|
+
|
3
|
+
require 'spec_helper'
|
4
|
+
|
5
|
+
module Rubocop
|
6
|
+
module Cop
|
7
|
+
describe VariableInterpolation do
|
8
|
+
let(:vi) { VariableInterpolation.new }
|
9
|
+
|
10
|
+
it 'registers an offence for interpolated global variables' do
|
11
|
+
inspect_source(vi,
|
12
|
+
['puts "this is a #$test"'])
|
13
|
+
expect(vi.offences.size).to eq(1)
|
14
|
+
expect(vi.offences.map(&:message))
|
15
|
+
.to eq(['Replace interpolated var $test with expression #{$test}.'])
|
16
|
+
end
|
17
|
+
|
18
|
+
it 'registers an offence for interpolated regexp back references' do
|
19
|
+
inspect_source(vi,
|
20
|
+
['puts "this is a #$1"'])
|
21
|
+
expect(vi.offences.size).to eq(1)
|
22
|
+
expect(vi.offences.map(&:message))
|
23
|
+
.to eq(['Replace interpolated var $1 with expression #{$1}.'])
|
24
|
+
end
|
25
|
+
|
26
|
+
it 'registers an offence for interpolated instance variables' do
|
27
|
+
inspect_source(vi,
|
28
|
+
['puts "this is a #@test"'])
|
29
|
+
expect(vi.offences.size).to eq(1)
|
30
|
+
expect(vi.offences.map(&:message))
|
31
|
+
.to eq(['Replace interpolated var @test with expression #{@test}.'])
|
32
|
+
end
|
33
|
+
|
34
|
+
it 'registers an offence for interpolated class variables' do
|
35
|
+
inspect_source(vi,
|
36
|
+
['puts "this is a #@@t"'])
|
37
|
+
expect(vi.offences.size).to eq(1)
|
38
|
+
expect(vi.offences.map(&:message))
|
39
|
+
.to eq(['Replace interpolated var @@t with expression #{@@t}.'])
|
40
|
+
end
|
41
|
+
|
42
|
+
it 'does not register an offence for variables in expressions' do
|
43
|
+
inspect_source(vi,
|
44
|
+
['puts "this is a #{@test} #{@@t} #{$t} #{$1}"'])
|
45
|
+
expect(vi.offences).to be_empty
|
46
|
+
end
|
47
|
+
end
|
48
|
+
end
|
49
|
+
end
|
@@ -8,29 +8,29 @@ module Rubocop
|
|
8
8
|
let(:wt) { WhenThen.new }
|
9
9
|
|
10
10
|
it 'registers an offence for when x;' do
|
11
|
-
inspect_source(wt,
|
12
|
-
|
13
|
-
|
11
|
+
inspect_source(wt, ['case a',
|
12
|
+
'when b; c',
|
13
|
+
'end'])
|
14
14
|
expect(wt.offences.map(&:message)).to eq(
|
15
15
|
['Never use "when x;". Use "when x then" instead.'])
|
16
16
|
end
|
17
17
|
|
18
18
|
it 'accepts when x then' do
|
19
|
-
inspect_source(wt,
|
20
|
-
|
21
|
-
|
19
|
+
inspect_source(wt, ['case a',
|
20
|
+
'when b then c',
|
21
|
+
'end'])
|
22
22
|
expect(wt.offences.map(&:message)).to be_empty
|
23
23
|
end
|
24
24
|
|
25
25
|
it 'accepts ; separating statements in the body of when' do
|
26
|
-
inspect_source(wt,
|
27
|
-
|
28
|
-
|
29
|
-
|
30
|
-
|
31
|
-
|
32
|
-
|
33
|
-
|
26
|
+
inspect_source(wt, ['case a',
|
27
|
+
'when b then c; d',
|
28
|
+
'end',
|
29
|
+
'',
|
30
|
+
'case e',
|
31
|
+
'when f',
|
32
|
+
' g; h',
|
33
|
+
'end'])
|
34
34
|
expect(wt.offences.map(&:message)).to be_empty
|
35
35
|
end
|
36
36
|
end
|
@@ -0,0 +1,47 @@
|
|
1
|
+
# encoding: utf-8
|
2
|
+
|
3
|
+
require 'spec_helper'
|
4
|
+
|
5
|
+
module Rubocop
|
6
|
+
module Cop
|
7
|
+
describe WordArray do
|
8
|
+
let(:wa) { WordArray.new }
|
9
|
+
|
10
|
+
it 'registers an offence for arrays of single quoted strings' do
|
11
|
+
inspect_source(wa,
|
12
|
+
["['one', 'two', 'three']"])
|
13
|
+
expect(wa.offences.size).to eq(1)
|
14
|
+
end
|
15
|
+
|
16
|
+
it 'registers an offence for arrays of double quoted strings' do
|
17
|
+
inspect_source(wa,
|
18
|
+
['["one", "two", "three"]'])
|
19
|
+
expect(wa.offences.size).to eq(1)
|
20
|
+
end
|
21
|
+
|
22
|
+
it 'does not register an offence for array of non-words' do
|
23
|
+
inspect_source(wa,
|
24
|
+
['["one space", "two", "three"]'])
|
25
|
+
expect(wa.offences).to be_empty
|
26
|
+
end
|
27
|
+
|
28
|
+
it 'does not register an offence for array starting with %w' do
|
29
|
+
inspect_source(wa,
|
30
|
+
['%w(one two three)'])
|
31
|
+
expect(wa.offences).to be_empty
|
32
|
+
end
|
33
|
+
|
34
|
+
it 'does not register an offence for array with one element' do
|
35
|
+
inspect_source(wa,
|
36
|
+
['["three"]'])
|
37
|
+
expect(wa.offences).to be_empty
|
38
|
+
end
|
39
|
+
|
40
|
+
it 'does not register an offence for array with empty strings' do
|
41
|
+
inspect_source(wa,
|
42
|
+
['["", "two", "three"]'])
|
43
|
+
expect(wa.offences).to be_empty
|
44
|
+
end
|
45
|
+
end
|
46
|
+
end
|
47
|
+
end
|
data/spec/spec_helper.rb
CHANGED
@@ -1,8 +1,17 @@
|
|
1
1
|
# encoding: utf-8
|
2
2
|
|
3
|
-
if ENV['COVERAGE']
|
3
|
+
if ENV['TRAVIS'] || ENV['COVERAGE']
|
4
4
|
require 'simplecov'
|
5
|
-
|
5
|
+
|
6
|
+
if ENV['TRAVIS']
|
7
|
+
require 'coveralls'
|
8
|
+
SimpleCov.formatter = Coveralls::SimpleCov::Formatter
|
9
|
+
end
|
10
|
+
|
11
|
+
SimpleCov.start do
|
12
|
+
add_filter '/spec/'
|
13
|
+
add_filter '/vendor/bundle/'
|
14
|
+
end
|
6
15
|
end
|
7
16
|
|
8
17
|
$LOAD_PATH.unshift(File.join(File.dirname(__FILE__), '..', 'lib'))
|
@@ -11,9 +20,8 @@ require 'rspec'
|
|
11
20
|
require 'rubocop'
|
12
21
|
require 'rubocop/cli'
|
13
22
|
|
14
|
-
#
|
15
|
-
|
16
|
-
Dir["#{File.dirname(__FILE__)}/support/**/*.rb"].each { |f| require f }
|
23
|
+
# disable colors in specs
|
24
|
+
Sickill::Rainbow.enabled = false
|
17
25
|
|
18
26
|
module ExitCodeMatchers
|
19
27
|
RSpec::Matchers.define :exit_with_code do |code|
|
@@ -41,6 +49,8 @@ end
|
|
41
49
|
|
42
50
|
RSpec.configure do |config|
|
43
51
|
config.filter_run_excluding ruby: ->(v) { !RUBY_VERSION.start_with?(v.to_s) }
|
52
|
+
config.filter_run_excluding broken: true
|
53
|
+
config.treat_symbols_as_metadata_keys_with_true_values = true
|
44
54
|
|
45
55
|
config.expect_with :rspec do |c|
|
46
56
|
c.syntax = :expect # disables `should`
|
@@ -49,8 +59,19 @@ RSpec.configure do |config|
|
|
49
59
|
config.include(ExitCodeMatchers)
|
50
60
|
end
|
51
61
|
|
52
|
-
|
53
|
-
|
54
|
-
|
55
|
-
|
62
|
+
# Requires supporting files with custom matchers and macros, etc,
|
63
|
+
# in ./support/ and its subdirectories.
|
64
|
+
Dir["#{File.dirname(__FILE__)}/support/**/*.rb"].each { |f| require f }
|
65
|
+
|
66
|
+
def inspect_source(cop, source)
|
67
|
+
ast, comments, tokens, _ = Rubocop::CLI.parse('(string)') do |source_buffer|
|
68
|
+
source_buffer.source = source.join($RS)
|
69
|
+
end
|
70
|
+
cop.inspect(source, tokens, ast, comments)
|
71
|
+
end
|
72
|
+
|
73
|
+
class Rubocop::Cop::Cop
|
74
|
+
def messages
|
75
|
+
offences.map(&:message)
|
76
|
+
end
|
56
77
|
end
|
@@ -0,0 +1,21 @@
|
|
1
|
+
# encoding: utf-8
|
2
|
+
|
3
|
+
require 'fileutils'
|
4
|
+
|
5
|
+
module FileHelper
|
6
|
+
def create_file(file_path, content)
|
7
|
+
file_path = File.expand_path(file_path)
|
8
|
+
|
9
|
+
dir_path = File.dirname(file_path)
|
10
|
+
FileUtils.makedirs dir_path unless File.exists?(dir_path)
|
11
|
+
|
12
|
+
File.open(file_path, 'w') do |file|
|
13
|
+
case content
|
14
|
+
when String
|
15
|
+
file.puts content
|
16
|
+
when Array
|
17
|
+
file.puts content.join("\n")
|
18
|
+
end
|
19
|
+
end
|
20
|
+
end
|
21
|
+
end
|