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,63 @@
|
|
1
|
+
# encoding: utf-8
|
2
|
+
|
3
|
+
require 'spec_helper'
|
4
|
+
|
5
|
+
module Rubocop
|
6
|
+
module Cop
|
7
|
+
module Lint
|
8
|
+
describe Void do
|
9
|
+
let(:void_op) { Void.new }
|
10
|
+
|
11
|
+
Void::OPS.each do |op|
|
12
|
+
it "registers an offence for void op #{op} if not on last line" do
|
13
|
+
inspect_source(void_op,
|
14
|
+
["a #{op} b",
|
15
|
+
"a #{op} b",
|
16
|
+
"a #{op} b"
|
17
|
+
])
|
18
|
+
expect(void_op.offences.size).to eq(2)
|
19
|
+
end
|
20
|
+
end
|
21
|
+
|
22
|
+
Void::OPS.each do |op|
|
23
|
+
it "accepts void op #{op} if on last line" do
|
24
|
+
inspect_source(void_op,
|
25
|
+
['something',
|
26
|
+
"a #{op} b"
|
27
|
+
])
|
28
|
+
expect(void_op.offences).to be_empty
|
29
|
+
end
|
30
|
+
end
|
31
|
+
|
32
|
+
Void::OPS.each do |op|
|
33
|
+
it "accepts void op #{op} by itself without a begin block" do
|
34
|
+
inspect_source(void_op, ["a #{op} b"])
|
35
|
+
expect(void_op.offences).to be_empty
|
36
|
+
end
|
37
|
+
end
|
38
|
+
|
39
|
+
%w(var @var @@var VAR).each do |var|
|
40
|
+
it "registers an offence for void var #{var} if not on last line" do
|
41
|
+
inspect_source(void_op,
|
42
|
+
["#{var} = 5",
|
43
|
+
"#{var}",
|
44
|
+
'top'
|
45
|
+
])
|
46
|
+
expect(void_op.offences.size).to eq(1)
|
47
|
+
end
|
48
|
+
end
|
49
|
+
|
50
|
+
%w(1 2.0 /test/ [1] {}).each do |lit|
|
51
|
+
it "registers an offence for void lit #{lit} if not on last line" do
|
52
|
+
inspect_source(void_op,
|
53
|
+
["#{lit}",
|
54
|
+
'top'
|
55
|
+
])
|
56
|
+
expect(void_op.offences.size).to eq(1)
|
57
|
+
end
|
58
|
+
end
|
59
|
+
|
60
|
+
end
|
61
|
+
end
|
62
|
+
end
|
63
|
+
end
|
@@ -0,0 +1,133 @@
|
|
1
|
+
# encoding: utf-8
|
2
|
+
|
3
|
+
require 'spec_helper'
|
4
|
+
|
5
|
+
module Rubocop
|
6
|
+
module Cop
|
7
|
+
describe Offence do
|
8
|
+
let(:location) do
|
9
|
+
source_buffer = Parser::Source::Buffer.new('test', 1)
|
10
|
+
source_buffer.source = "a\n"
|
11
|
+
Parser::Source::Range.new(source_buffer, 0, 1)
|
12
|
+
end
|
13
|
+
subject(:offence) do
|
14
|
+
Offence.new(:convention, location, 'message', 'CopName')
|
15
|
+
end
|
16
|
+
|
17
|
+
it 'has a few required attributes' do
|
18
|
+
expect(offence.severity).to eq(:convention)
|
19
|
+
expect(offence.line).to eq(1)
|
20
|
+
expect(offence.message).to eq('message')
|
21
|
+
expect(offence.cop_name).to eq('CopName')
|
22
|
+
end
|
23
|
+
|
24
|
+
it 'overrides #to_s' do
|
25
|
+
expect(offence.to_s).to eq('C: 1: 1: message')
|
26
|
+
end
|
27
|
+
|
28
|
+
it 'does not blow up if a message contains %' do
|
29
|
+
offence = Offence.new(:convention, location, 'message % test',
|
30
|
+
'CopName')
|
31
|
+
|
32
|
+
expect(offence.to_s).to eq('C: 1: 1: message % test')
|
33
|
+
end
|
34
|
+
|
35
|
+
it 'redefines == to compare offences based on their contents' do
|
36
|
+
o1 = Offence.new(:convention, location, 'message', 'CopName')
|
37
|
+
o2 = Offence.new(:convention, location, 'message', 'CopName')
|
38
|
+
|
39
|
+
expect(o1 == o2).to be_true
|
40
|
+
end
|
41
|
+
|
42
|
+
it 'is frozen' do
|
43
|
+
expect(offence).to be_frozen
|
44
|
+
end
|
45
|
+
|
46
|
+
[:severity, :location, :line, :column, :message, :cop_name].each do |a|
|
47
|
+
describe "##{a}" do
|
48
|
+
it 'is frozen' do
|
49
|
+
expect(offence.send(a)).to be_frozen
|
50
|
+
end
|
51
|
+
end
|
52
|
+
end
|
53
|
+
|
54
|
+
context 'when unknown severity is passed' do
|
55
|
+
it 'raises error' do
|
56
|
+
expect do
|
57
|
+
Offence.new(:foobar, location, 'message', 'CopName')
|
58
|
+
end.to raise_error(ArgumentError)
|
59
|
+
end
|
60
|
+
end
|
61
|
+
|
62
|
+
describe '#severity_level' do
|
63
|
+
subject(:severity_level) do
|
64
|
+
Offence.new(severity, location, 'message', 'CopName').severity_level
|
65
|
+
end
|
66
|
+
|
67
|
+
context 'when severity is :refactor' do
|
68
|
+
let(:severity) { :refactor }
|
69
|
+
it 'is 1' do
|
70
|
+
expect(severity_level).to eq(1)
|
71
|
+
end
|
72
|
+
end
|
73
|
+
|
74
|
+
context 'when severity is :fatal' do
|
75
|
+
let(:severity) { :fatal }
|
76
|
+
it 'is 5' do
|
77
|
+
expect(severity_level).to eq(5)
|
78
|
+
end
|
79
|
+
end
|
80
|
+
end
|
81
|
+
|
82
|
+
describe '#<=>' do
|
83
|
+
def offence(hash = {})
|
84
|
+
attrs = {
|
85
|
+
sev: :convention,
|
86
|
+
line: 5,
|
87
|
+
col: 5,
|
88
|
+
mes: 'message',
|
89
|
+
cop: 'CopName'
|
90
|
+
}.merge(hash)
|
91
|
+
|
92
|
+
Offence.new(
|
93
|
+
attrs[:sev],
|
94
|
+
location(attrs[:line], attrs[:col],
|
95
|
+
%w(aaaaaa bbbbbb cccccc dddddd eeeeee ffffff)),
|
96
|
+
attrs[:mes],
|
97
|
+
attrs[:cop]
|
98
|
+
)
|
99
|
+
end
|
100
|
+
|
101
|
+
def location(line, column, source)
|
102
|
+
source_buffer = Parser::Source::Buffer.new('test', 1)
|
103
|
+
source_buffer.source = source.join("\n")
|
104
|
+
begin_pos = source[0...(line - 1)].reduce(0) do |a, e|
|
105
|
+
a + e.length + "\n".length
|
106
|
+
end + column
|
107
|
+
Parser::Source::Range.new(source_buffer, begin_pos, begin_pos + 1)
|
108
|
+
end
|
109
|
+
|
110
|
+
[
|
111
|
+
[{ }, { }, 0],
|
112
|
+
|
113
|
+
[{ line: 6 }, { line: 5 }, 1],
|
114
|
+
|
115
|
+
[{ line: 5, col: 6 }, { line: 5, col: 5 }, 1],
|
116
|
+
[{ line: 6, col: 4 }, { line: 5, col: 5 }, 1],
|
117
|
+
|
118
|
+
[{ cop: 'B' }, { cop: 'A' }, 1],
|
119
|
+
[{ line: 6, cop: 'A' }, { line: 5, cop: 'B' }, 1],
|
120
|
+
[{ col: 6, cop: 'A' }, { col: 5, cop: 'B' }, 1],
|
121
|
+
].each do |one, other, expectation|
|
122
|
+
context "when receiver has #{one} and other has #{other}" do
|
123
|
+
it "returns #{expectation}" do
|
124
|
+
an_offence = offence(one)
|
125
|
+
other_offence = offence(other)
|
126
|
+
expect(an_offence <=> other_offence).to eq(expectation)
|
127
|
+
end
|
128
|
+
end
|
129
|
+
end
|
130
|
+
end
|
131
|
+
end
|
132
|
+
end
|
133
|
+
end
|
@@ -0,0 +1,27 @@
|
|
1
|
+
# encoding: utf-8
|
2
|
+
|
3
|
+
require 'spec_helper'
|
4
|
+
|
5
|
+
module Rubocop
|
6
|
+
module Cop
|
7
|
+
module Rails
|
8
|
+
describe Validation do
|
9
|
+
let(:val) { Validation.new }
|
10
|
+
|
11
|
+
Validation::BLACKLIST.each do |validation|
|
12
|
+
it "registers an offence for #{validation}" do
|
13
|
+
inspect_source(val,
|
14
|
+
["#{validation} :name"])
|
15
|
+
expect(val.offences.size).to eq(1)
|
16
|
+
end
|
17
|
+
end
|
18
|
+
|
19
|
+
it 'accepts sexy validations' do
|
20
|
+
inspect_source(val,
|
21
|
+
['validates :name'])
|
22
|
+
expect(val.offences).to be_empty
|
23
|
+
end
|
24
|
+
end
|
25
|
+
end
|
26
|
+
end
|
27
|
+
end
|
@@ -0,0 +1,142 @@
|
|
1
|
+
# encoding: utf-8
|
2
|
+
|
3
|
+
require 'spec_helper'
|
4
|
+
|
5
|
+
module Rubocop
|
6
|
+
module Cop
|
7
|
+
module Style
|
8
|
+
describe AccessControl do
|
9
|
+
let(:a) { AccessControl.new }
|
10
|
+
|
11
|
+
it 'registers an offence for misaligned private' do
|
12
|
+
inspect_source(a,
|
13
|
+
['class Test',
|
14
|
+
'',
|
15
|
+
'private',
|
16
|
+
'',
|
17
|
+
' def test; end',
|
18
|
+
'end'])
|
19
|
+
expect(a.offences.size).to eq(1)
|
20
|
+
expect(a.offences.map(&:message))
|
21
|
+
.to eq([format(AccessControl::INDENT_MSG, 'private')])
|
22
|
+
end
|
23
|
+
|
24
|
+
it 'registers an offence for misaligned private in module' do
|
25
|
+
inspect_source(a,
|
26
|
+
['module Test',
|
27
|
+
'',
|
28
|
+
'private',
|
29
|
+
'',
|
30
|
+
' def test; end',
|
31
|
+
'end'])
|
32
|
+
expect(a.offences.size).to eq(1)
|
33
|
+
expect(a.offences.map(&:message))
|
34
|
+
.to eq([format(AccessControl::INDENT_MSG, 'private')])
|
35
|
+
end
|
36
|
+
|
37
|
+
it 'registers an offence for misaligned private in singleton class' do
|
38
|
+
inspect_source(a,
|
39
|
+
['class << self',
|
40
|
+
'',
|
41
|
+
'private',
|
42
|
+
'',
|
43
|
+
' def test; end',
|
44
|
+
'end'])
|
45
|
+
expect(a.offences.size).to eq(1)
|
46
|
+
expect(a.offences.map(&:message))
|
47
|
+
.to eq([format(AccessControl::INDENT_MSG, 'private')])
|
48
|
+
end
|
49
|
+
|
50
|
+
it 'registers an offence for misaligned protected' do
|
51
|
+
inspect_source(a,
|
52
|
+
['class Test',
|
53
|
+
'',
|
54
|
+
'protected',
|
55
|
+
'',
|
56
|
+
' def test; end',
|
57
|
+
'end'])
|
58
|
+
expect(a.offences.size).to eq(1)
|
59
|
+
expect(a.offences.map(&:message))
|
60
|
+
.to eq([format(AccessControl::INDENT_MSG, 'protected')])
|
61
|
+
end
|
62
|
+
|
63
|
+
it 'accepts properly indented private' do
|
64
|
+
inspect_source(a,
|
65
|
+
['class Test',
|
66
|
+
'',
|
67
|
+
' private',
|
68
|
+
'',
|
69
|
+
' def test; end',
|
70
|
+
'end'])
|
71
|
+
expect(a.offences).to be_empty
|
72
|
+
end
|
73
|
+
|
74
|
+
it 'accepts properly indented protected' do
|
75
|
+
inspect_source(a,
|
76
|
+
['class Test',
|
77
|
+
'',
|
78
|
+
' protected',
|
79
|
+
'',
|
80
|
+
' def test; end',
|
81
|
+
'end'])
|
82
|
+
expect(a.offences).to be_empty
|
83
|
+
end
|
84
|
+
|
85
|
+
it 'handles properly nested classes' do
|
86
|
+
inspect_source(a,
|
87
|
+
['class Test',
|
88
|
+
'',
|
89
|
+
' class Nested',
|
90
|
+
'',
|
91
|
+
' private',
|
92
|
+
'',
|
93
|
+
' def a; end',
|
94
|
+
' end',
|
95
|
+
'',
|
96
|
+
' protected',
|
97
|
+
'',
|
98
|
+
' def test; end',
|
99
|
+
'end'])
|
100
|
+
expect(a.offences.size).to eq(1)
|
101
|
+
expect(a.offences.map(&:message))
|
102
|
+
.to eq([format(AccessControl::INDENT_MSG, 'private')])
|
103
|
+
end
|
104
|
+
|
105
|
+
it 'requires blank line before private/protected' do
|
106
|
+
inspect_source(a,
|
107
|
+
['class Test',
|
108
|
+
' protected',
|
109
|
+
'',
|
110
|
+
' def test; end',
|
111
|
+
'end'])
|
112
|
+
expect(a.offences.size).to eq(1)
|
113
|
+
expect(a.offences.map(&:message))
|
114
|
+
.to eq([format(AccessControl::BLANK_MSG, 'protected')])
|
115
|
+
end
|
116
|
+
|
117
|
+
it 'requires blank line after private/protected' do
|
118
|
+
inspect_source(a,
|
119
|
+
['class Test',
|
120
|
+
'',
|
121
|
+
' protected',
|
122
|
+
' def test; end',
|
123
|
+
'end'])
|
124
|
+
expect(a.offences.size).to eq(1)
|
125
|
+
expect(a.offences.map(&:message))
|
126
|
+
.to eq([format(AccessControl::BLANK_MSG, 'protected')])
|
127
|
+
end
|
128
|
+
|
129
|
+
it 'recognizes blank lines with DOS style line endings' do
|
130
|
+
inspect_source(a,
|
131
|
+
["class Test\r",
|
132
|
+
"\r",
|
133
|
+
" protected\r",
|
134
|
+
"\r",
|
135
|
+
" def test; end\r",
|
136
|
+
"end\r"])
|
137
|
+
expect(a.offences.size).to eq(0)
|
138
|
+
end
|
139
|
+
end
|
140
|
+
end
|
141
|
+
end
|
142
|
+
end
|
@@ -0,0 +1,47 @@
|
|
1
|
+
# encoding: utf-8
|
2
|
+
|
3
|
+
require 'spec_helper'
|
4
|
+
|
5
|
+
module Rubocop
|
6
|
+
module Cop
|
7
|
+
module Style
|
8
|
+
describe Alias do
|
9
|
+
let(:a) { Alias.new }
|
10
|
+
|
11
|
+
it 'registers an offence for alias with symbol args' do
|
12
|
+
inspect_source(a,
|
13
|
+
['alias :ala :bala'])
|
14
|
+
expect(a.offences.size).to eq(1)
|
15
|
+
expect(a.offences.map(&:message))
|
16
|
+
.to eq([Alias::MSG])
|
17
|
+
end
|
18
|
+
|
19
|
+
it 'registers an offence for alias with bareword args' do
|
20
|
+
inspect_source(a,
|
21
|
+
['alias ala bala'])
|
22
|
+
expect(a.offences.size).to eq(1)
|
23
|
+
expect(a.offences.map(&:message))
|
24
|
+
.to eq([Alias::MSG])
|
25
|
+
end
|
26
|
+
|
27
|
+
it 'does not register an offence for alias_method' do
|
28
|
+
inspect_source(a,
|
29
|
+
['alias_method :ala, :bala'])
|
30
|
+
expect(a.offences).to be_empty
|
31
|
+
end
|
32
|
+
|
33
|
+
it 'does not register an offence for :alias' do
|
34
|
+
inspect_source(a,
|
35
|
+
['[:alias, :ala, :bala]'])
|
36
|
+
expect(a.offences).to be_empty
|
37
|
+
end
|
38
|
+
|
39
|
+
it 'does not register an offence for alias with gvars' do
|
40
|
+
inspect_source(a,
|
41
|
+
['alias $ala $bala'])
|
42
|
+
expect(a.offences).to be_empty
|
43
|
+
end
|
44
|
+
end
|
45
|
+
end
|
46
|
+
end
|
47
|
+
end
|
@@ -0,0 +1,199 @@
|
|
1
|
+
# encoding: utf-8
|
2
|
+
|
3
|
+
require 'spec_helper'
|
4
|
+
|
5
|
+
module Rubocop
|
6
|
+
module Cop
|
7
|
+
module Style
|
8
|
+
describe AlignParameters do
|
9
|
+
let(:align) { AlignParameters.new }
|
10
|
+
|
11
|
+
it 'registers an offence for parameters with single indent' do
|
12
|
+
inspect_source(align, ['function(a,',
|
13
|
+
' if b then c else d end)'])
|
14
|
+
expect(align.offences.size).to eq(1)
|
15
|
+
end
|
16
|
+
|
17
|
+
it 'registers an offence for parameters with double indent' do
|
18
|
+
inspect_source(align, ['function(a,',
|
19
|
+
' if b then c else d end)'])
|
20
|
+
expect(align.offences.size).to eq(1)
|
21
|
+
end
|
22
|
+
|
23
|
+
it 'accepts multiline []= method call' do
|
24
|
+
inspect_source(align, ['Test.config["something"] =',
|
25
|
+
' true'])
|
26
|
+
expect(align.offences).to be_empty
|
27
|
+
end
|
28
|
+
|
29
|
+
it 'accepts correctly aligned parameters' do
|
30
|
+
inspect_source(align, ['function(a,',
|
31
|
+
' 0, 1,',
|
32
|
+
' (x + y),',
|
33
|
+
' if b then c else d end)'])
|
34
|
+
expect(align.offences).to be_empty
|
35
|
+
end
|
36
|
+
|
37
|
+
it 'accepts calls that only span one line' do
|
38
|
+
inspect_source(align, ['find(path, s, @special[sexp[0]])'])
|
39
|
+
expect(align.offences).to be_empty
|
40
|
+
end
|
41
|
+
|
42
|
+
it "doesn't get confused by a symbol argument" do
|
43
|
+
inspect_source(align,
|
44
|
+
['add_offence(:convention, index,',
|
45
|
+
' MSG % kind)'])
|
46
|
+
expect(align.offences).to be_empty
|
47
|
+
end
|
48
|
+
|
49
|
+
it "doesn't get confused by splat operator" do
|
50
|
+
inspect_source(align,
|
51
|
+
['func1(*a,',
|
52
|
+
' *b,',
|
53
|
+
' c)',
|
54
|
+
'func2(a,',
|
55
|
+
' *b,',
|
56
|
+
' c)',
|
57
|
+
'func3(*a)',
|
58
|
+
])
|
59
|
+
expect(align.offences.map(&:to_s)).to eq(
|
60
|
+
['C: 5: 6: Align the parameters of a method call if they span ' +
|
61
|
+
'more than one line.'])
|
62
|
+
end
|
63
|
+
|
64
|
+
it "doesn't get confused by extra comma at the end" do
|
65
|
+
inspect_source(align,
|
66
|
+
['func1(a,',
|
67
|
+
' b,)'])
|
68
|
+
expect(align.offences.map(&:to_s)).to eq(
|
69
|
+
['C: 2: 6: Align the parameters of a method call if they span ' +
|
70
|
+
'more than one line.'])
|
71
|
+
end
|
72
|
+
|
73
|
+
it 'can handle a correctly aligned string literal as first argument' do
|
74
|
+
inspect_source(align,
|
75
|
+
['add_offence(:convention, x,',
|
76
|
+
' a)'])
|
77
|
+
expect(align.offences).to be_empty
|
78
|
+
end
|
79
|
+
|
80
|
+
it 'can handle a string literal as other argument' do
|
81
|
+
inspect_source(align,
|
82
|
+
['add_offence(:convention,',
|
83
|
+
' "", a)'])
|
84
|
+
expect(align.offences).to be_empty
|
85
|
+
end
|
86
|
+
|
87
|
+
it "doesn't get confused by a line break inside a parameter" do
|
88
|
+
inspect_source(align,
|
89
|
+
['read(path, { headers: true,',
|
90
|
+
' converters: :numeric })'])
|
91
|
+
expect(align.offences).to be_empty
|
92
|
+
end
|
93
|
+
|
94
|
+
it "doesn't get confused by symbols with embedded expressions" do
|
95
|
+
inspect_source(align,
|
96
|
+
['send(:"#{name}_comments_path")'])
|
97
|
+
expect(align.offences).to be_empty
|
98
|
+
end
|
99
|
+
|
100
|
+
it "doesn't get confused by regexen with embedded expressions" do
|
101
|
+
inspect_source(align,
|
102
|
+
['a(/#{name}/)'])
|
103
|
+
expect(align.offences).to be_empty
|
104
|
+
end
|
105
|
+
|
106
|
+
it 'accepts braceless hashes' do
|
107
|
+
inspect_source(align,
|
108
|
+
['run(collection, :entry_name => label,',
|
109
|
+
' :paginator => paginator)'])
|
110
|
+
expect(align.offences).to be_empty
|
111
|
+
end
|
112
|
+
|
113
|
+
it 'accepts the first parameter being on a new row' do
|
114
|
+
inspect_source(align,
|
115
|
+
[' match(',
|
116
|
+
' a,',
|
117
|
+
' b',
|
118
|
+
' )'])
|
119
|
+
expect(align.offences).to be_empty
|
120
|
+
end
|
121
|
+
|
122
|
+
it 'can handle heredoc strings' do
|
123
|
+
src = ['class_eval(<<-EOS, __FILE__, __LINE__ + 1)',
|
124
|
+
' def run_#{name}_callbacks(*args)',
|
125
|
+
' a = 1',
|
126
|
+
' return value',
|
127
|
+
' end',
|
128
|
+
' EOS']
|
129
|
+
inspect_source(align, src)
|
130
|
+
expect(align.offences).to be_empty
|
131
|
+
end
|
132
|
+
|
133
|
+
it 'can handle a method call within a method call' do
|
134
|
+
inspect_source(align,
|
135
|
+
['a(a1,',
|
136
|
+
' b(b1,',
|
137
|
+
' b2),',
|
138
|
+
' a2)'])
|
139
|
+
expect(align.offences).to be_empty
|
140
|
+
end
|
141
|
+
|
142
|
+
it 'can handle a call embedded in a string' do
|
143
|
+
inspect_source(align,
|
144
|
+
['model("#{index(name)}", child)'])
|
145
|
+
expect(align.offences).to be_empty
|
146
|
+
end
|
147
|
+
|
148
|
+
it 'can handle do-end' do
|
149
|
+
inspect_source(align,
|
150
|
+
[' run(lambda do |e|',
|
151
|
+
" w = e['warden']",
|
152
|
+
' end)'])
|
153
|
+
expect(align.offences).to be_empty
|
154
|
+
end
|
155
|
+
|
156
|
+
it 'can handle a call with a block inside another call' do
|
157
|
+
src = ['new(table_name,',
|
158
|
+
' exec_query("info(\'#{row[\'name\']}\')").map { |col|',
|
159
|
+
" col['name']",
|
160
|
+
' })']
|
161
|
+
inspect_source(align, src)
|
162
|
+
expect(align.offences).to be_empty
|
163
|
+
end
|
164
|
+
|
165
|
+
it 'can handle a ternary condition with a block reference' do
|
166
|
+
src = ['cond ? a : func(&b)']
|
167
|
+
inspect_source(align, src)
|
168
|
+
expect(align.offences).to be_empty
|
169
|
+
end
|
170
|
+
|
171
|
+
it 'can handle parentheses used with no parameters' do
|
172
|
+
src = ['func()']
|
173
|
+
inspect_source(align, src)
|
174
|
+
expect(align.offences).to be_empty
|
175
|
+
end
|
176
|
+
|
177
|
+
it 'can handle a multiline hash as second parameter' do
|
178
|
+
src = ['tag(:input, {',
|
179
|
+
' :value => value',
|
180
|
+
'})']
|
181
|
+
inspect_source(align, src)
|
182
|
+
expect(align.offences).to be_empty
|
183
|
+
end
|
184
|
+
|
185
|
+
it 'can handle method calls without parentheses' do
|
186
|
+
src = ['a(b c, d)']
|
187
|
+
inspect_source(align, src)
|
188
|
+
expect(align.offences).to be_empty
|
189
|
+
end
|
190
|
+
|
191
|
+
it 'can handle other method calls without parentheses' do
|
192
|
+
src = ['chars(Unicode.apply_mapping @wrapped_string, :uppercase)']
|
193
|
+
inspect_source(align, src)
|
194
|
+
expect(align.offences).to be_empty
|
195
|
+
end
|
196
|
+
end
|
197
|
+
end
|
198
|
+
end
|
199
|
+
end
|