ridecharge-rubocop 0.0.1
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.
- checksums.yaml +7 -0
- data/.gitignore +22 -0
- data/.rspec +1 -0
- data/.travis.yml +14 -0
- data/CHANGELOG.md +0 -0
- data/Gemfile +4 -0
- data/LICENSE.txt +22 -0
- data/README.md +35 -0
- data/Rakefile +22 -0
- data/bin/ridecharge-rubocop +49 -0
- data/config/0default.yml +8 -0
- data/config/fleet-magic-todo.yml +380 -0
- data/config/rc-todo.yml +190 -0
- data/config/ridecharge-rubocop_todo.yml +73 -0
- data/config/rubocop/default.yml +308 -0
- data/config/rubocop/disabled.yml +9 -0
- data/config/rubocop/enabled.yml +648 -0
- data/config/standard-todo.yml +24 -0
- data/config/tabs.yml +15 -0
- data/config/vehicle-todo.yml +195 -0
- data/lib/ridecharge/rubocop.rb +2 -0
- data/lib/ridecharge/rubocop/version.rb +5 -0
- data/lib/rubocop/config_loader_monkeypatch.rb +117 -0
- data/lib/rubocop/ridecharge.rb +1 -0
- data/ridecharge-rubocop.gemspec +25 -0
- data/spec/isolated_environment_spec.rb +24 -0
- data/spec/project_spec.rb +118 -0
- data/spec/rubocop/cli_spec.rb +1385 -0
- data/spec/rubocop/config_loader_spec.rb +328 -0
- data/spec/rubocop/config_spec.rb +179 -0
- data/spec/rubocop/config_store_spec.rb +53 -0
- data/spec/rubocop/cop/commissioner_spec.rb +83 -0
- data/spec/rubocop/cop/cop_spec.rb +114 -0
- data/spec/rubocop/cop/corrector_spec.rb +59 -0
- data/spec/rubocop/cop/lint/ambiguous_operator_spec.rb +113 -0
- data/spec/rubocop/cop/lint/ambiguous_regexp_literal_spec.rb +35 -0
- data/spec/rubocop/cop/lint/assignment_in_condition_spec.rb +107 -0
- data/spec/rubocop/cop/lint/block_alignment_spec.rb +411 -0
- data/spec/rubocop/cop/lint/condition_position_spec.rb +49 -0
- data/spec/rubocop/cop/lint/debugger_spec.rb +39 -0
- data/spec/rubocop/cop/lint/else_layout_spec.rb +65 -0
- data/spec/rubocop/cop/lint/empty_ensure_spec.rb +27 -0
- data/spec/rubocop/cop/lint/end_alignment_spec.rb +136 -0
- data/spec/rubocop/cop/lint/end_in_method_spec.rb +29 -0
- data/spec/rubocop/cop/lint/ensure_return_spec.rb +39 -0
- data/spec/rubocop/cop/lint/eval_spec.rb +35 -0
- data/spec/rubocop/cop/lint/handle_exceptions_spec.rb +30 -0
- data/spec/rubocop/cop/lint/invalid_character_literal_spec.rb +33 -0
- data/spec/rubocop/cop/lint/literal_in_condition_spec.rb +63 -0
- data/spec/rubocop/cop/lint/loop_spec.rb +27 -0
- data/spec/rubocop/cop/lint/parentheses_as_grouped_expression_spec.rb +57 -0
- data/spec/rubocop/cop/lint/require_parentheses_spec.rb +82 -0
- data/spec/rubocop/cop/lint/rescue_exception_spec.rb +131 -0
- data/spec/rubocop/cop/lint/shadowing_outer_local_variable_spec.rb +237 -0
- data/spec/rubocop/cop/lint/syntax_spec.rb +34 -0
- data/spec/rubocop/cop/lint/unreachable_code_spec.rb +63 -0
- data/spec/rubocop/cop/lint/useless_assignment_spec.rb +1570 -0
- data/spec/rubocop/cop/lint/useless_comparison_spec.rb +30 -0
- data/spec/rubocop/cop/lint/useless_else_without_rescue_spec.rb +48 -0
- data/spec/rubocop/cop/lint/useless_setter_call_spec.rb +149 -0
- data/spec/rubocop/cop/lint/void_spec.rb +57 -0
- data/spec/rubocop/cop/offence_spec.rb +133 -0
- data/spec/rubocop/cop/rails/default_scope_spec.rb +37 -0
- data/spec/rubocop/cop/rails/has_and_belongs_to_many_spec.rb +13 -0
- data/spec/rubocop/cop/rails/output_spec.rb +41 -0
- data/spec/rubocop/cop/rails/read_attribute_spec.rb +13 -0
- data/spec/rubocop/cop/rails/validation_spec.rb +21 -0
- data/spec/rubocop/cop/style/access_modifier_indentation_spec.rb +361 -0
- data/spec/rubocop/cop/style/accessor_method_name_spec.rb +81 -0
- data/spec/rubocop/cop/style/alias_spec.rb +59 -0
- data/spec/rubocop/cop/style/align_array_spec.rb +75 -0
- data/spec/rubocop/cop/style/align_hash_spec.rb +310 -0
- data/spec/rubocop/cop/style/align_parameters_spec.rb +222 -0
- data/spec/rubocop/cop/style/and_or_spec.rb +57 -0
- data/spec/rubocop/cop/style/ascii_comments_spec.rb +22 -0
- data/spec/rubocop/cop/style/ascii_identifiers_spec.rb +36 -0
- data/spec/rubocop/cop/style/attr_spec.rb +19 -0
- data/spec/rubocop/cop/style/begin_block_spec.rb +13 -0
- data/spec/rubocop/cop/style/block_comments_spec.rb +21 -0
- data/spec/rubocop/cop/style/block_nesting_spec.rb +156 -0
- data/spec/rubocop/cop/style/blocks_spec.rb +99 -0
- data/spec/rubocop/cop/style/braces_around_hash_parameters_spec.rb +284 -0
- data/spec/rubocop/cop/style/case_equality_spec.rb +12 -0
- data/spec/rubocop/cop/style/case_indentation_spec.rb +289 -0
- data/spec/rubocop/cop/style/character_literal_spec.rb +37 -0
- data/spec/rubocop/cop/style/class_and_module_camel_case_spec.rb +40 -0
- data/spec/rubocop/cop/style/class_length_spec.rb +131 -0
- data/spec/rubocop/cop/style/class_methods_spec.rb +45 -0
- data/spec/rubocop/cop/style/class_vars_spec.rb +19 -0
- data/spec/rubocop/cop/style/collection_methods_spec.rb +48 -0
- data/spec/rubocop/cop/style/colon_method_call_spec.rb +60 -0
- data/spec/rubocop/cop/style/comment_annotation_spec.rb +86 -0
- data/spec/rubocop/cop/style/constant_name_spec.rb +65 -0
- data/spec/rubocop/cop/style/cyclomatic_complexity_spec.rb +204 -0
- data/spec/rubocop/cop/style/def_with_parentheses_spec.rb +39 -0
- data/spec/rubocop/cop/style/documentation_spec.rb +123 -0
- data/spec/rubocop/cop/style/dot_position_spec.rb +94 -0
- data/spec/rubocop/cop/style/empty_line_between_defs_spec.rb +127 -0
- data/spec/rubocop/cop/style/empty_lines_around_access_modifier_spec.rb +56 -0
- data/spec/rubocop/cop/style/empty_lines_around_body_spec.rb +131 -0
- data/spec/rubocop/cop/style/empty_lines_spec.rb +40 -0
- data/spec/rubocop/cop/style/empty_literal_spec.rb +100 -0
- data/spec/rubocop/cop/style/encoding_spec.rb +56 -0
- data/spec/rubocop/cop/style/end_block_spec.rb +13 -0
- data/spec/rubocop/cop/style/end_of_line_spec.rb +47 -0
- data/spec/rubocop/cop/style/even_odd_spec.rb +75 -0
- data/spec/rubocop/cop/style/favor_join_spec.rb +31 -0
- data/spec/rubocop/cop/style/favor_sprintf_spec.rb +47 -0
- data/spec/rubocop/cop/style/favor_unless_over_negated_if_spec.rb +76 -0
- data/spec/rubocop/cop/style/favor_until_over_negated_while_spec.rb +41 -0
- data/spec/rubocop/cop/style/final_newline_spec.rb +30 -0
- data/spec/rubocop/cop/style/flip_flop_spec.rb +23 -0
- data/spec/rubocop/cop/style/for_spec.rb +105 -0
- data/spec/rubocop/cop/style/global_vars_spec.rb +34 -0
- data/spec/rubocop/cop/style/hash_methods_spec.rb +45 -0
- data/spec/rubocop/cop/style/hash_syntax_spec.rb +131 -0
- data/spec/rubocop/cop/style/if_unless_modifier_spec.rb +128 -0
- data/spec/rubocop/cop/style/if_with_semicolon_spec.rb +19 -0
- data/spec/rubocop/cop/style/indentation_consistency_spec.rb +490 -0
- data/spec/rubocop/cop/style/indentation_width_spec.rb +470 -0
- data/spec/rubocop/cop/style/lambda_call_spec.rb +65 -0
- data/spec/rubocop/cop/style/lambda_spec.rb +41 -0
- data/spec/rubocop/cop/style/leading_comment_space_spec.rb +64 -0
- data/spec/rubocop/cop/style/line_end_concatenation_spec.rb +34 -0
- data/spec/rubocop/cop/style/line_length_spec.rb +20 -0
- data/spec/rubocop/cop/style/method_call_parentheses_spec.rb +59 -0
- data/spec/rubocop/cop/style/method_called_on_do_end_block_spec.rb +60 -0
- data/spec/rubocop/cop/style/method_def_parentheses_spec.rb +106 -0
- data/spec/rubocop/cop/style/method_length_spec.rb +147 -0
- data/spec/rubocop/cop/style/method_name_spec.rb +125 -0
- data/spec/rubocop/cop/style/module_function_spec.rb +24 -0
- data/spec/rubocop/cop/style/multiline_block_chain_spec.rb +78 -0
- data/spec/rubocop/cop/style/multiline_if_then_spec.rb +107 -0
- data/spec/rubocop/cop/style/multiline_ternary_operator_spec.rb +18 -0
- data/spec/rubocop/cop/style/nested_ternary_operator_spec.rb +21 -0
- data/spec/rubocop/cop/style/nil_comparison_spec.rb +30 -0
- data/spec/rubocop/cop/style/not_spec.rb +22 -0
- data/spec/rubocop/cop/style/numeric_literals_spec.rb +64 -0
- data/spec/rubocop/cop/style/one_line_conditional_spec.rb +13 -0
- data/spec/rubocop/cop/style/op_method_spec.rb +74 -0
- data/spec/rubocop/cop/style/parameter_lists_spec.rb +44 -0
- data/spec/rubocop/cop/style/parentheses_around_condition_spec.rb +122 -0
- data/spec/rubocop/cop/style/perl_backrefs_spec.rb +17 -0
- data/spec/rubocop/cop/style/predicate_name_spec.rb +25 -0
- data/spec/rubocop/cop/style/proc_spec.rb +27 -0
- data/spec/rubocop/cop/style/raise_args_spec.rb +82 -0
- data/spec/rubocop/cop/style/redundant_begin_spec.rb +57 -0
- data/spec/rubocop/cop/style/redundant_exception_spec.rb +27 -0
- data/spec/rubocop/cop/style/redundant_return_spec.rb +171 -0
- data/spec/rubocop/cop/style/redundant_self_spec.rb +142 -0
- data/spec/rubocop/cop/style/regexp_literal_spec.rb +83 -0
- data/spec/rubocop/cop/style/rescue_modifier_spec.rb +116 -0
- data/spec/rubocop/cop/style/semicolon_spec.rb +100 -0
- data/spec/rubocop/cop/style/signal_exception_spec.rb +266 -0
- data/spec/rubocop/cop/style/single_line_block_params_spec.rb +68 -0
- data/spec/rubocop/cop/style/single_line_methods_spec.rb +52 -0
- data/spec/rubocop/cop/style/space_after_colon_spec.rb +38 -0
- data/spec/rubocop/cop/style/space_after_comma_spec.rb +30 -0
- data/spec/rubocop/cop/style/space_after_control_keyword_spec.rb +84 -0
- data/spec/rubocop/cop/style/space_after_method_name_spec.rb +70 -0
- data/spec/rubocop/cop/style/space_after_not_spec.rb +22 -0
- data/spec/rubocop/cop/style/space_after_semicolon_spec.rb +23 -0
- data/spec/rubocop/cop/style/space_around_block_braces_spec.rb +283 -0
- data/spec/rubocop/cop/style/space_around_equals_in_parameter_default_spec.rb +33 -0
- data/spec/rubocop/cop/style/space_around_operators_spec.rb +325 -0
- data/spec/rubocop/cop/style/space_before_modifier_keyword_spec.rb +70 -0
- data/spec/rubocop/cop/style/space_inside_brackets_spec.rb +52 -0
- data/spec/rubocop/cop/style/space_inside_hash_literal_braces_spec.rb +138 -0
- data/spec/rubocop/cop/style/space_inside_parens_spec.rb +34 -0
- data/spec/rubocop/cop/style/special_global_vars_spec.rb +56 -0
- data/spec/rubocop/cop/style/string_literals_spec.rb +212 -0
- data/spec/rubocop/cop/style/symbol_array_spec.rb +37 -0
- data/spec/rubocop/cop/style/tab_spec.rb +17 -0
- data/spec/rubocop/cop/style/trailing_blank_lines_spec.rb +43 -0
- data/spec/rubocop/cop/style/trailing_comma_spec.rb +230 -0
- data/spec/rubocop/cop/style/trailing_whitespace_spec.rb +30 -0
- data/spec/rubocop/cop/style/trivial_accessors_spec.rb +415 -0
- data/spec/rubocop/cop/style/unless_else_spec.rb +25 -0
- data/spec/rubocop/cop/style/variable_interpolation_spec.rb +47 -0
- data/spec/rubocop/cop/style/variable_name_spec.rb +107 -0
- data/spec/rubocop/cop/style/when_then_spec.rb +41 -0
- data/spec/rubocop/cop/style/while_until_do_spec.rb +53 -0
- data/spec/rubocop/cop/style/while_until_modifier_spec.rb +75 -0
- data/spec/rubocop/cop/style/word_array_spec.rb +97 -0
- data/spec/rubocop/cop/team_spec.rb +156 -0
- data/spec/rubocop/cop/util_spec.rb +49 -0
- data/spec/rubocop/cop/variable_inspector/assignment_spec.rb +213 -0
- data/spec/rubocop/cop/variable_inspector/locatable_spec.rb +734 -0
- data/spec/rubocop/cop/variable_inspector/scope_spec.rb +184 -0
- data/spec/rubocop/cop/variable_inspector/variable_spec.rb +73 -0
- data/spec/rubocop/cop/variable_inspector/variable_table_spec.rb +269 -0
- data/spec/rubocop/cop/variable_inspector_spec.rb +29 -0
- data/spec/rubocop/file_inspector_spec.rb +78 -0
- data/spec/rubocop/formatter/base_formatter_spec.rb +191 -0
- data/spec/rubocop/formatter/clang_style_formatter_spec.rb +114 -0
- data/spec/rubocop/formatter/colorizable_spec.rb +107 -0
- data/spec/rubocop/formatter/disabled_config_formatter_spec.rb +50 -0
- data/spec/rubocop/formatter/emacs_style_formatter_spec.rb +62 -0
- data/spec/rubocop/formatter/file_list_formatter_spec.rb +33 -0
- data/spec/rubocop/formatter/formatter_set_spec.rb +132 -0
- data/spec/rubocop/formatter/json_formatter_spec.rb +148 -0
- data/spec/rubocop/formatter/offence_count_formatter_spec.rb +52 -0
- data/spec/rubocop/formatter/progress_formatter_spec.rb +182 -0
- data/spec/rubocop/formatter/simple_text_formatter_spec.rb +123 -0
- data/spec/rubocop/options_spec.rb +145 -0
- data/spec/rubocop/path_util_spec.rb +42 -0
- data/spec/rubocop/processed_source_spec.rb +114 -0
- data/spec/rubocop/source_parser_spec.rb +139 -0
- data/spec/rubocop/target_finder_spec.rb +180 -0
- data/spec/rubocop/token_spec.rb +25 -0
- data/spec/spec_helper.rb +136 -0
- data/spec/support/ast_helper.rb +15 -0
- data/spec/support/file_helper.rb +21 -0
- data/spec/support/isolated_environment.rb +34 -0
- data/spec/support/mri_syntax_checker.rb +73 -0
- data/spec/support/shared_context.rb +22 -0
- data/spec/support/shared_examples.rb +33 -0
- data/spec/support/statement_modifier_helper.rb +41 -0
- metadata +511 -0
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
# encoding: utf-8
|
|
2
|
+
|
|
3
|
+
require 'spec_helper'
|
|
4
|
+
|
|
5
|
+
describe Rubocop::ConfigStore do
|
|
6
|
+
subject(:config_store) { described_class.new }
|
|
7
|
+
|
|
8
|
+
before do
|
|
9
|
+
allow(Rubocop::ConfigLoader).to receive(:configuration_file_for) do |arg|
|
|
10
|
+
# File tree:
|
|
11
|
+
# file1
|
|
12
|
+
# dir/.rubocop.yml
|
|
13
|
+
# dir/file2
|
|
14
|
+
# dir/subdir/file3
|
|
15
|
+
(arg =~ /dir/ ? 'dir' : '.') + '/.rubocop.yml'
|
|
16
|
+
end
|
|
17
|
+
allow(Rubocop::ConfigLoader)
|
|
18
|
+
.to receive(:configuration_from_file) { |arg| arg }
|
|
19
|
+
allow(Rubocop::ConfigLoader)
|
|
20
|
+
.to receive(:load_file) { |arg| "#{arg} loaded" }
|
|
21
|
+
allow(Rubocop::ConfigLoader)
|
|
22
|
+
.to receive(:merge_with_default) { |config, file| "merged #{config}" }
|
|
23
|
+
end
|
|
24
|
+
|
|
25
|
+
describe '.for' do
|
|
26
|
+
it 'always uses config specified in command line' do
|
|
27
|
+
config_store.options_config = :options_config
|
|
28
|
+
expect(config_store.for('file1')).to eq('merged options_config loaded')
|
|
29
|
+
end
|
|
30
|
+
|
|
31
|
+
context 'when no config specified in command line' do
|
|
32
|
+
it 'gets config path and config from cache if available' do
|
|
33
|
+
expect(Rubocop::ConfigLoader).to receive(:configuration_file_for).once
|
|
34
|
+
.with('dir')
|
|
35
|
+
expect(Rubocop::ConfigLoader).to receive(:configuration_file_for).once
|
|
36
|
+
.with('dir/subdir')
|
|
37
|
+
# The stub returns the same config path for dir and dir/subdir.
|
|
38
|
+
expect(Rubocop::ConfigLoader).to receive(:configuration_from_file).once
|
|
39
|
+
.with('dir/.rubocop.yml')
|
|
40
|
+
|
|
41
|
+
config_store.for('dir/file2')
|
|
42
|
+
config_store.for('dir/file2')
|
|
43
|
+
config_store.for('dir/subdir/file3')
|
|
44
|
+
end
|
|
45
|
+
|
|
46
|
+
it 'searches for config path if not available in cache' do
|
|
47
|
+
expect(Rubocop::ConfigLoader).to receive(:configuration_file_for).once
|
|
48
|
+
expect(Rubocop::ConfigLoader).to receive(:configuration_from_file).once
|
|
49
|
+
config_store.for('file1')
|
|
50
|
+
end
|
|
51
|
+
end
|
|
52
|
+
end
|
|
53
|
+
end
|
|
@@ -0,0 +1,83 @@
|
|
|
1
|
+
# encoding: utf-8
|
|
2
|
+
# rubocop:disable LineLength
|
|
3
|
+
|
|
4
|
+
require 'spec_helper'
|
|
5
|
+
|
|
6
|
+
describe Rubocop::Cop::Commissioner do
|
|
7
|
+
describe '#investigate' do
|
|
8
|
+
let(:cop) { double(Rubocop::Cop, offences: []).as_null_object }
|
|
9
|
+
|
|
10
|
+
it 'returns all offences found by the cops' do
|
|
11
|
+
allow(cop).to receive(:offences).and_return([1])
|
|
12
|
+
|
|
13
|
+
commissioner = described_class.new([cop])
|
|
14
|
+
source = []
|
|
15
|
+
processed_source = parse_source(source)
|
|
16
|
+
|
|
17
|
+
expect(commissioner.investigate(processed_source)).to eq [1]
|
|
18
|
+
end
|
|
19
|
+
|
|
20
|
+
context 'when a cop has no interest in the file' do
|
|
21
|
+
it 'returns all offences except the ones of the cop' do
|
|
22
|
+
cops = []
|
|
23
|
+
cops << double('cop A', offences: %w(foo), relevant_file?: true)
|
|
24
|
+
cops << double('cop B', offences: %w(bar), relevant_file?: false)
|
|
25
|
+
cops << double('cop C', offences: %w(baz), relevant_file?: true)
|
|
26
|
+
cops.each(&:as_null_object)
|
|
27
|
+
|
|
28
|
+
commissioner = described_class.new(cops)
|
|
29
|
+
source = []
|
|
30
|
+
processed_source = parse_source(source)
|
|
31
|
+
|
|
32
|
+
expect(commissioner.investigate(processed_source)).to eq %w(foo baz)
|
|
33
|
+
end
|
|
34
|
+
end
|
|
35
|
+
|
|
36
|
+
it 'traverses the AST and invoke cops specific callbacks' do
|
|
37
|
+
expect(cop).to receive(:on_def)
|
|
38
|
+
|
|
39
|
+
commissioner = described_class.new([cop])
|
|
40
|
+
source = ['def method', '1', 'end']
|
|
41
|
+
processed_source = parse_source(source)
|
|
42
|
+
|
|
43
|
+
commissioner.investigate(processed_source)
|
|
44
|
+
end
|
|
45
|
+
|
|
46
|
+
it 'passes the input params to all cops that implement their own #investigate method' do
|
|
47
|
+
source = []
|
|
48
|
+
processed_source = parse_source(source)
|
|
49
|
+
expect(cop).to receive(:investigate).with(processed_source)
|
|
50
|
+
|
|
51
|
+
commissioner = described_class.new([cop])
|
|
52
|
+
|
|
53
|
+
commissioner.investigate(processed_source)
|
|
54
|
+
end
|
|
55
|
+
|
|
56
|
+
it 'stores all errors raised by the cops' do
|
|
57
|
+
allow(cop).to receive(:on_def) { fail RuntimeError }
|
|
58
|
+
|
|
59
|
+
commissioner = described_class.new([cop])
|
|
60
|
+
source = ['def method', '1', 'end']
|
|
61
|
+
processed_source = parse_source(source)
|
|
62
|
+
|
|
63
|
+
commissioner.investigate(processed_source)
|
|
64
|
+
|
|
65
|
+
expect(commissioner.errors[cop].size).to eq(1)
|
|
66
|
+
expect(commissioner.errors[cop][0]).to be_instance_of(RuntimeError)
|
|
67
|
+
end
|
|
68
|
+
|
|
69
|
+
context 'when passed :raise_error option' do
|
|
70
|
+
it 're-raises the exception received while processing' do
|
|
71
|
+
allow(cop).to receive(:on_def) { fail RuntimeError }
|
|
72
|
+
|
|
73
|
+
commissioner = described_class.new([cop], raise_error: true)
|
|
74
|
+
source = ['def method', '1', 'end']
|
|
75
|
+
processed_source = parse_source(source)
|
|
76
|
+
|
|
77
|
+
expect do
|
|
78
|
+
commissioner.investigate(processed_source)
|
|
79
|
+
end.to raise_error(RuntimeError)
|
|
80
|
+
end
|
|
81
|
+
end
|
|
82
|
+
end
|
|
83
|
+
end
|
|
@@ -0,0 +1,114 @@
|
|
|
1
|
+
# encoding: utf-8
|
|
2
|
+
|
|
3
|
+
require 'spec_helper'
|
|
4
|
+
|
|
5
|
+
describe Rubocop::Cop::Cop do
|
|
6
|
+
subject(:cop) { described_class.new }
|
|
7
|
+
let(:location) do
|
|
8
|
+
source_buffer = Parser::Source::Buffer.new('test', 1)
|
|
9
|
+
source_buffer.source = "a\n"
|
|
10
|
+
Parser::Source::Range.new(source_buffer, 0, 1)
|
|
11
|
+
end
|
|
12
|
+
|
|
13
|
+
it 'initially has 0 offences' do
|
|
14
|
+
expect(cop.offences).to be_empty
|
|
15
|
+
end
|
|
16
|
+
|
|
17
|
+
it 'keeps track of offences' do
|
|
18
|
+
cop.add_offence(nil, location, 'message')
|
|
19
|
+
|
|
20
|
+
expect(cop.offences.size).to eq(1)
|
|
21
|
+
end
|
|
22
|
+
|
|
23
|
+
it 'will report registered offences' do
|
|
24
|
+
cop.add_offence(nil, location, 'message')
|
|
25
|
+
|
|
26
|
+
expect(cop.offences).not_to be_empty
|
|
27
|
+
end
|
|
28
|
+
|
|
29
|
+
it 'will set default severity' do
|
|
30
|
+
cop.add_offence(nil, location, 'message')
|
|
31
|
+
|
|
32
|
+
expect(cop.offences.first.severity).to eq(:convention)
|
|
33
|
+
end
|
|
34
|
+
|
|
35
|
+
it 'will set custom severity if present' do
|
|
36
|
+
cop.config[cop.name] = { 'Severity' => 'warning' }
|
|
37
|
+
cop.add_offence(nil, location, 'message')
|
|
38
|
+
|
|
39
|
+
expect(cop.offences.first.severity).to eq(:warning)
|
|
40
|
+
end
|
|
41
|
+
|
|
42
|
+
it 'will warn if custom severity is invalid' do
|
|
43
|
+
cop.config[cop.name] = { 'Severity' => 'superbad' }
|
|
44
|
+
expect(cop).to receive(:warn)
|
|
45
|
+
cop.add_offence(nil, location, 'message')
|
|
46
|
+
end
|
|
47
|
+
|
|
48
|
+
it 'registers offence with its name' do
|
|
49
|
+
cop = Rubocop::Cop::Style::For.new
|
|
50
|
+
cop.add_offence(nil, location, 'message')
|
|
51
|
+
expect(cop.offences.first.cop_name).to eq('For')
|
|
52
|
+
end
|
|
53
|
+
|
|
54
|
+
context 'with no submodule' do
|
|
55
|
+
subject(:cop) { described_class }
|
|
56
|
+
it('has right name') { expect(cop.cop_name).to eq('Cop') }
|
|
57
|
+
it('has right type') { expect(cop.cop_type).to eq(:cop) }
|
|
58
|
+
end
|
|
59
|
+
|
|
60
|
+
context 'with style cops' do
|
|
61
|
+
subject(:cop) { Rubocop::Cop::Style::For }
|
|
62
|
+
it('has right name') { expect(cop.cop_name).to eq('For') }
|
|
63
|
+
it('has right type') { expect(cop.cop_type).to eq(:style) }
|
|
64
|
+
end
|
|
65
|
+
|
|
66
|
+
context 'with lint cops' do
|
|
67
|
+
subject(:cop) { Rubocop::Cop::Lint::Loop }
|
|
68
|
+
it('has right name') { expect(cop.cop_name).to eq('Loop') }
|
|
69
|
+
it('has right type') { expect(cop.cop_type).to eq(:lint) }
|
|
70
|
+
end
|
|
71
|
+
|
|
72
|
+
context 'with rails cops' do
|
|
73
|
+
subject(:cop) { Rubocop::Cop::Rails::Validation }
|
|
74
|
+
it('has right name') { expect(cop.cop_name).to eq('Validation') }
|
|
75
|
+
it('has right type') { expect(cop.cop_type).to eq(:rails) }
|
|
76
|
+
end
|
|
77
|
+
|
|
78
|
+
describe 'CopStore' do
|
|
79
|
+
context '#types' do
|
|
80
|
+
subject { described_class.all.types }
|
|
81
|
+
it('has types') { expect(subject.length).not_to eq(0) }
|
|
82
|
+
it { should include :lint }
|
|
83
|
+
it do
|
|
84
|
+
pending 'Rails cops are usually removed after CLI start, ' \
|
|
85
|
+
'so CLI spec impacts this one'
|
|
86
|
+
should include :rails
|
|
87
|
+
end
|
|
88
|
+
it { should include :style }
|
|
89
|
+
it 'contains every value only once' do
|
|
90
|
+
expect(subject.length).to eq(subject.uniq.length)
|
|
91
|
+
end
|
|
92
|
+
end
|
|
93
|
+
context '#with_type' do
|
|
94
|
+
let(:types) { described_class.all.types }
|
|
95
|
+
it 'has at least one cop per type' do
|
|
96
|
+
types.each do |c|
|
|
97
|
+
expect(described_class.all.with_type(c).length).to be > 0
|
|
98
|
+
end
|
|
99
|
+
end
|
|
100
|
+
|
|
101
|
+
it 'has each cop in exactly one type' do
|
|
102
|
+
sum = 0
|
|
103
|
+
types.each do |c|
|
|
104
|
+
sum = sum + described_class.all.with_type(c).length
|
|
105
|
+
end
|
|
106
|
+
expect(sum).to be described_class.all.length
|
|
107
|
+
end
|
|
108
|
+
|
|
109
|
+
it 'returns 0 for an invalid type' do
|
|
110
|
+
expect(described_class.all.with_type('x').length).to be 0
|
|
111
|
+
end
|
|
112
|
+
end
|
|
113
|
+
end
|
|
114
|
+
end
|
|
@@ -0,0 +1,59 @@
|
|
|
1
|
+
# encoding: utf-8
|
|
2
|
+
|
|
3
|
+
require 'spec_helper'
|
|
4
|
+
|
|
5
|
+
describe Rubocop::Cop::Corrector do
|
|
6
|
+
describe '#rewrite' do
|
|
7
|
+
it 'allows removal of a range' do
|
|
8
|
+
source = 'true and false'
|
|
9
|
+
processed_source = parse_source(source)
|
|
10
|
+
|
|
11
|
+
correction = lambda do |corrector|
|
|
12
|
+
node = processed_source.ast
|
|
13
|
+
corrector.remove(node.loc.operator)
|
|
14
|
+
end
|
|
15
|
+
|
|
16
|
+
corrector = described_class.new(processed_source.buffer, [correction])
|
|
17
|
+
expect(corrector.rewrite).to eq 'true false'
|
|
18
|
+
end
|
|
19
|
+
|
|
20
|
+
it 'allows insertion before a source range' do
|
|
21
|
+
source = 'true and false'
|
|
22
|
+
processed_source = parse_source(source)
|
|
23
|
+
|
|
24
|
+
correction = lambda do |corrector|
|
|
25
|
+
node = processed_source.ast
|
|
26
|
+
corrector.insert_before(node.loc.operator, ';nil ')
|
|
27
|
+
end
|
|
28
|
+
|
|
29
|
+
corrector = described_class.new(processed_source.buffer, [correction])
|
|
30
|
+
expect(corrector.rewrite).to eq 'true ;nil and false'
|
|
31
|
+
end
|
|
32
|
+
|
|
33
|
+
it 'allows insertion after a source range' do
|
|
34
|
+
source = 'true and false'
|
|
35
|
+
processed_source = parse_source(source)
|
|
36
|
+
|
|
37
|
+
correction = lambda do |corrector|
|
|
38
|
+
node = processed_source.ast
|
|
39
|
+
corrector.insert_after(node.loc.operator, ' nil;')
|
|
40
|
+
end
|
|
41
|
+
|
|
42
|
+
corrector = described_class.new(processed_source.buffer, [correction])
|
|
43
|
+
expect(corrector.rewrite).to eq 'true and nil; false'
|
|
44
|
+
end
|
|
45
|
+
|
|
46
|
+
it 'allows replacement of a range' do
|
|
47
|
+
source = 'true and false'
|
|
48
|
+
processed_source = parse_source(source)
|
|
49
|
+
|
|
50
|
+
correction = lambda do |corrector|
|
|
51
|
+
node = processed_source.ast
|
|
52
|
+
corrector.replace(node.loc.operator, 'or')
|
|
53
|
+
end
|
|
54
|
+
|
|
55
|
+
corrector = described_class.new(processed_source.buffer, [correction])
|
|
56
|
+
expect(corrector.rewrite).to eq 'true or false'
|
|
57
|
+
end
|
|
58
|
+
end
|
|
59
|
+
end
|
|
@@ -0,0 +1,113 @@
|
|
|
1
|
+
# encoding: utf-8
|
|
2
|
+
|
|
3
|
+
require 'spec_helper'
|
|
4
|
+
|
|
5
|
+
describe Rubocop::Cop::Lint::AmbiguousOperator do
|
|
6
|
+
subject(:cop) { described_class.new }
|
|
7
|
+
|
|
8
|
+
before do
|
|
9
|
+
inspect_source(cop, source)
|
|
10
|
+
end
|
|
11
|
+
|
|
12
|
+
context 'with a splat operator in the first argument' do
|
|
13
|
+
context 'without parentheses' do
|
|
14
|
+
context 'without whitespaces on the right of the operator' do
|
|
15
|
+
let(:source) do
|
|
16
|
+
[
|
|
17
|
+
'array = [1, 2, 3]',
|
|
18
|
+
'puts *array'
|
|
19
|
+
]
|
|
20
|
+
end
|
|
21
|
+
|
|
22
|
+
it 'registers an offence' do
|
|
23
|
+
expect(cop.offences.size).to eq(1)
|
|
24
|
+
expect(cop.offences.first.message).to eq(
|
|
25
|
+
'Ambiguous splat operator. ' \
|
|
26
|
+
"Parenthesize the method arguments if it's surely a splat " +
|
|
27
|
+
'operator, ' +
|
|
28
|
+
'or add a whitespace to the right of the * if it should be a ' +
|
|
29
|
+
'multiplication.'
|
|
30
|
+
)
|
|
31
|
+
expect(cop.highlights).to eq(['*'])
|
|
32
|
+
end
|
|
33
|
+
end
|
|
34
|
+
|
|
35
|
+
context 'with a whitespace on the right of the operator' do
|
|
36
|
+
let(:source) do
|
|
37
|
+
[
|
|
38
|
+
'array = [1, 2, 3]',
|
|
39
|
+
'puts * array'
|
|
40
|
+
]
|
|
41
|
+
end
|
|
42
|
+
|
|
43
|
+
it 'accepts' do
|
|
44
|
+
expect(cop.offences).to be_empty
|
|
45
|
+
end
|
|
46
|
+
end
|
|
47
|
+
end
|
|
48
|
+
|
|
49
|
+
context 'with parentheses' do
|
|
50
|
+
let(:source) do
|
|
51
|
+
[
|
|
52
|
+
'array = [1, 2, 3]',
|
|
53
|
+
'puts(*array)'
|
|
54
|
+
]
|
|
55
|
+
end
|
|
56
|
+
|
|
57
|
+
it 'accepts' do
|
|
58
|
+
expect(cop.offences).to be_empty
|
|
59
|
+
end
|
|
60
|
+
end
|
|
61
|
+
end
|
|
62
|
+
|
|
63
|
+
context 'with a block ampersand in the first argument' do
|
|
64
|
+
context 'without parentheses' do
|
|
65
|
+
context 'without whitespaces on the right of the operator' do
|
|
66
|
+
let(:source) do
|
|
67
|
+
[
|
|
68
|
+
'process = proc { do_something }',
|
|
69
|
+
'2.times &process'
|
|
70
|
+
]
|
|
71
|
+
end
|
|
72
|
+
|
|
73
|
+
it 'registers an offence' do
|
|
74
|
+
expect(cop.offences.size).to eq(1)
|
|
75
|
+
expect(cop.offences.first.message).to eq(
|
|
76
|
+
'Ambiguous block operator. ' \
|
|
77
|
+
"Parenthesize the method arguments if it's surely a block " +
|
|
78
|
+
'operator, ' +
|
|
79
|
+
'or add a whitespace to the right of the & if it should be a ' +
|
|
80
|
+
'binary AND.'
|
|
81
|
+
)
|
|
82
|
+
expect(cop.highlights).to eq(['&'])
|
|
83
|
+
end
|
|
84
|
+
end
|
|
85
|
+
|
|
86
|
+
context 'with a whitespace on the right of the operator' do
|
|
87
|
+
let(:source) do
|
|
88
|
+
[
|
|
89
|
+
'process = proc { do_something }',
|
|
90
|
+
'2.times & process'
|
|
91
|
+
]
|
|
92
|
+
end
|
|
93
|
+
|
|
94
|
+
it 'accepts' do
|
|
95
|
+
expect(cop.offences).to be_empty
|
|
96
|
+
end
|
|
97
|
+
end
|
|
98
|
+
end
|
|
99
|
+
|
|
100
|
+
context 'with parentheses' do
|
|
101
|
+
let(:source) do
|
|
102
|
+
[
|
|
103
|
+
'process = proc { do_something }',
|
|
104
|
+
'2.times(&process)'
|
|
105
|
+
]
|
|
106
|
+
end
|
|
107
|
+
|
|
108
|
+
it 'accepts' do
|
|
109
|
+
expect(cop.offences).to be_empty
|
|
110
|
+
end
|
|
111
|
+
end
|
|
112
|
+
end
|
|
113
|
+
end
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
# encoding: utf-8
|
|
2
|
+
|
|
3
|
+
require 'spec_helper'
|
|
4
|
+
|
|
5
|
+
describe Rubocop::Cop::Lint::AmbiguousRegexpLiteral do
|
|
6
|
+
subject(:cop) { described_class.new }
|
|
7
|
+
|
|
8
|
+
before do
|
|
9
|
+
inspect_source(cop, source)
|
|
10
|
+
end
|
|
11
|
+
|
|
12
|
+
context 'with a regexp literal in the first argument' do
|
|
13
|
+
context 'without parentheses' do
|
|
14
|
+
let(:source) { 'p /pattern/' }
|
|
15
|
+
|
|
16
|
+
it 'registers an offence' do
|
|
17
|
+
expect(cop.offences.size).to eq(1)
|
|
18
|
+
expect(cop.offences.first.message).to eq(
|
|
19
|
+
'Ambiguous regexp literal. Parenthesize the method arguments ' \
|
|
20
|
+
"if it's surely a regexp literal, or add a whitespace to the " +
|
|
21
|
+
'right of the / if it should be a division.'
|
|
22
|
+
)
|
|
23
|
+
expect(cop.highlights).to eq(['/'])
|
|
24
|
+
end
|
|
25
|
+
end
|
|
26
|
+
|
|
27
|
+
context 'with parentheses' do
|
|
28
|
+
let(:source) { 'p(/pattern/)' }
|
|
29
|
+
|
|
30
|
+
it 'accepts' do
|
|
31
|
+
expect(cop.offences).to be_empty
|
|
32
|
+
end
|
|
33
|
+
end
|
|
34
|
+
end
|
|
35
|
+
end
|