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
data/rubocop.gemspec
ADDED
@@ -0,0 +1,36 @@
|
|
1
|
+
# encoding: utf-8
|
2
|
+
|
3
|
+
$LOAD_PATH.unshift File.expand_path('../lib', __FILE__)
|
4
|
+
require 'rubocop/version'
|
5
|
+
require 'English'
|
6
|
+
|
7
|
+
Gem::Specification.new do |s|
|
8
|
+
s.name = 'sabat-rubocop'
|
9
|
+
s.version = Rubocop::Version::STRING
|
10
|
+
s.platform = Gem::Platform::RUBY
|
11
|
+
s.required_ruby_version = '>= 1.9.2'
|
12
|
+
s.authors = ['Bozhidar Batsov']
|
13
|
+
s.description = <<-EOF
|
14
|
+
Automatic Ruby code style checking tool.
|
15
|
+
Aims to enforce the community-driven Ruby Style Guide.
|
16
|
+
EOF
|
17
|
+
|
18
|
+
s.email = 'bozhidar@batsov.com'
|
19
|
+
s.files = `git ls-files`.split($RS)
|
20
|
+
s.test_files = s.files.grep(/^spec\//)
|
21
|
+
s.executables = s.files.grep(/^bin\//) { |f| File.basename(f) }
|
22
|
+
s.extra_rdoc_files = ['LICENSE.txt', 'README.md']
|
23
|
+
s.homepage = 'http://github.com/sabat/rubocop'
|
24
|
+
s.licenses = ['MIT']
|
25
|
+
s.require_paths = ['lib']
|
26
|
+
s.rubygems_version = '1.8.23'
|
27
|
+
s.summary = 'Automatic Ruby code style checking tool.'
|
28
|
+
|
29
|
+
s.add_runtime_dependency('rainbow', '>= 1.1.4')
|
30
|
+
s.add_runtime_dependency('parser', '2.0.0.beta9')
|
31
|
+
s.add_development_dependency('rake', '~> 10.0')
|
32
|
+
s.add_development_dependency('rspec', '~> 2.13')
|
33
|
+
s.add_development_dependency('yard', '~> 0.8')
|
34
|
+
s.add_development_dependency('bundler', '~> 1.3')
|
35
|
+
s.add_development_dependency('simplecov', '~> 0.7')
|
36
|
+
end
|
data/spec/.rubocop.yml
ADDED
@@ -0,0 +1,24 @@
|
|
1
|
+
# encoding: utf-8
|
2
|
+
|
3
|
+
require 'spec_helper'
|
4
|
+
|
5
|
+
describe 'RuboCop Project' do
|
6
|
+
describe 'default configuration file' do
|
7
|
+
it 'has configuration for all cops' do
|
8
|
+
cop_names = Rubocop::Cop::Cop.all.map(&:cop_name)
|
9
|
+
expect(Rubocop::Config.load_file('config/default.yml').keys.sort)
|
10
|
+
.to eq((['AllCops'] + cop_names).sort)
|
11
|
+
end
|
12
|
+
end
|
13
|
+
|
14
|
+
describe 'source codes' do
|
15
|
+
before { $stdout = StringIO.new }
|
16
|
+
after { $stdout = STDOUT }
|
17
|
+
|
18
|
+
it 'has no violations' do
|
19
|
+
# Need to pass an empty array explicitly
|
20
|
+
# so that the CLI does not refer arguments of `rspec`
|
21
|
+
expect(Rubocop::CLI.new.run([])).to eq(0)
|
22
|
+
end
|
23
|
+
end
|
24
|
+
end
|
@@ -0,0 +1,906 @@
|
|
1
|
+
# encoding: utf-8
|
2
|
+
|
3
|
+
require 'fileutils'
|
4
|
+
require 'tmpdir'
|
5
|
+
require 'spec_helper'
|
6
|
+
|
7
|
+
module Rubocop
|
8
|
+
describe CLI, :isolated_environment do
|
9
|
+
include FileHelper
|
10
|
+
|
11
|
+
let(:cli) { CLI.new }
|
12
|
+
|
13
|
+
before(:each) do
|
14
|
+
$stdout = StringIO.new
|
15
|
+
$stderr = StringIO.new
|
16
|
+
end
|
17
|
+
|
18
|
+
after(:each) do
|
19
|
+
$stdout = STDOUT
|
20
|
+
$stderr = STDERR
|
21
|
+
end
|
22
|
+
|
23
|
+
def abs(path)
|
24
|
+
File.expand_path(path)
|
25
|
+
end
|
26
|
+
|
27
|
+
it 'exits cleanly when -h is used' do
|
28
|
+
expect { cli.run ['-h'] }.to exit_with_code(0)
|
29
|
+
expect { cli.run ['--help'] }.to exit_with_code(0)
|
30
|
+
message = <<-END
|
31
|
+
Usage: rubocop [options] [file1, file2, ...]
|
32
|
+
-d, --debug Display debug info.
|
33
|
+
-L, --list-cops List class name of cops.
|
34
|
+
-c, --config FILE Specify configuration file.
|
35
|
+
--only COP Run just one cop.
|
36
|
+
-f, --format FORMATTER Choose an output formatter. This option
|
37
|
+
can be specified multiple times to enable
|
38
|
+
multiple formatters at the same time.
|
39
|
+
[p]rogress (default)
|
40
|
+
[s]imple
|
41
|
+
[c]lang
|
42
|
+
[e]macs
|
43
|
+
[j]son
|
44
|
+
custom formatter class name
|
45
|
+
-o, --out FILE Write output to a file instead of STDOUT.
|
46
|
+
This option applies to the previously
|
47
|
+
specified --format, or the default format
|
48
|
+
if no format is specified.
|
49
|
+
-r, --require FILE Require Ruby file.
|
50
|
+
-R, --rails Run extra Rails cops.
|
51
|
+
-l, --lint Run only lint cops.
|
52
|
+
-a, --auto-correct Auto-correct offences.
|
53
|
+
-s, --silent Silence summary.
|
54
|
+
-n, --no-color Disable color output.
|
55
|
+
-v, --version Display version.
|
56
|
+
-V, --verbose-version Display verbose version.
|
57
|
+
END
|
58
|
+
expect($stdout.string).to eq(message * 2)
|
59
|
+
end
|
60
|
+
|
61
|
+
it 'exits cleanly when -v is used' do
|
62
|
+
expect { cli.run ['-v'] }.to exit_with_code(0)
|
63
|
+
expect { cli.run ['--version'] }.to exit_with_code(0)
|
64
|
+
expect($stdout.string).to eq((Rubocop::Version::STRING + "\n") * 2)
|
65
|
+
end
|
66
|
+
|
67
|
+
describe '#wants_to_quit?' do
|
68
|
+
it 'is initially false' do
|
69
|
+
expect(cli.wants_to_quit?).to be_false
|
70
|
+
end
|
71
|
+
end
|
72
|
+
|
73
|
+
describe '#trap_interrupt' do
|
74
|
+
before do
|
75
|
+
@interrupt_handlers = []
|
76
|
+
Signal.stub(:trap).with('INT') do |&block|
|
77
|
+
@interrupt_handlers << block
|
78
|
+
end
|
79
|
+
end
|
80
|
+
|
81
|
+
def interrupt
|
82
|
+
@interrupt_handlers.each(&:call)
|
83
|
+
end
|
84
|
+
|
85
|
+
it 'adds a handler for SIGINT' do
|
86
|
+
expect(@interrupt_handlers).to be_empty
|
87
|
+
cli.trap_interrupt
|
88
|
+
expect(@interrupt_handlers).to have(1).item
|
89
|
+
end
|
90
|
+
|
91
|
+
context 'with SIGINT once' do
|
92
|
+
it 'sets #wants_to_quit? to true' do
|
93
|
+
cli.trap_interrupt
|
94
|
+
expect(cli.wants_to_quit?).to be_false
|
95
|
+
interrupt
|
96
|
+
expect(cli.wants_to_quit?).to be_true
|
97
|
+
end
|
98
|
+
|
99
|
+
it 'does not exit immediately' do
|
100
|
+
Object.any_instance.should_not_receive(:exit)
|
101
|
+
Object.any_instance.should_not_receive(:exit!)
|
102
|
+
cli.trap_interrupt
|
103
|
+
interrupt
|
104
|
+
end
|
105
|
+
end
|
106
|
+
|
107
|
+
context 'with SIGINT twice' do
|
108
|
+
it 'exits immediately' do
|
109
|
+
Object.any_instance.should_receive(:exit!).with(1)
|
110
|
+
cli.trap_interrupt
|
111
|
+
interrupt
|
112
|
+
interrupt
|
113
|
+
end
|
114
|
+
end
|
115
|
+
end
|
116
|
+
|
117
|
+
context 'when #wants_to_quit? is true' do
|
118
|
+
it 'returns 1' do
|
119
|
+
create_file('example.rb', '# encoding: utf-8')
|
120
|
+
cli.wants_to_quit = true
|
121
|
+
expect(cli.run(['example.rb'])).to eq(1)
|
122
|
+
end
|
123
|
+
end
|
124
|
+
|
125
|
+
it 'checks a given correct file and returns 0' do
|
126
|
+
create_file('example.rb', [
|
127
|
+
'# encoding: utf-8',
|
128
|
+
'x = 0',
|
129
|
+
'puts x'
|
130
|
+
])
|
131
|
+
expect(cli.run(['--format', 'simple', 'example.rb'])).to eq(0)
|
132
|
+
expect($stdout.string)
|
133
|
+
.to eq("\n1 file inspected, no offences detected\n")
|
134
|
+
end
|
135
|
+
|
136
|
+
it 'checks a given file with faults and returns 1' do
|
137
|
+
create_file('example.rb', [
|
138
|
+
'# encoding: utf-8',
|
139
|
+
'x = 0 ',
|
140
|
+
'puts x'
|
141
|
+
])
|
142
|
+
expect(cli.run(['--format', 'simple', 'example.rb'])).to eq(1)
|
143
|
+
expect($stdout.string)
|
144
|
+
.to eq ['== example.rb ==',
|
145
|
+
'C: 2: 6: Trailing whitespace detected.',
|
146
|
+
'',
|
147
|
+
'1 file inspected, 1 offence detected',
|
148
|
+
''].join("\n")
|
149
|
+
end
|
150
|
+
|
151
|
+
it 'can report in emacs style', ruby: 1.9 do
|
152
|
+
create_file('example1.rb', [
|
153
|
+
'x= 0 ',
|
154
|
+
'y ',
|
155
|
+
'puts x'
|
156
|
+
])
|
157
|
+
create_file('example2.rb', [
|
158
|
+
"\tx = 0",
|
159
|
+
'puts x'
|
160
|
+
])
|
161
|
+
expect(cli.run(['--format', 'emacs', 'example1.rb', 'example2.rb']))
|
162
|
+
.to eq(1)
|
163
|
+
expect($stdout.string)
|
164
|
+
.to eq(
|
165
|
+
["#{abs('example1.rb')}:1:1: C: Missing utf-8 encoding comment.",
|
166
|
+
"#{abs('example1.rb')}:1:2: C: Surrounding space missing" +
|
167
|
+
" for operator '='.",
|
168
|
+
"#{abs('example1.rb')}:1:5: C: Trailing whitespace detected.",
|
169
|
+
"#{abs('example1.rb')}:2:2: C: Trailing whitespace detected.",
|
170
|
+
"#{abs('example2.rb')}:1:1: C: Missing utf-8 encoding comment.",
|
171
|
+
"#{abs('example2.rb')}:1:1: C: Tab detected.",
|
172
|
+
'',
|
173
|
+
'2 files inspected, 6 offences detected',
|
174
|
+
''].join("\n"))
|
175
|
+
end
|
176
|
+
|
177
|
+
it 'can report in emacs style', ruby: 2.0 do
|
178
|
+
create_file('example1.rb', [
|
179
|
+
'x= 0 ',
|
180
|
+
'y ',
|
181
|
+
'puts x'
|
182
|
+
])
|
183
|
+
create_file('example2.rb', [
|
184
|
+
"\tx = 0",
|
185
|
+
'puts x'
|
186
|
+
])
|
187
|
+
expect(cli.run(['--format', 'emacs', 'example1.rb', 'example2.rb']))
|
188
|
+
.to eq(1)
|
189
|
+
expect($stdout.string)
|
190
|
+
.to eq(
|
191
|
+
["#{abs('example1.rb')}:1:2: C: Surrounding space missing" +
|
192
|
+
" for operator '='.",
|
193
|
+
"#{abs('example1.rb')}:1:5: C: Trailing whitespace detected.",
|
194
|
+
"#{abs('example1.rb')}:2:2: C: Trailing whitespace detected.",
|
195
|
+
"#{abs('example2.rb')}:1:1: C: Tab detected.",
|
196
|
+
'',
|
197
|
+
'2 files inspected, 4 offences detected',
|
198
|
+
''].join("\n"))
|
199
|
+
end
|
200
|
+
|
201
|
+
it 'can report in clang style' do
|
202
|
+
create_file('example1.rb', ['# encoding: utf-8',
|
203
|
+
'x= 0 ',
|
204
|
+
'#' * 85,
|
205
|
+
'y ',
|
206
|
+
'puts x'])
|
207
|
+
create_file('example2.rb', ['# encoding: utf-8',
|
208
|
+
"\tx = 0",
|
209
|
+
'puts x'])
|
210
|
+
expect(cli.run(['--format', 'clang', 'example1.rb', 'example2.rb']))
|
211
|
+
.to eq(1)
|
212
|
+
expect($stdout.string)
|
213
|
+
.to eq(['example1.rb:2:2: C: Surrounding space missing for operator ' +
|
214
|
+
"'='.",
|
215
|
+
'x= 0 ',
|
216
|
+
' ^',
|
217
|
+
'example1.rb:2:5: C: Trailing whitespace detected.',
|
218
|
+
'x= 0 ',
|
219
|
+
' ^',
|
220
|
+
'example1.rb:3:80: C: Line is too long. [85/79]',
|
221
|
+
'###########################################################' +
|
222
|
+
'##########################',
|
223
|
+
' ' +
|
224
|
+
' ^^^^^^',
|
225
|
+
'example1.rb:4:2: C: Trailing whitespace detected.',
|
226
|
+
'y ',
|
227
|
+
' ^',
|
228
|
+
'example2.rb:2:1: C: Tab detected.',
|
229
|
+
"\tx = 0",
|
230
|
+
'^',
|
231
|
+
'',
|
232
|
+
'2 files inspected, 5 offences detected',
|
233
|
+
''].join("\n"))
|
234
|
+
end
|
235
|
+
|
236
|
+
it 'runs just one cop if --only is passed' do
|
237
|
+
create_file('example.rb', ['if x== 0 ',
|
238
|
+
"\ty",
|
239
|
+
'end'])
|
240
|
+
# IfUnlessModifier depends on the configuration of LineLength.
|
241
|
+
# That configuration might have been set by other spec examples
|
242
|
+
# so we reset it to emulate a start from scratch.
|
243
|
+
Cop::Style::LineLength.config = nil
|
244
|
+
|
245
|
+
expect(cli.run(['--format', 'simple',
|
246
|
+
'--only', 'IfUnlessModifier', 'example.rb'])).to eq(1)
|
247
|
+
expect($stdout.string)
|
248
|
+
.to eq(['== example.rb ==',
|
249
|
+
'C: 1: 1: Favor modifier if/unless usage when you have a ' +
|
250
|
+
'single-line body. Another good alternative is the usage of ' +
|
251
|
+
'control flow &&/||.',
|
252
|
+
'',
|
253
|
+
'1 file inspected, 1 offence detected',
|
254
|
+
''].join("\n"))
|
255
|
+
end
|
256
|
+
|
257
|
+
it 'runs only lint cops if --lint is passed' do
|
258
|
+
# FIXME state seems to be leaking here
|
259
|
+
pending
|
260
|
+
create_file('example.rb', ['if 0 ',
|
261
|
+
"\ty",
|
262
|
+
'end'])
|
263
|
+
# IfUnlessModifier depends on the configuration of LineLength.
|
264
|
+
# That configuration might have been set by other spec examples
|
265
|
+
# so we reset it to emulate a start from scratch.
|
266
|
+
Cop::Style::LineLength.config = nil
|
267
|
+
|
268
|
+
expect(cli.run(['--format', 'simple', '--lint', 'example.rb'])).to eq(1)
|
269
|
+
expect($stdout.string)
|
270
|
+
.to eq(['== example.rb ==',
|
271
|
+
'W: 1: 4: Literal 0 appeared in a condition.',
|
272
|
+
'',
|
273
|
+
'1 file inspected, 1 offence detected',
|
274
|
+
''].join("\n"))
|
275
|
+
|
276
|
+
end
|
277
|
+
|
278
|
+
it 'exits with error if an incorrect cop name is passed to --only' do
|
279
|
+
expect(cli.run(%w(--only 123))).to eq(1)
|
280
|
+
|
281
|
+
expect($stderr.string).to eq("Unrecognized cop name: 123.\n")
|
282
|
+
end
|
283
|
+
|
284
|
+
it 'ommits summary when --silent passed', ruby: 1.9 do
|
285
|
+
create_file('example1.rb', 'puts 0 ')
|
286
|
+
create_file('example2.rb', "\tputs 0")
|
287
|
+
expect(cli.run(['--format',
|
288
|
+
'emacs',
|
289
|
+
'--silent',
|
290
|
+
'example1.rb',
|
291
|
+
'example2.rb'])).to eq(1)
|
292
|
+
expect($stdout.string).to eq(
|
293
|
+
["#{abs('example1.rb')}:1:1: C: Missing utf-8 encoding comment.",
|
294
|
+
"#{abs('example1.rb')}:1:7: C: Trailing whitespace detected.",
|
295
|
+
"#{abs('example2.rb')}:1:1: C: Missing utf-8 encoding comment.",
|
296
|
+
"#{abs('example2.rb')}:1:1: C: Tab detected.",
|
297
|
+
''].join("\n"))
|
298
|
+
end
|
299
|
+
|
300
|
+
it 'ommits summary when --silent passed', ruby: 2.0 do
|
301
|
+
create_file('example1.rb', 'puts 0 ')
|
302
|
+
create_file('example2.rb', "\tputs 0")
|
303
|
+
expect(cli.run(['--format',
|
304
|
+
'emacs',
|
305
|
+
'--silent',
|
306
|
+
'example1.rb',
|
307
|
+
'example2.rb'])).to eq(1)
|
308
|
+
expect($stdout.string).to eq(
|
309
|
+
["#{abs('example1.rb')}:1:7: C: Trailing whitespace detected.",
|
310
|
+
"#{abs('example2.rb')}:1:1: C: Tab detected.",
|
311
|
+
''].join("\n"))
|
312
|
+
end
|
313
|
+
|
314
|
+
it 'shows cop names when --debug is passed', ruby: 2.0 do
|
315
|
+
create_file('example1.rb', "\tputs 0")
|
316
|
+
expect(cli.run(['--format',
|
317
|
+
'emacs',
|
318
|
+
'--silent',
|
319
|
+
'--debug',
|
320
|
+
'example1.rb'])).to eq(1)
|
321
|
+
expect($stdout.string.lines[-1]).to eq(
|
322
|
+
["#{abs('example1.rb')}:1:1: C: Tab: Tab detected.",
|
323
|
+
''].join("\n"))
|
324
|
+
end
|
325
|
+
|
326
|
+
it 'shows cop names when --list-cops is passed', ruby: 2.0 do
|
327
|
+
create_file('example1.rb', "\tputs 0")
|
328
|
+
expect(cli.run(['--format',
|
329
|
+
'emacs',
|
330
|
+
'--silent',
|
331
|
+
'--list-cops',
|
332
|
+
'example1.rb'])).to eq(1)
|
333
|
+
expect($stdout.string.lines[-1]).to eq(
|
334
|
+
["#{abs('example1.rb')}:1:1: C: Tab: Tab detected.",
|
335
|
+
''].join("\n"))
|
336
|
+
end
|
337
|
+
|
338
|
+
it 'can be configured with option to disable a certain error' do
|
339
|
+
create_file('example1.rb', 'puts 0 ')
|
340
|
+
create_file('rubocop.yml', [
|
341
|
+
'Encoding:',
|
342
|
+
' Enabled: false',
|
343
|
+
'',
|
344
|
+
'CaseIndentation:',
|
345
|
+
' Enabled: false'
|
346
|
+
])
|
347
|
+
expect(cli.run(['--format', 'simple',
|
348
|
+
'-c', 'rubocop.yml', 'example1.rb'])).to eq(1)
|
349
|
+
expect($stdout.string).to eq(
|
350
|
+
['== example1.rb ==',
|
351
|
+
'C: 1: 7: Trailing whitespace detected.',
|
352
|
+
'',
|
353
|
+
'1 file inspected, 1 offence detected',
|
354
|
+
''].join("\n"))
|
355
|
+
end
|
356
|
+
|
357
|
+
it 'works when a cop that others depend on is disabled' do
|
358
|
+
create_file('example1.rb', ['if a',
|
359
|
+
' b',
|
360
|
+
'end'])
|
361
|
+
create_file('rubocop.yml', [
|
362
|
+
'Encoding:',
|
363
|
+
' Enabled: false',
|
364
|
+
'',
|
365
|
+
'LineLength:',
|
366
|
+
' Enabled: false'
|
367
|
+
])
|
368
|
+
result = cli.run(['--format', 'simple',
|
369
|
+
'-c', 'rubocop.yml', 'example1.rb'])
|
370
|
+
expect($stdout.string).to eq(
|
371
|
+
['== example1.rb ==',
|
372
|
+
'C: 1: 1: Favor modifier if/unless usage when you have a ' +
|
373
|
+
'single-line body. Another good alternative is the usage of ' +
|
374
|
+
'control flow &&/||.',
|
375
|
+
'',
|
376
|
+
'1 file inspected, 1 offence detected',
|
377
|
+
''].join("\n"))
|
378
|
+
expect(result).to eq(1)
|
379
|
+
end
|
380
|
+
|
381
|
+
it 'can be configured with project config to disable a certain error' do
|
382
|
+
create_file('example_src/example1.rb', 'puts 0 ')
|
383
|
+
create_file('example_src/.rubocop.yml', [
|
384
|
+
'Encoding:',
|
385
|
+
' Enabled: false',
|
386
|
+
'',
|
387
|
+
'CaseIndentation:',
|
388
|
+
' Enabled: false'
|
389
|
+
])
|
390
|
+
expect(cli.run(['--format', 'simple',
|
391
|
+
'example_src/example1.rb'])).to eq(1)
|
392
|
+
expect($stdout.string).to eq(
|
393
|
+
['== example_src/example1.rb ==',
|
394
|
+
'C: 1: 7: Trailing whitespace detected.',
|
395
|
+
'',
|
396
|
+
'1 file inspected, 1 offence detected',
|
397
|
+
''].join("\n"))
|
398
|
+
end
|
399
|
+
|
400
|
+
it 'can use an alternative max line length from a config file' do
|
401
|
+
create_file('example_src/example1.rb', [
|
402
|
+
'# encoding: utf-8',
|
403
|
+
'#' * 90
|
404
|
+
])
|
405
|
+
create_file('example_src/.rubocop.yml', [
|
406
|
+
'LineLength:',
|
407
|
+
' Enabled: true',
|
408
|
+
' Max: 100'
|
409
|
+
])
|
410
|
+
expect(cli.run(['--format', 'simple',
|
411
|
+
'example_src/example1.rb'])).to eq(0)
|
412
|
+
expect($stdout.string).to eq(
|
413
|
+
['', '1 file inspected, no offences detected',
|
414
|
+
''].join("\n"))
|
415
|
+
end
|
416
|
+
|
417
|
+
it 'can have different config files in different directories' do
|
418
|
+
%w(src lib).each do |dir|
|
419
|
+
create_file("example/#{dir}/example1.rb", [
|
420
|
+
'# encoding: utf-8',
|
421
|
+
'#' * 90
|
422
|
+
])
|
423
|
+
end
|
424
|
+
create_file('example/src/.rubocop.yml', [
|
425
|
+
'LineLength:',
|
426
|
+
' Enabled: true',
|
427
|
+
' Max: 100'
|
428
|
+
])
|
429
|
+
expect(cli.run(%w(--format simple example))).to eq(1)
|
430
|
+
expect($stdout.string).to eq(
|
431
|
+
['== example/lib/example1.rb ==',
|
432
|
+
'C: 2: 80: Line is too long. [90/79]',
|
433
|
+
'',
|
434
|
+
'2 files inspected, 1 offence detected',
|
435
|
+
''].join("\n"))
|
436
|
+
end
|
437
|
+
|
438
|
+
it 'prefers a config file in ancestor directory to another in home' do
|
439
|
+
create_file('example_src/example1.rb', [
|
440
|
+
'# encoding: utf-8',
|
441
|
+
'#' * 90
|
442
|
+
])
|
443
|
+
create_file('example_src/.rubocop.yml', [
|
444
|
+
'LineLength:',
|
445
|
+
' Enabled: true',
|
446
|
+
' Max: 100'
|
447
|
+
])
|
448
|
+
create_file("#{Dir.home}/.rubocop.yml", [
|
449
|
+
'LineLength:',
|
450
|
+
' Enabled: true',
|
451
|
+
' Max: 80'
|
452
|
+
])
|
453
|
+
expect(cli.run(['--format', 'simple',
|
454
|
+
'example_src/example1.rb'])).to eq(0)
|
455
|
+
expect($stdout.string).to eq(
|
456
|
+
['', '1 file inspected, no offences detected',
|
457
|
+
''].join("\n"))
|
458
|
+
end
|
459
|
+
|
460
|
+
it 'can exclude directories relative to .rubocop.yml' do
|
461
|
+
%w(src etc/test etc/spec tmp/test tmp/spec).each do |dir|
|
462
|
+
create_file("example/#{dir}/example1.rb", [
|
463
|
+
'# encoding: utf-8',
|
464
|
+
'#' * 90
|
465
|
+
])
|
466
|
+
end
|
467
|
+
|
468
|
+
create_file('example/.rubocop.yml', [
|
469
|
+
'AllCops:',
|
470
|
+
' Excludes:',
|
471
|
+
' - src/**',
|
472
|
+
' - etc/**',
|
473
|
+
' - tmp/spec/**'
|
474
|
+
])
|
475
|
+
|
476
|
+
expect(cli.run(%w(--format simple example))).to eq(1)
|
477
|
+
expect($stdout.string).to eq(
|
478
|
+
['== example/tmp/test/example1.rb ==',
|
479
|
+
'C: 2: 80: Line is too long. [90/79]',
|
480
|
+
'',
|
481
|
+
'1 file inspected, 1 offence detected',
|
482
|
+
''].join("\n"))
|
483
|
+
end
|
484
|
+
|
485
|
+
it 'prints a warning for an unrecognized cop name in .rubocop.yml' do
|
486
|
+
create_file('example/example1.rb', [
|
487
|
+
'# encoding: utf-8',
|
488
|
+
'#' * 90
|
489
|
+
])
|
490
|
+
|
491
|
+
create_file('example/.rubocop.yml', [
|
492
|
+
'LyneLenth:',
|
493
|
+
' Enabled: true',
|
494
|
+
' Max: 100'
|
495
|
+
])
|
496
|
+
|
497
|
+
expect(cli.run(%w(--format simple example))).to eq(1)
|
498
|
+
expect($stdout.string).to eq(
|
499
|
+
['Warning: unrecognized cop LyneLenth found in ' +
|
500
|
+
File.expand_path('example/.rubocop.yml'),
|
501
|
+
'== example/example1.rb ==',
|
502
|
+
'C: 2: 80: Line is too long. [90/79]',
|
503
|
+
'',
|
504
|
+
'1 file inspected, 1 offence detected',
|
505
|
+
''].join("\n"))
|
506
|
+
end
|
507
|
+
|
508
|
+
it 'prints a warning for an unrecognized configuration parameter' do
|
509
|
+
create_file('example/example1.rb', [
|
510
|
+
'# encoding: utf-8',
|
511
|
+
'#' * 90
|
512
|
+
])
|
513
|
+
|
514
|
+
create_file('example/.rubocop.yml', [
|
515
|
+
'LineLength:',
|
516
|
+
' Enabled: true',
|
517
|
+
' Min: 10'
|
518
|
+
])
|
519
|
+
|
520
|
+
expect(cli.run(%w(--format simple example))).to eq(1)
|
521
|
+
expect($stdout.string).to eq(
|
522
|
+
['Warning: unrecognized parameter LineLength:Min found in ' +
|
523
|
+
File.expand_path('example/.rubocop.yml'),
|
524
|
+
'== example/example1.rb ==',
|
525
|
+
'C: 2: 80: Line is too long. [90/79]',
|
526
|
+
'',
|
527
|
+
'1 file inspected, 1 offence detected',
|
528
|
+
''].join("\n"))
|
529
|
+
end
|
530
|
+
|
531
|
+
it 'registers an offence for a syntax error' do
|
532
|
+
create_file('example.rb', [
|
533
|
+
'# encoding: utf-8',
|
534
|
+
'class Test',
|
535
|
+
'en'
|
536
|
+
])
|
537
|
+
expect(cli.run(['--format', 'emacs', 'example.rb'])).to eq(1)
|
538
|
+
expect($stdout.string)
|
539
|
+
.to eq(["#{abs('example.rb')}:3:3: E: unexpected " +
|
540
|
+
'token $end',
|
541
|
+
'',
|
542
|
+
'1 file inspected, 1 offence detected',
|
543
|
+
''].join("\n"))
|
544
|
+
end
|
545
|
+
|
546
|
+
it 'registers an offence for Parser warnings' do
|
547
|
+
create_file('example.rb', [
|
548
|
+
'# encoding: utf-8',
|
549
|
+
'puts *test'
|
550
|
+
])
|
551
|
+
expect(cli.run(['--format', 'emacs', 'example.rb'])).to eq(1)
|
552
|
+
expect($stdout.string)
|
553
|
+
.to eq(["#{abs('example.rb')}:2:6: W: " +
|
554
|
+
"`*' interpreted as argument prefix",
|
555
|
+
'',
|
556
|
+
'1 file inspected, 1 offence detected',
|
557
|
+
''].join("\n"))
|
558
|
+
end
|
559
|
+
|
560
|
+
it 'can process a file with an invalid UTF-8 byte sequence' do
|
561
|
+
create_file('example.rb', [
|
562
|
+
'# encoding: utf-8',
|
563
|
+
"# #{'f9'.hex.chr}#{'29'.hex.chr}"
|
564
|
+
])
|
565
|
+
expect(cli.run(['--format', 'emacs', 'example.rb'])).to eq(0)
|
566
|
+
end
|
567
|
+
|
568
|
+
it 'can have all cops disabled in a code section' do
|
569
|
+
create_file('example.rb', [
|
570
|
+
'# encoding: utf-8',
|
571
|
+
'# rubocop:disable all',
|
572
|
+
'#' * 90,
|
573
|
+
'x(123456)',
|
574
|
+
'y("123")',
|
575
|
+
'def func',
|
576
|
+
' # rubocop: enable LineLength, StringLiterals',
|
577
|
+
' ' + '#' * 93,
|
578
|
+
' x(123456)',
|
579
|
+
' y("123")',
|
580
|
+
'end'
|
581
|
+
])
|
582
|
+
expect(cli.run(['--format', 'emacs', 'example.rb'])).to eq(1)
|
583
|
+
# all cops were disabled, then 2 were enabled again, so we
|
584
|
+
# should get 2 offences reported.
|
585
|
+
expect($stdout.string).to eq(
|
586
|
+
["#{abs('example.rb')}:8:80: C: Line is too long. [95/79]",
|
587
|
+
"#{abs('example.rb')}:10:5: C: Prefer single-quoted strings when " +
|
588
|
+
"you don't need string interpolation or special symbols.",
|
589
|
+
'',
|
590
|
+
'1 file inspected, 2 offences detected',
|
591
|
+
''].join("\n"))
|
592
|
+
end
|
593
|
+
|
594
|
+
it 'can have selected cops disabled in a code section' do
|
595
|
+
create_file('example.rb', [
|
596
|
+
'# encoding: utf-8',
|
597
|
+
'# rubocop:disable LineLength,NumericLiterals,StringLiterals',
|
598
|
+
'#' * 90,
|
599
|
+
'x(123456)',
|
600
|
+
'y("123")',
|
601
|
+
'def func',
|
602
|
+
' # rubocop: enable LineLength, StringLiterals',
|
603
|
+
' ' + '#' * 93,
|
604
|
+
' x(123456)',
|
605
|
+
' y("123")',
|
606
|
+
'end'
|
607
|
+
])
|
608
|
+
expect(cli.run(['--format', 'emacs', 'example.rb'])).to eq(1)
|
609
|
+
# 3 cops were disabled, then 2 were enabled again, so we
|
610
|
+
# should get 2 offences reported.
|
611
|
+
expect($stdout.string).to eq(
|
612
|
+
["#{abs('example.rb')}:8:80: C: Line is too long. [95/79]",
|
613
|
+
"#{abs('example.rb')}:10:5: C: Prefer single-quoted strings when " +
|
614
|
+
"you don't need string interpolation or special symbols.",
|
615
|
+
'',
|
616
|
+
'1 file inspected, 2 offences detected',
|
617
|
+
''].join("\n"))
|
618
|
+
end
|
619
|
+
|
620
|
+
it 'can have all cops disabled on a single line' do
|
621
|
+
create_file('example.rb', [
|
622
|
+
'# encoding: utf-8',
|
623
|
+
'y("123", 123456) # rubocop:disable all'
|
624
|
+
])
|
625
|
+
expect(cli.run(['--format', 'emacs', 'example.rb'])).to eq(0)
|
626
|
+
expect($stdout.string).to eq(
|
627
|
+
['',
|
628
|
+
'1 file inspected, no offences detected',
|
629
|
+
''].join("\n"))
|
630
|
+
end
|
631
|
+
|
632
|
+
it 'can have selected cops disabled on a single line' do
|
633
|
+
create_file('example.rb', [
|
634
|
+
'# encoding: utf-8',
|
635
|
+
'#' * 90 + ' # rubocop:disable LineLength',
|
636
|
+
'#' * 95,
|
637
|
+
'y("123") # rubocop:disable LineLength,StringLiterals'
|
638
|
+
])
|
639
|
+
expect(cli.run(['--format', 'emacs', 'example.rb'])).to eq(1)
|
640
|
+
expect($stdout.string).to eq(
|
641
|
+
["#{abs('example.rb')}:3:80: C: Line is too long. [95/79]",
|
642
|
+
'',
|
643
|
+
'1 file inspected, 1 offence detected',
|
644
|
+
''].join("\n"))
|
645
|
+
end
|
646
|
+
|
647
|
+
it 'finds a file with no .rb extension but has a shebang line' do
|
648
|
+
create_file('example', [
|
649
|
+
'#!/usr/bin/env ruby',
|
650
|
+
'# encoding: utf-8',
|
651
|
+
'x = 0',
|
652
|
+
'puts x'
|
653
|
+
])
|
654
|
+
expect(cli.run(%w(--format simple))).to eq(0)
|
655
|
+
expect($stdout.string).to eq(
|
656
|
+
['', '1 file inspected, no offences detected',
|
657
|
+
''].join("\n"))
|
658
|
+
end
|
659
|
+
|
660
|
+
it 'finds included files' do
|
661
|
+
create_file('example', [
|
662
|
+
'# encoding: utf-8',
|
663
|
+
'x = 0',
|
664
|
+
'puts x'
|
665
|
+
])
|
666
|
+
create_file('regexp', [
|
667
|
+
'# encoding: utf-8',
|
668
|
+
'x = 0',
|
669
|
+
'puts x'
|
670
|
+
])
|
671
|
+
create_file('.rubocop.yml', [
|
672
|
+
'AllCops:',
|
673
|
+
' Includes:',
|
674
|
+
' - example',
|
675
|
+
' - !ruby/regexp /regexp$/'
|
676
|
+
])
|
677
|
+
expect(cli.run(%w(--format simple))).to eq(0)
|
678
|
+
expect($stdout.string).to eq(
|
679
|
+
['', '2 files inspected, no offences detected',
|
680
|
+
''].join("\n"))
|
681
|
+
end
|
682
|
+
|
683
|
+
it 'ignores excluded files' do
|
684
|
+
create_file('example.rb', [
|
685
|
+
'# encoding: utf-8',
|
686
|
+
'x = 0',
|
687
|
+
'puts x'
|
688
|
+
])
|
689
|
+
create_file('regexp.rb', [
|
690
|
+
'# encoding: utf-8',
|
691
|
+
'x = 0',
|
692
|
+
'puts x'
|
693
|
+
])
|
694
|
+
create_file('exclude_glob.rb', [
|
695
|
+
'#!/usr/bin/env ruby',
|
696
|
+
'# encoding: utf-8',
|
697
|
+
'x = 0',
|
698
|
+
'puts x'
|
699
|
+
])
|
700
|
+
create_file('.rubocop.yml', [
|
701
|
+
'AllCops:',
|
702
|
+
' Excludes:',
|
703
|
+
' - example.rb',
|
704
|
+
' - !ruby/regexp /regexp.rb$/',
|
705
|
+
' - "exclude_*"'
|
706
|
+
])
|
707
|
+
expect(cli.run(%w(--format simple))).to eq(0)
|
708
|
+
expect($stdout.string).to eq(
|
709
|
+
['', '0 files inspected, no offences detected',
|
710
|
+
''].join("\n"))
|
711
|
+
end
|
712
|
+
|
713
|
+
# With rubinius 2.0.0.rc1 + rspec 2.13.1,
|
714
|
+
# File.stub(:open).and_call_original causes SystemStackError.
|
715
|
+
it 'does not read files in excluded list', broken: :rbx do
|
716
|
+
%w(rb.rb non-rb.ext without-ext).each do |filename|
|
717
|
+
create_file("example/ignored/#{filename}", [
|
718
|
+
'# encoding: utf-8',
|
719
|
+
'#' * 90
|
720
|
+
])
|
721
|
+
end
|
722
|
+
|
723
|
+
create_file('example/.rubocop.yml', [
|
724
|
+
'AllCops:',
|
725
|
+
' Excludes:',
|
726
|
+
' - ignored/**',
|
727
|
+
])
|
728
|
+
File.should_not_receive(:open).with(%r(/ignored/))
|
729
|
+
File.stub(:open).and_call_original
|
730
|
+
expect(cli.run(%w(--format simple example))).to eq(0)
|
731
|
+
expect($stdout.string).to eq(
|
732
|
+
['', '0 files inspected, no offences detected',
|
733
|
+
''].join("\n"))
|
734
|
+
end
|
735
|
+
|
736
|
+
describe '--require option' do
|
737
|
+
let(:required_file_path) { './path/to/required_file.rb' }
|
738
|
+
|
739
|
+
before do
|
740
|
+
create_file('example.rb', '# encoding: utf-8')
|
741
|
+
|
742
|
+
create_file(required_file_path, [
|
743
|
+
'# encoding: utf-8',
|
744
|
+
"puts 'Hello from required file!'"
|
745
|
+
])
|
746
|
+
end
|
747
|
+
|
748
|
+
it 'requires the passed path' do
|
749
|
+
cli.run(['--require', required_file_path, 'example.rb'])
|
750
|
+
expect($stdout.string).to start_with('Hello from required file!')
|
751
|
+
end
|
752
|
+
end
|
753
|
+
|
754
|
+
describe '-f/--format option' do
|
755
|
+
let(:target_file) { 'example.rb' }
|
756
|
+
|
757
|
+
before do
|
758
|
+
create_file(target_file, [
|
759
|
+
'# encoding: utf-8',
|
760
|
+
'#' * 90
|
761
|
+
])
|
762
|
+
end
|
763
|
+
|
764
|
+
describe 'builtin formatters' do
|
765
|
+
context 'when simple format is specified' do
|
766
|
+
it 'outputs with simple format' do
|
767
|
+
cli.run(['--format', 'simple', 'example.rb'])
|
768
|
+
expect($stdout.string).to include([
|
769
|
+
"== #{target_file} ==",
|
770
|
+
'C: 2: 80: Line is too long. [90/79]'
|
771
|
+
].join("\n"))
|
772
|
+
end
|
773
|
+
end
|
774
|
+
|
775
|
+
context 'when emacs format is specified' do
|
776
|
+
it 'outputs with emacs format' do
|
777
|
+
cli.run(['--format', 'emacs', 'example.rb'])
|
778
|
+
expect($stdout.string).to include(
|
779
|
+
"#{abs(target_file)}:2:80: C: Line is too long. [90/79]")
|
780
|
+
end
|
781
|
+
end
|
782
|
+
|
783
|
+
context 'when unknown format name is specified' do
|
784
|
+
it 'aborts with error message' do
|
785
|
+
expect { cli.run(['--format', 'unknown', 'example.rb']) }
|
786
|
+
.to exit_with_code(1)
|
787
|
+
expect($stderr.string)
|
788
|
+
.to include('No formatter for "unknown"')
|
789
|
+
end
|
790
|
+
end
|
791
|
+
end
|
792
|
+
|
793
|
+
describe 'custom formatter' do
|
794
|
+
let(:target_file) { abs('example.rb') }
|
795
|
+
|
796
|
+
context 'when a class name is specified' do
|
797
|
+
it 'uses the class as a formatter' do
|
798
|
+
module ::MyTool
|
799
|
+
class RubocopFormatter < Rubocop::Formatter::BaseFormatter
|
800
|
+
def started(all_files)
|
801
|
+
output.puts "started: #{all_files.join(',')}"
|
802
|
+
end
|
803
|
+
|
804
|
+
def file_started(file, options)
|
805
|
+
output.puts "file_started: #{file}"
|
806
|
+
end
|
807
|
+
|
808
|
+
def file_finished(file, offences)
|
809
|
+
output.puts "file_finished: #{file}"
|
810
|
+
end
|
811
|
+
|
812
|
+
def finished(processed_files)
|
813
|
+
output.puts "finished: #{processed_files.join(',')}"
|
814
|
+
end
|
815
|
+
end
|
816
|
+
end
|
817
|
+
|
818
|
+
cli.run(['--format', 'MyTool::RubocopFormatter', 'example.rb'])
|
819
|
+
expect($stdout.string).to eq([
|
820
|
+
"started: #{target_file}",
|
821
|
+
"file_started: #{target_file}",
|
822
|
+
"file_finished: #{target_file}",
|
823
|
+
"finished: #{target_file}",
|
824
|
+
''
|
825
|
+
].join("\n"))
|
826
|
+
end
|
827
|
+
end
|
828
|
+
|
829
|
+
context 'when unknown class name is specified' do
|
830
|
+
it 'aborts with error message' do
|
831
|
+
expect { cli.run(['--format', 'UnknownFormatter', 'example.rb']) }
|
832
|
+
.to exit_with_code(1)
|
833
|
+
expect($stderr.string).to include('UnknownFormatter')
|
834
|
+
end
|
835
|
+
end
|
836
|
+
end
|
837
|
+
|
838
|
+
it 'can be used multiple times' do
|
839
|
+
cli.run(['--format', 'simple', '--format', 'emacs', 'example.rb'])
|
840
|
+
expect($stdout.string).to include([
|
841
|
+
"== #{target_file} ==",
|
842
|
+
'C: 2: 80: Line is too long. [90/79]',
|
843
|
+
"#{abs(target_file)}:2:80: C: Line is too long. [90/79]"
|
844
|
+
].join("\n"))
|
845
|
+
end
|
846
|
+
end
|
847
|
+
|
848
|
+
unless Rubocop::Version::STRING.start_with?('0')
|
849
|
+
describe '-e/--emacs option' do
|
850
|
+
it 'is dropped in RuboCop 1.0.0' do
|
851
|
+
# This spec can be removed once the option is dropped.
|
852
|
+
expect(cli.run(['--emacs'])).to eq(1)
|
853
|
+
expect($stderr.string).to include('invalid option: --emacs')
|
854
|
+
end
|
855
|
+
end
|
856
|
+
end
|
857
|
+
|
858
|
+
describe '-o/--out option' do
|
859
|
+
let(:target_file) { 'example.rb' }
|
860
|
+
|
861
|
+
before do
|
862
|
+
create_file(target_file, [
|
863
|
+
'# encoding: utf-8',
|
864
|
+
'#' * 90
|
865
|
+
])
|
866
|
+
end
|
867
|
+
|
868
|
+
it 'redirects output to the specified file' do
|
869
|
+
cli.run(['--out', 'output.txt', target_file])
|
870
|
+
expect(File.read('output.txt')).to include('Line is too long.')
|
871
|
+
end
|
872
|
+
|
873
|
+
it 'is applied to the previously specified formatter' do
|
874
|
+
cli.run([
|
875
|
+
'--format', 'simple',
|
876
|
+
'--format', 'emacs', '--out', 'emacs_output.txt',
|
877
|
+
target_file
|
878
|
+
])
|
879
|
+
|
880
|
+
expect($stdout.string).to eq([
|
881
|
+
"== #{target_file} ==",
|
882
|
+
'C: 2: 80: Line is too long. [90/79]',
|
883
|
+
'',
|
884
|
+
'1 file inspected, 1 offence detected',
|
885
|
+
''
|
886
|
+
].join("\n"))
|
887
|
+
|
888
|
+
expect(File.read('emacs_output.txt')).to eq([
|
889
|
+
"#{abs(target_file)}:2:80: C: Line is too long. [90/79]",
|
890
|
+
'',
|
891
|
+
'1 file inspected, 1 offence detected',
|
892
|
+
''
|
893
|
+
].join("\n"))
|
894
|
+
end
|
895
|
+
end
|
896
|
+
|
897
|
+
describe '#display_error_summary' do
|
898
|
+
it 'displays an error message when errors are present' do
|
899
|
+
msg = 'An error occurred while Encoding cop was inspecting file.rb.'
|
900
|
+
cli.display_error_summary([msg])
|
901
|
+
expect($stdout.string.lines.to_a[-6..-5])
|
902
|
+
.to eq(["1 error occurred:\n", "#{msg}\n"])
|
903
|
+
end
|
904
|
+
end
|
905
|
+
end
|
906
|
+
end
|