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,11 +8,18 @@ module Rubocop
|
|
8
8
|
let(:space) { SpaceAroundOperators.new }
|
9
9
|
|
10
10
|
it 'registers an offence for assignment without space on both sides' do
|
11
|
-
inspect_source(space,
|
11
|
+
inspect_source(space, ['x=0', 'y= 0', 'z =0'])
|
12
12
|
expect(space.offences.map(&:message)).to eq(
|
13
13
|
["Surrounding space missing for operator '='."] * 3)
|
14
14
|
end
|
15
15
|
|
16
|
+
it 'registers an offence for ternary operator without space' do
|
17
|
+
inspect_source(space, ['x == 0?1:2'])
|
18
|
+
expect(space.offences.map(&:message)).to eq(
|
19
|
+
["Surrounding space missing for operator '?'.",
|
20
|
+
"Surrounding space missing for operator ':'."])
|
21
|
+
end
|
22
|
+
|
16
23
|
it 'registers an offence in presence of modifier if statement' do
|
17
24
|
check_modifier('if')
|
18
25
|
end
|
@@ -32,14 +39,14 @@ module Rubocop
|
|
32
39
|
def check_modifier(keyword)
|
33
40
|
src = ["a=1 #{keyword} condition",
|
34
41
|
'c=2']
|
35
|
-
inspect_source(space,
|
42
|
+
inspect_source(space, src)
|
36
43
|
expect(space.offences.map(&:line_number)).to eq([1, 2])
|
37
44
|
expect(space.offences.map(&:message)).to eq(
|
38
45
|
["Surrounding space missing for operator '='."] * 2)
|
39
46
|
end
|
40
47
|
|
41
48
|
it 'registers an offence for binary operators that could be unary' do
|
42
|
-
inspect_source(space,
|
49
|
+
inspect_source(space, ['a-3', 'x&0xff', 'z+0'])
|
43
50
|
expect(space.offences.map(&:message)).to eq(
|
44
51
|
["Surrounding space missing for operator '-'.",
|
45
52
|
"Surrounding space missing for operator '&'.",
|
@@ -47,99 +54,154 @@ module Rubocop
|
|
47
54
|
end
|
48
55
|
|
49
56
|
it 'registers an offence for arguments to a method' do
|
50
|
-
inspect_source(space,
|
57
|
+
inspect_source(space, ['puts 1+2'])
|
51
58
|
expect(space.offences.map(&:message)).to eq(
|
52
59
|
["Surrounding space missing for operator '+'."])
|
53
60
|
end
|
54
61
|
|
55
62
|
it 'accepts operator symbols' do
|
56
|
-
inspect_source(space,
|
63
|
+
inspect_source(space, ['func(:-)'])
|
57
64
|
expect(space.offences.map(&:message)).to be_empty
|
58
65
|
end
|
59
66
|
|
60
67
|
it 'accepts ranges' do
|
61
|
-
inspect_source(space,
|
68
|
+
inspect_source(space, ['a, b = (1..2), (1...3)'])
|
62
69
|
expect(space.offences.map(&:message)).to be_empty
|
63
70
|
end
|
64
71
|
|
65
72
|
it 'accepts scope operator' do
|
66
73
|
source = ['@io.class == Zlib::GzipWriter']
|
67
|
-
inspect_source(space,
|
74
|
+
inspect_source(space, source)
|
68
75
|
expect(space.offences.map(&:message)).to be_empty
|
69
76
|
end
|
70
77
|
|
71
78
|
it 'accepts ::Kernel::raise' do
|
72
79
|
source = ['::Kernel::raise IllegalBlockError.new']
|
73
|
-
inspect_source(space,
|
80
|
+
inspect_source(space, source)
|
74
81
|
expect(space.offences.map(&:message)).to be_empty
|
75
82
|
end
|
76
83
|
|
77
84
|
it 'accepts exclamation point negation' do
|
78
|
-
inspect_source(space,
|
85
|
+
inspect_source(space, ['x = !a&&!b'])
|
79
86
|
expect(space.offences.map(&:message)).to eq(
|
80
87
|
["Surrounding space missing for operator '&&'."])
|
81
88
|
end
|
82
89
|
|
83
90
|
it 'accepts exclamation point definition' do
|
84
|
-
inspect_source(space,
|
85
|
-
|
86
|
-
|
91
|
+
inspect_source(space, [' def !',
|
92
|
+
' !__getobj__',
|
93
|
+
' end'])
|
87
94
|
expect(space.offences).to be_empty
|
88
95
|
expect(space.offences.map(&:message)).to be_empty
|
89
96
|
end
|
90
97
|
|
91
98
|
it 'accepts a unary' do
|
92
|
-
inspect_source(space,
|
99
|
+
inspect_source(space,
|
93
100
|
[' def bm(label_width = 0, *labels, &blk)',
|
94
101
|
' benchmark(CAPTION, label_width, FORMAT,',
|
95
102
|
' *labels, &blk)',
|
96
103
|
' end',
|
104
|
+
'',
|
105
|
+
' def each &block',
|
106
|
+
' end',
|
107
|
+
'',
|
108
|
+
' def each *args',
|
109
|
+
' end',
|
97
110
|
''])
|
98
111
|
expect(space.offences.map(&:message)).to be_empty
|
99
112
|
end
|
100
113
|
|
101
114
|
it 'accepts splat operator' do
|
102
|
-
inspect_source(space,
|
115
|
+
inspect_source(space, ['return *list if options'])
|
103
116
|
expect(space.offences.map(&:message)).to be_empty
|
104
117
|
end
|
105
118
|
|
106
119
|
it 'accepts def of operator' do
|
107
|
-
inspect_source(space,
|
120
|
+
inspect_source(space, ['def +(other); end',
|
121
|
+
'def self.===(other); end'])
|
108
122
|
expect(space.offences.map(&:message)).to be_empty
|
109
123
|
end
|
110
124
|
|
125
|
+
it 'accepts an operator at the end of a line' do
|
126
|
+
inspect_source(space,
|
127
|
+
["['Favor unless over if for negative ' +",
|
128
|
+
" 'conditions.'] * 2"])
|
129
|
+
expect(space.offences.map(&:message)).to eq([])
|
130
|
+
end
|
131
|
+
|
111
132
|
it 'accepts an assignment with spaces' do
|
112
|
-
inspect_source(space,
|
133
|
+
inspect_source(space, ['x = 0'])
|
113
134
|
expect(space.offences).to be_empty
|
114
135
|
end
|
115
136
|
|
137
|
+
it 'registers an offence for operators without spaces' do
|
138
|
+
inspect_source(space,
|
139
|
+
['x+= a+b-c*d/e%f^g|h&i||j',
|
140
|
+
'y -=k&&l'])
|
141
|
+
expect(space.offences.map(&:message))
|
142
|
+
.to eq(["Surrounding space missing for operator '+='.",
|
143
|
+
"Surrounding space missing for operator '+'.",
|
144
|
+
"Surrounding space missing for operator '-'.",
|
145
|
+
"Surrounding space missing for operator '*'.",
|
146
|
+
"Surrounding space missing for operator '/'.",
|
147
|
+
"Surrounding space missing for operator '%'.",
|
148
|
+
"Surrounding space missing for operator '^'.",
|
149
|
+
"Surrounding space missing for operator '|'.",
|
150
|
+
"Surrounding space missing for operator '&'.",
|
151
|
+
"Surrounding space missing for operator '||'.",
|
152
|
+
"Surrounding space missing for operator '-='.",
|
153
|
+
"Surrounding space missing for operator '&&'."])
|
154
|
+
end
|
155
|
+
|
156
|
+
it 'accepts operators with spaces' do
|
157
|
+
inspect_source(space,
|
158
|
+
['x += a + b - c * d / e % f ^ g | h & i || j',
|
159
|
+
'y -= k && l'])
|
160
|
+
expect(space.offences.map(&:message)).to eq([])
|
161
|
+
end
|
162
|
+
|
116
163
|
it "accepts some operators that are exceptions and don't need spaces" do
|
117
|
-
inspect_source(space,
|
118
|
-
|
119
|
-
|
120
|
-
expect(space.offences.map(&:message)).to
|
164
|
+
inspect_source(space, ['(1..3)',
|
165
|
+
'ActionController::Base',
|
166
|
+
'each { |s, t| }'])
|
167
|
+
expect(space.offences.map(&:message)).to eq([])
|
121
168
|
end
|
122
169
|
|
123
170
|
it 'accepts an assignment followed by newline' do
|
124
|
-
inspect_source(space, '
|
171
|
+
inspect_source(space, ['x =', '0'])
|
125
172
|
expect(space.offences).to be_empty
|
126
173
|
end
|
127
174
|
|
128
175
|
it 'registers an offences for exponent operator with spaces' do
|
129
|
-
inspect_source(space,
|
176
|
+
inspect_source(space, ['x = a * b ** 2'])
|
130
177
|
expect(space.offences.map(&:message)).to eq(
|
131
178
|
['Space around operator ** detected.'])
|
132
179
|
end
|
133
180
|
|
134
181
|
it 'accepts exponent operator without spaces' do
|
135
|
-
inspect_source(space,
|
182
|
+
inspect_source(space, ['x = a * b**2'])
|
136
183
|
expect(space.offences).to be_empty
|
137
184
|
end
|
138
185
|
|
139
186
|
it 'accepts unary operators without space' do
|
140
|
-
inspect_source(space,
|
141
|
-
|
142
|
-
|
187
|
+
inspect_source(space, ['[].map(&:size)',
|
188
|
+
'-3',
|
189
|
+
'x = +2'])
|
190
|
+
expect(space.offences.map(&:message)).to eq([])
|
191
|
+
end
|
192
|
+
|
193
|
+
it 'accepts argument default values without space' do
|
194
|
+
# These are handled by SpaceAroundEqualsInParameterDefault,
|
195
|
+
# so SpaceAroundOperators leaves them alone.
|
196
|
+
inspect_source(space,
|
197
|
+
['def init(name=nil)',
|
198
|
+
'end'])
|
199
|
+
expect(space.offences.map(&:message)).to be_empty
|
200
|
+
end
|
201
|
+
|
202
|
+
it 'accepts the construct class <<self with no space after <<' do
|
203
|
+
inspect_source(space, ['class <<self',
|
204
|
+
'end'])
|
143
205
|
expect(space.offences.map(&:message)).to be_empty
|
144
206
|
end
|
145
207
|
end
|
@@ -8,33 +8,39 @@ module Rubocop
|
|
8
8
|
let(:space) { SpaceInsideBrackets.new }
|
9
9
|
|
10
10
|
it 'registers an offence for an array literal with spaces inside' do
|
11
|
-
inspect_source(space,
|
11
|
+
inspect_source(space, ['a = [1, 2 ]',
|
12
12
|
'b = [ 1, 2]'])
|
13
13
|
expect(space.offences.map(&:message)).to eq(
|
14
14
|
['Space inside square brackets detected.',
|
15
15
|
'Space inside square brackets detected.'])
|
16
16
|
end
|
17
17
|
|
18
|
+
it 'accepts space inside strings within square brackets' do
|
19
|
+
inspect_source(space, ["['Encoding:',",
|
20
|
+
" ' Enabled: false']"])
|
21
|
+
expect(space.offences.map(&:message)).to be_empty
|
22
|
+
end
|
23
|
+
|
18
24
|
it 'accepts space inside square brackets if on its own row' do
|
19
|
-
inspect_source(space,
|
20
|
-
|
21
|
-
|
25
|
+
inspect_source(space, ['a = [',
|
26
|
+
' 1, 2',
|
27
|
+
' ]'])
|
22
28
|
expect(space.offences.map(&:message)).to be_empty
|
23
29
|
end
|
24
30
|
|
25
31
|
it 'accepts square brackets as method name' do
|
26
|
-
inspect_source(space,
|
32
|
+
inspect_source(space, ['def Vector.[](*array)',
|
27
33
|
'end'])
|
28
34
|
expect(space.offences.map(&:message)).to be_empty
|
29
35
|
end
|
30
36
|
|
31
37
|
it 'accepts square brackets called with method call syntax' do
|
32
|
-
inspect_source(space,
|
38
|
+
inspect_source(space, ['subject.[](0)'])
|
33
39
|
expect(space.offences.map(&:message)).to be_empty
|
34
40
|
end
|
35
41
|
|
36
42
|
it 'only reports a single space once' do
|
37
|
-
inspect_source(space,
|
43
|
+
inspect_source(space, ['[ ]'])
|
38
44
|
expect(space.offences.map(&:message)).to eq(
|
39
45
|
['Space inside square brackets detected.'])
|
40
46
|
end
|
@@ -0,0 +1,79 @@
|
|
1
|
+
# encoding: utf-8
|
2
|
+
|
3
|
+
require 'spec_helper'
|
4
|
+
|
5
|
+
module Rubocop
|
6
|
+
module Cop
|
7
|
+
describe SpaceInsideHashLiteralBraces do
|
8
|
+
let(:sihlb) { SpaceInsideHashLiteralBraces.new }
|
9
|
+
before do
|
10
|
+
SpaceInsideHashLiteralBraces.config = {
|
11
|
+
'EnforcedStyleIsWithSpaces' => true
|
12
|
+
}
|
13
|
+
end
|
14
|
+
|
15
|
+
it 'registers an offence for hashes with no spaces by default' do
|
16
|
+
inspect_source(sihlb,
|
17
|
+
['h = {a: 1, b: :two}',
|
18
|
+
'h = {a => 1 }'])
|
19
|
+
expect(sihlb.offences.map(&:message)).to eq(
|
20
|
+
['Space inside hash literal braces missing.'] * 3)
|
21
|
+
end
|
22
|
+
|
23
|
+
it 'registers an offence for hashes with no spaces if so configured' do
|
24
|
+
inspect_source(sihlb,
|
25
|
+
['h = {a: 1, b: 2}',
|
26
|
+
'h = {a => 1 }'])
|
27
|
+
expect(sihlb.offences.map(&:message)).to eq(
|
28
|
+
['Space inside hash literal braces missing.'] * 3)
|
29
|
+
end
|
30
|
+
|
31
|
+
it 'registers an offence for hashes with spaces if so configured' do
|
32
|
+
SpaceInsideHashLiteralBraces.config['EnforcedStyleIsWithSpaces'] =
|
33
|
+
false
|
34
|
+
inspect_source(sihlb,
|
35
|
+
['h = { a: 1, b: 2 }'])
|
36
|
+
expect(sihlb.offences.map(&:message)).to eq(
|
37
|
+
['Space inside hash literal braces detected.'] * 2)
|
38
|
+
end
|
39
|
+
|
40
|
+
it 'accepts hashes with spaces by default' do
|
41
|
+
inspect_source(sihlb,
|
42
|
+
['h = { a: 1, b: 2 }',
|
43
|
+
'h = { a => 1 }'])
|
44
|
+
expect(sihlb.offences.map(&:message)).to be_empty
|
45
|
+
end
|
46
|
+
|
47
|
+
it 'accepts hashes with no spaces if so configured' do
|
48
|
+
SpaceInsideHashLiteralBraces.config['EnforcedStyleIsWithSpaces'] =
|
49
|
+
false
|
50
|
+
inspect_source(sihlb,
|
51
|
+
['h = {a: 1, b: 2}',
|
52
|
+
'h = {a => 1}'])
|
53
|
+
expect(sihlb.offences.map(&:message)).to be_empty
|
54
|
+
end
|
55
|
+
|
56
|
+
it 'accepts empty hashes without spaces by default' do
|
57
|
+
inspect_source(sihlb, ['h = {}'])
|
58
|
+
expect(sihlb.offences).to be_empty
|
59
|
+
end
|
60
|
+
|
61
|
+
it 'accepts empty hashes without spaces if configured false' do
|
62
|
+
SpaceInsideHashLiteralBraces.config['EnforcedStyleIsWithSpaces'] =
|
63
|
+
false
|
64
|
+
inspect_source(sihlb, ['h = {}'])
|
65
|
+
expect(sihlb.offences).to be_empty
|
66
|
+
end
|
67
|
+
|
68
|
+
it 'accepts empty hashes without spaces even if configured true' do
|
69
|
+
inspect_source(sihlb, ['h = {}'])
|
70
|
+
expect(sihlb.offences).to be_empty
|
71
|
+
end
|
72
|
+
|
73
|
+
it 'accepts hash literals with no braces' do
|
74
|
+
inspect_source(sihlb, ['x(a: b.c)'])
|
75
|
+
expect(sihlb.offences).to be_empty
|
76
|
+
end
|
77
|
+
end
|
78
|
+
end
|
79
|
+
end
|
@@ -8,20 +8,24 @@ module Rubocop
|
|
8
8
|
let(:space) { SpaceInsideParens.new }
|
9
9
|
|
10
10
|
it 'registers an offence for spaces inside parens' do
|
11
|
-
inspect_source(space,
|
12
|
-
|
11
|
+
inspect_source(space, ['f( 3)',
|
12
|
+
'g(3 )'])
|
13
13
|
expect(space.offences.map(&:message)).to eq(
|
14
14
|
['Space inside parentheses detected.',
|
15
15
|
'Space inside parentheses detected.'])
|
16
16
|
end
|
17
17
|
|
18
18
|
it 'accepts parentheses in block parameter list' do
|
19
|
-
inspect_source(space,
|
19
|
+
inspect_source(space,
|
20
20
|
['list.inject(Tms.new) { |sum, (label, item)|',
|
21
21
|
'}'])
|
22
22
|
expect(space.offences.map(&:message)).to be_empty
|
23
23
|
end
|
24
24
|
|
25
|
+
it 'accepts parentheses with no spaces' do
|
26
|
+
inspect_source(space, ['split("\n")'])
|
27
|
+
expect(space.offences.map(&:message)).to be_empty
|
28
|
+
end
|
25
29
|
end
|
26
30
|
end
|
27
31
|
end
|
@@ -8,7 +8,7 @@ module Rubocop
|
|
8
8
|
let(:sl) { StringLiterals.new }
|
9
9
|
|
10
10
|
it 'registers an offence for double quotes when single quotes suffice' do
|
11
|
-
inspect_source(sl,
|
11
|
+
inspect_source(sl, ['s = "abc"'])
|
12
12
|
expect(sl.offences.map(&:message)).to eq(
|
13
13
|
["Prefer single-quoted strings when you don't need string " +
|
14
14
|
'interpolation or special symbols.'])
|
@@ -17,16 +17,31 @@ module Rubocop
|
|
17
17
|
it 'accepts double quotes when they are needed' do
|
18
18
|
src = ['a = "\n"',
|
19
19
|
'b = "#{encode_severity}:#{sprintf("%3d", line_number)}: #{m}"',
|
20
|
-
'c = "\'"'
|
21
|
-
|
20
|
+
'c = "\'"',
|
21
|
+
'd = "#@test"',
|
22
|
+
'e = "#$test"',
|
23
|
+
'f = "#@@test"']
|
24
|
+
inspect_source(sl, src)
|
22
25
|
expect(sl.offences.map(&:message)).to be_empty
|
23
26
|
end
|
24
27
|
|
25
|
-
it '
|
26
|
-
|
27
|
-
|
28
|
+
it 'accepts double quotes with some other special symbols' do
|
29
|
+
pending
|
30
|
+
# "Substitutions in double-quoted strings"
|
31
|
+
# http://www.ruby-doc.org/docs/ProgrammingRuby/html/language.html
|
32
|
+
src = ['g = "\xf9"']
|
33
|
+
inspect_source(sl, src)
|
28
34
|
expect(sl.offences.map(&:message)).to be_empty
|
29
35
|
end
|
36
|
+
|
37
|
+
it 'can handle double quotes within embedded expression' do
|
38
|
+
# This seems to be a Parser bug
|
39
|
+
pending do
|
40
|
+
src = ['"#{"A"}"']
|
41
|
+
inspect_source(sl, src)
|
42
|
+
expect(sl.offences.map(&:message)).to be_empty
|
43
|
+
end
|
44
|
+
end
|
30
45
|
end
|
31
46
|
end
|
32
47
|
end
|
@@ -0,0 +1,41 @@
|
|
1
|
+
# encoding: utf-8
|
2
|
+
|
3
|
+
require 'spec_helper'
|
4
|
+
|
5
|
+
module Rubocop
|
6
|
+
module Cop
|
7
|
+
describe SymbolArray do
|
8
|
+
let(:sa) { SymbolArray.new }
|
9
|
+
|
10
|
+
it 'registers an offence for arrays of symbols', { ruby: 2.0 } do
|
11
|
+
inspect_source(sa,
|
12
|
+
['[:one, :two, :three]'])
|
13
|
+
expect(sa.offences.size).to eq(1)
|
14
|
+
end
|
15
|
+
|
16
|
+
it 'does not reg an offence for array with non-syms', { ruby: 2.0 } do
|
17
|
+
inspect_source(sa,
|
18
|
+
['[:one, :two, "three"]'])
|
19
|
+
expect(sa.offences).to be_empty
|
20
|
+
end
|
21
|
+
|
22
|
+
it 'does not reg an offence for array starting with %i', { ruby: 2.0 } do
|
23
|
+
inspect_source(sa,
|
24
|
+
['%i(one two three)'])
|
25
|
+
expect(sa.offences).to be_empty
|
26
|
+
end
|
27
|
+
|
28
|
+
it 'does not reg an offence for array with one element', { ruby: 2.0 } do
|
29
|
+
inspect_source(sa,
|
30
|
+
['[:three]'])
|
31
|
+
expect(sa.offences).to be_empty
|
32
|
+
end
|
33
|
+
|
34
|
+
it 'does nothing on Ruby 1.9', { ruby: 1.9 } do
|
35
|
+
inspect_source(sa,
|
36
|
+
['[:one, :two, :three]'])
|
37
|
+
expect(sa.offences).to be_empty
|
38
|
+
end
|
39
|
+
end
|
40
|
+
end
|
41
|
+
end
|
@@ -0,0 +1,119 @@
|
|
1
|
+
# encoding: utf-8
|
2
|
+
|
3
|
+
require 'spec_helper'
|
4
|
+
|
5
|
+
module Rubocop
|
6
|
+
module Cop
|
7
|
+
describe SymbolName do
|
8
|
+
let(:symbol_name) { SymbolName.new }
|
9
|
+
|
10
|
+
before do
|
11
|
+
SymbolName.config = Config.default_configuration.for_cop('SymbolName')
|
12
|
+
end
|
13
|
+
|
14
|
+
context 'when AllowCamelCase is true' do
|
15
|
+
before do
|
16
|
+
SymbolName.config = {
|
17
|
+
'AllowCamelCase' => true
|
18
|
+
}
|
19
|
+
end
|
20
|
+
|
21
|
+
it 'does not register an offence for camel case in names' do
|
22
|
+
inspect_source(symbol_name,
|
23
|
+
['test = :BadIdea'])
|
24
|
+
expect(symbol_name.offences).to be_empty
|
25
|
+
end
|
26
|
+
end
|
27
|
+
|
28
|
+
context 'when AllowCamelCase is false' do
|
29
|
+
before do
|
30
|
+
SymbolName.config = {
|
31
|
+
'AllowCamelCase' => false
|
32
|
+
}
|
33
|
+
end
|
34
|
+
|
35
|
+
it 'registers an offence for camel case in names' do
|
36
|
+
inspect_source(symbol_name,
|
37
|
+
['test = :BadIdea'])
|
38
|
+
expect(symbol_name.offences.map(&:message)).to eq(
|
39
|
+
['Use snake_case for symbols.'])
|
40
|
+
end
|
41
|
+
end
|
42
|
+
|
43
|
+
it 'registers an offence for symbol used as hash label' do
|
44
|
+
inspect_source(symbol_name,
|
45
|
+
['{ KEY_ONE: 1, KEY_TWO: 2 }'])
|
46
|
+
expect(symbol_name.offences.map(&:message)).to eq(
|
47
|
+
['Use snake_case for symbols.'] * 2)
|
48
|
+
end
|
49
|
+
|
50
|
+
it 'accepts snake case in names' do
|
51
|
+
inspect_source(symbol_name,
|
52
|
+
['test = :good_idea'])
|
53
|
+
expect(symbol_name.offences).to be_empty
|
54
|
+
end
|
55
|
+
|
56
|
+
it 'accepts snake case in hash label names' do
|
57
|
+
inspect_source(symbol_name,
|
58
|
+
['{ one: 1, one_more_3: 2 }'])
|
59
|
+
expect(symbol_name.offences).to be_empty
|
60
|
+
end
|
61
|
+
|
62
|
+
it 'accepts snake case with a prefix @ in names' do
|
63
|
+
inspect_source(symbol_name,
|
64
|
+
['test = :@good_idea'])
|
65
|
+
expect(symbol_name.offences).to be_empty
|
66
|
+
end
|
67
|
+
|
68
|
+
it 'accepts snake case with ? suffix' do
|
69
|
+
inspect_source(symbol_name,
|
70
|
+
['test = :good_idea?'])
|
71
|
+
expect(symbol_name.offences).to be_empty
|
72
|
+
end
|
73
|
+
|
74
|
+
it 'accepts snake case with ! suffix' do
|
75
|
+
inspect_source(symbol_name,
|
76
|
+
['test = :good_idea!'])
|
77
|
+
expect(symbol_name.offences).to be_empty
|
78
|
+
end
|
79
|
+
|
80
|
+
it 'accepts snake case with = suffix' do
|
81
|
+
inspect_source(symbol_name,
|
82
|
+
['test = :good_idea='])
|
83
|
+
expect(symbol_name.offences).to be_empty
|
84
|
+
end
|
85
|
+
|
86
|
+
it 'accepts special cases - !, [] and **' do
|
87
|
+
inspect_source(symbol_name,
|
88
|
+
['test = :**',
|
89
|
+
'test = :!',
|
90
|
+
'test = :[]',
|
91
|
+
'test = :[]='])
|
92
|
+
expect(symbol_name.offences).to be_empty
|
93
|
+
end
|
94
|
+
|
95
|
+
it 'accepts special cases - ==, <=>, >, <, >=, <=' do
|
96
|
+
inspect_source(symbol_name,
|
97
|
+
['test = :==',
|
98
|
+
'test = :<=>',
|
99
|
+
'test = :>',
|
100
|
+
'test = :<',
|
101
|
+
'test = :>=',
|
102
|
+
'test = :<='])
|
103
|
+
expect(symbol_name.offences).to be_empty
|
104
|
+
end
|
105
|
+
|
106
|
+
it 'can handle an alias of and operator without crashing' do
|
107
|
+
inspect_source(symbol_name,
|
108
|
+
['alias + add'])
|
109
|
+
expect(symbol_name.offences).to be_empty
|
110
|
+
end
|
111
|
+
|
112
|
+
it 'registers an offence for SCREAMING_symbol_name' do
|
113
|
+
inspect_source(symbol_name,
|
114
|
+
['test = :BAD_IDEA'])
|
115
|
+
expect(symbol_name.offences.size).to eq(1)
|
116
|
+
end
|
117
|
+
end
|
118
|
+
end
|
119
|
+
end
|
@@ -7,11 +7,34 @@ module Rubocop
|
|
7
7
|
describe Syntax do
|
8
8
|
let(:sc) { Syntax.new }
|
9
9
|
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
|
10
|
+
if RUBY_ENGINE == 'ruby'
|
11
|
+
it 'registers an offence for unused variables', ruby: 2.0 do
|
12
|
+
source = "x = 5\nputs 10"
|
13
|
+
Dir.mktmpdir do |tmpdir|
|
14
|
+
path = File.join(tmpdir, 'file.rb')
|
15
|
+
File.open(path, 'w') { |f| f.write(source) }
|
16
|
+
sc.inspect_file(path)
|
17
|
+
end
|
18
|
+
expect(sc.offences.size).to eq(1)
|
19
|
+
expect(sc.offences.first.message)
|
20
|
+
.to eq('Assigned but unused variable - x')
|
21
|
+
end
|
22
|
+
|
23
|
+
describe '#process_line' do
|
24
|
+
it 'processes warnings correctly' do
|
25
|
+
l, s, m = sc.process_line('admin.rb:1: warning: possibly useless')
|
26
|
+
expect(l).to eq(1)
|
27
|
+
expect(s).to eq(:warning)
|
28
|
+
expect(m).to eq('Possibly useless')
|
29
|
+
end
|
30
|
+
|
31
|
+
it 'processes errors correctly' do
|
32
|
+
l, s, m = sc.process_line('admin.rb:1: unterminated string meets')
|
33
|
+
expect(l).to eq(1)
|
34
|
+
expect(s).to eq(:error)
|
35
|
+
expect(m).to eq('Unterminated string meets')
|
36
|
+
end
|
37
|
+
end
|
15
38
|
end
|
16
39
|
end
|
17
40
|
end
|
@@ -8,12 +8,12 @@ module Rubocop
|
|
8
8
|
let(:tab) { Tab.new }
|
9
9
|
|
10
10
|
it 'registers an offence for a line indented with tab' do
|
11
|
-
tab.inspect(
|
11
|
+
tab.inspect(["\tx = 0"], nil, nil, nil)
|
12
12
|
expect(tab.offences.size).to eq(1)
|
13
13
|
end
|
14
14
|
|
15
15
|
it 'accepts a line with tab in a string' do
|
16
|
-
tab.inspect(
|
16
|
+
tab.inspect(["(x = \"\t\")"], nil, nil, nil)
|
17
17
|
expect(tab.offences).to be_empty
|
18
18
|
end
|
19
19
|
end
|