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/lib/rubocop.rb
ADDED
@@ -0,0 +1,116 @@
|
|
1
|
+
# encoding: utf-8
|
2
|
+
|
3
|
+
require 'rainbow'
|
4
|
+
require 'English'
|
5
|
+
require 'parser/current'
|
6
|
+
require 'ast/sexp'
|
7
|
+
|
8
|
+
require 'rubocop/cop/util'
|
9
|
+
require 'rubocop/cop/variable_inspector'
|
10
|
+
require 'rubocop/cop/offence'
|
11
|
+
require 'rubocop/cop/cop'
|
12
|
+
|
13
|
+
require 'rubocop/cop/lint/assignment_in_condition'
|
14
|
+
require 'rubocop/cop/lint/end_alignment'
|
15
|
+
require 'rubocop/cop/lint/end_in_method'
|
16
|
+
require 'rubocop/cop/lint/ensure_return'
|
17
|
+
require 'rubocop/cop/lint/eval'
|
18
|
+
require 'rubocop/cop/lint/handle_exceptions'
|
19
|
+
require 'rubocop/cop/lint/literal_in_condition'
|
20
|
+
require 'rubocop/cop/lint/loop'
|
21
|
+
require 'rubocop/cop/lint/rescue_exception'
|
22
|
+
require 'rubocop/cop/lint/shadowing_outer_local_variable'
|
23
|
+
require 'rubocop/cop/lint/unreachable_code'
|
24
|
+
require 'rubocop/cop/lint/unused_local_variable'
|
25
|
+
require 'rubocop/cop/lint/void'
|
26
|
+
|
27
|
+
require 'rubocop/cop/style/access_control'
|
28
|
+
require 'rubocop/cop/style/alias'
|
29
|
+
require 'rubocop/cop/style/align_parameters'
|
30
|
+
require 'rubocop/cop/style/and_or'
|
31
|
+
require 'rubocop/cop/style/ascii_comments'
|
32
|
+
require 'rubocop/cop/style/ascii_identifiers'
|
33
|
+
require 'rubocop/cop/style/attr'
|
34
|
+
require 'rubocop/cop/style/avoid_class_vars'
|
35
|
+
require 'rubocop/cop/style/avoid_for'
|
36
|
+
require 'rubocop/cop/style/avoid_global_vars'
|
37
|
+
require 'rubocop/cop/style/avoid_perl_backrefs'
|
38
|
+
require 'rubocop/cop/style/avoid_perlisms'
|
39
|
+
require 'rubocop/cop/style/begin_block'
|
40
|
+
require 'rubocop/cop/style/block_comments'
|
41
|
+
require 'rubocop/cop/style/block_nesting'
|
42
|
+
require 'rubocop/cop/style/blocks'
|
43
|
+
require 'rubocop/cop/style/character_literal'
|
44
|
+
require 'rubocop/cop/style/case_equality'
|
45
|
+
require 'rubocop/cop/style/case_indentation'
|
46
|
+
require 'rubocop/cop/style/class_and_module_camel_case'
|
47
|
+
require 'rubocop/cop/style/class_methods'
|
48
|
+
require 'rubocop/cop/style/collection_methods'
|
49
|
+
require 'rubocop/cop/style/colon_method_call'
|
50
|
+
require 'rubocop/cop/style/constant_name'
|
51
|
+
require 'rubocop/cop/style/def_parentheses'
|
52
|
+
require 'rubocop/cop/style/documentation'
|
53
|
+
require 'rubocop/cop/style/dot_position'
|
54
|
+
require 'rubocop/cop/style/empty_line_between_defs'
|
55
|
+
require 'rubocop/cop/style/empty_lines'
|
56
|
+
require 'rubocop/cop/style/empty_literal'
|
57
|
+
require 'rubocop/cop/style/encoding'
|
58
|
+
require 'rubocop/cop/style/end_block'
|
59
|
+
require 'rubocop/cop/style/end_of_line'
|
60
|
+
require 'rubocop/cop/style/favor_join'
|
61
|
+
require 'rubocop/cop/style/favor_modifier'
|
62
|
+
require 'rubocop/cop/style/favor_sprintf'
|
63
|
+
require 'rubocop/cop/style/favor_unless_over_negated_if'
|
64
|
+
require 'rubocop/cop/style/hash_syntax'
|
65
|
+
require 'rubocop/cop/style/if_then_else'
|
66
|
+
require 'rubocop/cop/style/if_with_semicolon'
|
67
|
+
require 'rubocop/cop/style/multiline_if_then'
|
68
|
+
require 'rubocop/cop/style/one_line_conditional'
|
69
|
+
require 'rubocop/cop/style/lambda'
|
70
|
+
require 'rubocop/cop/style/leading_comment_space'
|
71
|
+
require 'rubocop/cop/style/line_continuation'
|
72
|
+
require 'rubocop/cop/style/line_length'
|
73
|
+
require 'rubocop/cop/style/method_and_variable_snake_case'
|
74
|
+
require 'rubocop/cop/style/method_call_parentheses'
|
75
|
+
require 'rubocop/cop/style/method_length'
|
76
|
+
require 'rubocop/cop/style/not'
|
77
|
+
require 'rubocop/cop/style/numeric_literals'
|
78
|
+
require 'rubocop/cop/style/op_method'
|
79
|
+
require 'rubocop/cop/style/parameter_lists'
|
80
|
+
require 'rubocop/cop/style/parentheses_around_condition'
|
81
|
+
require 'rubocop/cop/style/proc'
|
82
|
+
require 'rubocop/cop/style/reduce_arguments'
|
83
|
+
require 'rubocop/cop/style/regexp_literal'
|
84
|
+
require 'rubocop/cop/style/rescue_modifier'
|
85
|
+
require 'rubocop/cop/style/semicolon'
|
86
|
+
require 'rubocop/cop/style/single_line_methods'
|
87
|
+
require 'rubocop/cop/style/space_after_comma_etc'
|
88
|
+
require 'rubocop/cop/style/space_after_control_keyword'
|
89
|
+
require 'rubocop/cop/style/string_literals'
|
90
|
+
require 'rubocop/cop/style/surrounding_space'
|
91
|
+
require 'rubocop/cop/style/symbol_array'
|
92
|
+
require 'rubocop/cop/style/symbol_name'
|
93
|
+
require 'rubocop/cop/style/tab'
|
94
|
+
require 'rubocop/cop/style/ternary_operator'
|
95
|
+
require 'rubocop/cop/style/trailing_whitespace'
|
96
|
+
require 'rubocop/cop/style/trivial_accessors'
|
97
|
+
require 'rubocop/cop/style/unless_else'
|
98
|
+
require 'rubocop/cop/style/variable_interpolation'
|
99
|
+
require 'rubocop/cop/style/when_then'
|
100
|
+
require 'rubocop/cop/style/while_until_do'
|
101
|
+
require 'rubocop/cop/style/word_array'
|
102
|
+
|
103
|
+
require 'rubocop/cop/rails/validation'
|
104
|
+
|
105
|
+
require 'rubocop/formatter/base_formatter'
|
106
|
+
require 'rubocop/formatter/simple_text_formatter'
|
107
|
+
require 'rubocop/formatter/emacs_style_formatter'
|
108
|
+
require 'rubocop/formatter/clang_style_formatter'
|
109
|
+
require 'rubocop/formatter/progress_formatter'
|
110
|
+
require 'rubocop/formatter/json_formatter'
|
111
|
+
require 'rubocop/formatter/formatter_set'
|
112
|
+
|
113
|
+
require 'rubocop/config'
|
114
|
+
require 'rubocop/config_store'
|
115
|
+
require 'rubocop/cli'
|
116
|
+
require 'rubocop/version'
|
data/lib/rubocop/cli.rb
ADDED
@@ -0,0 +1,407 @@
|
|
1
|
+
# encoding: utf-8
|
2
|
+
require 'pathname'
|
3
|
+
require 'optparse'
|
4
|
+
|
5
|
+
module Rubocop
|
6
|
+
# The CLI is a class responsible of handling all the command line interface
|
7
|
+
# logic.
|
8
|
+
class CLI
|
9
|
+
DEFAULT_FORMATTER = 'progress'
|
10
|
+
|
11
|
+
# If set true while running,
|
12
|
+
# RuboCop will abort processing and exit gracefully.
|
13
|
+
attr_accessor :wants_to_quit
|
14
|
+
attr_accessor :options
|
15
|
+
|
16
|
+
alias_method :wants_to_quit?, :wants_to_quit
|
17
|
+
|
18
|
+
def initialize
|
19
|
+
@cops = Cop::Cop.all
|
20
|
+
@errors = []
|
21
|
+
@options = {}
|
22
|
+
ConfigStore.prepare
|
23
|
+
end
|
24
|
+
|
25
|
+
# Entry point for the application logic. Here we
|
26
|
+
# do the command line arguments processing and inspect
|
27
|
+
# the target files
|
28
|
+
# @return [Fixnum] UNIX exit code
|
29
|
+
def run(args = ARGV)
|
30
|
+
trap_interrupt
|
31
|
+
|
32
|
+
begin
|
33
|
+
parse_options(args)
|
34
|
+
rescue => e
|
35
|
+
$stderr.puts e.message
|
36
|
+
return 1
|
37
|
+
end
|
38
|
+
|
39
|
+
# filter out Rails cops unless requested
|
40
|
+
@cops.reject!(&:rails?) unless @options[:rails]
|
41
|
+
|
42
|
+
# filter out style cops when --lint is passed
|
43
|
+
@cops.select!(&:lint?) if @options[:lint]
|
44
|
+
|
45
|
+
target_files = target_files(args)
|
46
|
+
target_files.each(&:freeze).freeze
|
47
|
+
inspected_files = []
|
48
|
+
any_failed = false
|
49
|
+
|
50
|
+
formatter_set.started(target_files)
|
51
|
+
|
52
|
+
target_files.each do |file|
|
53
|
+
break if wants_to_quit?
|
54
|
+
|
55
|
+
puts "Scanning #{file}" if @options[:debug]
|
56
|
+
formatter_set.file_started(file, {})
|
57
|
+
|
58
|
+
offences = inspect_file(file)
|
59
|
+
|
60
|
+
any_failed = true unless offences.empty?
|
61
|
+
inspected_files << file
|
62
|
+
formatter_set.file_finished(file, offences.freeze)
|
63
|
+
end
|
64
|
+
|
65
|
+
formatter_set.finished(inspected_files.freeze)
|
66
|
+
formatter_set.close_output_files
|
67
|
+
|
68
|
+
display_error_summary(@errors) unless @options[:silent]
|
69
|
+
|
70
|
+
!any_failed && !wants_to_quit ? 0 : 1
|
71
|
+
end
|
72
|
+
|
73
|
+
def validate_only_option
|
74
|
+
if @cops.none? { |c| c.cop_name == @options[:only] }
|
75
|
+
fail ArgumentError, "Unrecognized cop name: #{@options[:only]}."
|
76
|
+
end
|
77
|
+
end
|
78
|
+
|
79
|
+
def inspect_file(file)
|
80
|
+
begin
|
81
|
+
ast, comments, tokens, source_buffer, source, syntax_offences =
|
82
|
+
CLI.parse(file) { |sb| sb.read }
|
83
|
+
|
84
|
+
rescue Encoding::UndefinedConversionError, ArgumentError => e
|
85
|
+
handle_error(e, "An error occurred while parsing #{file}.".color(:red))
|
86
|
+
return []
|
87
|
+
end
|
88
|
+
|
89
|
+
# If we got any syntax errors, return only the syntax offences.
|
90
|
+
# Parser may return nil for AST even though there are no syntax errors.
|
91
|
+
# e.g. sources which contain only comments
|
92
|
+
return syntax_offences unless syntax_offences.empty?
|
93
|
+
|
94
|
+
config = ConfigStore.for(file)
|
95
|
+
disabled_lines = disabled_lines_in(source)
|
96
|
+
|
97
|
+
set_config_for_all_cops(config)
|
98
|
+
|
99
|
+
@cops.reduce([]) do |offences, cop_class|
|
100
|
+
cop_name = cop_class.cop_name
|
101
|
+
if config.cop_enabled?(cop_name)
|
102
|
+
cop = setup_cop(cop_class, disabled_lines)
|
103
|
+
if !@options[:only] || @options[:only] == cop_name
|
104
|
+
begin
|
105
|
+
cop.inspect(source_buffer, source, tokens, ast, comments)
|
106
|
+
rescue => e
|
107
|
+
handle_error(e,
|
108
|
+
"An error occurred while #{cop.name}".color(:red) +
|
109
|
+
" cop was inspecting #{file}.".color(:red))
|
110
|
+
end
|
111
|
+
end
|
112
|
+
offences.concat(cop.offences)
|
113
|
+
end
|
114
|
+
offences
|
115
|
+
end.sort
|
116
|
+
end
|
117
|
+
|
118
|
+
def set_config_for_all_cops(config)
|
119
|
+
@cops.each do |cop_class|
|
120
|
+
cop_class.config = config.for_cop(cop_class.cop_name)
|
121
|
+
end
|
122
|
+
end
|
123
|
+
|
124
|
+
def setup_cop(cop_class, disabled_lines = nil)
|
125
|
+
cop = cop_class.new
|
126
|
+
cop.debug = @options[:debug] || @options[:list_cops]
|
127
|
+
cop.autocorrect = @options[:autocorrect]
|
128
|
+
cop.disabled_lines = disabled_lines[cop_class.cop_name] if disabled_lines
|
129
|
+
cop
|
130
|
+
end
|
131
|
+
|
132
|
+
def handle_error(e, message)
|
133
|
+
@errors << message
|
134
|
+
warn message
|
135
|
+
if @options[:debug]
|
136
|
+
puts e.message, e.backtrace
|
137
|
+
else
|
138
|
+
warn 'To see the complete backtrace run rubocop -d.'
|
139
|
+
end
|
140
|
+
end
|
141
|
+
|
142
|
+
# rubocop:disable MethodLength
|
143
|
+
def parse_options(args)
|
144
|
+
convert_deprecated_options!(args)
|
145
|
+
|
146
|
+
OptionParser.new do |opts|
|
147
|
+
opts.banner = 'Usage: rubocop [options] [file1, file2, ...]'
|
148
|
+
|
149
|
+
opts.on('-d', '--debug', 'Display debug info.') do |d|
|
150
|
+
@options[:debug] = d
|
151
|
+
end
|
152
|
+
opts.on('-L', '--list-cops', 'List class name of cops.') do |c|
|
153
|
+
@options[:list_cops] = c
|
154
|
+
end
|
155
|
+
opts.on('-c', '--config FILE', 'Specify configuration file.') do |f|
|
156
|
+
@options[:config] = f
|
157
|
+
ConfigStore.set_options_config(@options[:config])
|
158
|
+
end
|
159
|
+
opts.on('--only COP', 'Run just one cop.') do |s|
|
160
|
+
@options[:only] = s
|
161
|
+
validate_only_option
|
162
|
+
end
|
163
|
+
opts.on('-f', '--format FORMATTER',
|
164
|
+
'Choose an output formatter. This option',
|
165
|
+
'can be specified multiple times to enable',
|
166
|
+
'multiple formatters at the same time.',
|
167
|
+
' [p]rogress (default)',
|
168
|
+
' [s]imple',
|
169
|
+
' [c]lang',
|
170
|
+
' [e]macs',
|
171
|
+
' [j]son',
|
172
|
+
' custom formatter class name') do |key|
|
173
|
+
@options[:formatters] ||= []
|
174
|
+
@options[:formatters] << [key]
|
175
|
+
end
|
176
|
+
opts.on('-o', '--out FILE',
|
177
|
+
'Write output to a file instead of STDOUT.',
|
178
|
+
'This option applies to the previously',
|
179
|
+
'specified --format, or the default format',
|
180
|
+
'if no format is specified.') do |path|
|
181
|
+
@options[:formatters] ||= [[DEFAULT_FORMATTER]]
|
182
|
+
@options[:formatters].last << path
|
183
|
+
end
|
184
|
+
opts.on('-r', '--require FILE', 'Require Ruby file.') do |f|
|
185
|
+
require f
|
186
|
+
end
|
187
|
+
opts.on('-R', '--rails', 'Run extra Rails cops.') do |r|
|
188
|
+
@options[:rails] = r
|
189
|
+
end
|
190
|
+
opts.on('-l', '--lint', 'Run only lint cops.') do |l|
|
191
|
+
@options[:lint] = l
|
192
|
+
end
|
193
|
+
opts.on('-a', '--auto-correct', 'Auto-correct offences.') do |a|
|
194
|
+
@options[:autocorrect] = a
|
195
|
+
end
|
196
|
+
opts.on('-s', '--silent', 'Silence summary.') do |s|
|
197
|
+
@options[:silent] = s
|
198
|
+
end
|
199
|
+
opts.on('-n', '--no-color', 'Disable color output.') do |s|
|
200
|
+
Sickill::Rainbow.enabled = false
|
201
|
+
end
|
202
|
+
opts.on('-v', '--version', 'Display version.') do
|
203
|
+
puts Rubocop::Version.version(false)
|
204
|
+
exit(0)
|
205
|
+
end
|
206
|
+
opts.on('-V', '--verbose-version', 'Display verbose version.') do
|
207
|
+
puts Rubocop::Version.version(true)
|
208
|
+
exit(0)
|
209
|
+
end
|
210
|
+
end.parse!(args)
|
211
|
+
end
|
212
|
+
# rubocop:enable MethodLength
|
213
|
+
|
214
|
+
def convert_deprecated_options!(args)
|
215
|
+
args.map! do |arg|
|
216
|
+
case arg
|
217
|
+
when '-e', '--emacs'
|
218
|
+
deprecate("#{arg} option", '--format emacs', '1.0.0')
|
219
|
+
%w(--format emacs)
|
220
|
+
else
|
221
|
+
arg
|
222
|
+
end
|
223
|
+
end.flatten!
|
224
|
+
end
|
225
|
+
|
226
|
+
def trap_interrupt
|
227
|
+
Signal.trap('INT') do
|
228
|
+
exit!(1) if wants_to_quit?
|
229
|
+
self.wants_to_quit = true
|
230
|
+
$stderr.puts
|
231
|
+
$stderr.puts 'Exiting... Interrupt again to exit immediately.'
|
232
|
+
end
|
233
|
+
end
|
234
|
+
|
235
|
+
def display_error_summary(errors)
|
236
|
+
return if errors.empty?
|
237
|
+
plural = errors.count > 1 ? 's' : ''
|
238
|
+
puts "\n#{errors.count} error#{plural} occurred:".color(:red)
|
239
|
+
errors.each { |error| puts error }
|
240
|
+
puts 'Errors are usually caused by RuboCop bugs.'
|
241
|
+
puts 'Please, report your problems to RuboCop\'s issue tracker.'
|
242
|
+
puts 'Mention the following information in the issue report:'
|
243
|
+
puts Rubocop::Version.version(true)
|
244
|
+
end
|
245
|
+
|
246
|
+
def disabled_lines_in(source)
|
247
|
+
disabled_lines = Hash.new([])
|
248
|
+
disabled_section = {}
|
249
|
+
regexp = '# rubocop : (%s)\b ((?:\w+,? )+)'.gsub(' ', '\s*')
|
250
|
+
section_regexp = '^\s*' + sprintf(regexp, '(?:dis|en)able')
|
251
|
+
single_line_regexp = '\S.*' + sprintf(regexp, 'disable')
|
252
|
+
|
253
|
+
source.each_with_index do |line, ix|
|
254
|
+
each_mentioned_cop(/#{section_regexp}/, line) do |cop_name, kind|
|
255
|
+
disabled_section[cop_name] = (kind == 'disable')
|
256
|
+
end
|
257
|
+
disabled_section.keys.each do |cop_name|
|
258
|
+
disabled_lines[cop_name] += [ix + 1] if disabled_section[cop_name]
|
259
|
+
end
|
260
|
+
|
261
|
+
each_mentioned_cop(/#{single_line_regexp}/, line) do |cop_name, kind|
|
262
|
+
disabled_lines[cop_name] += [ix + 1] if kind == 'disable'
|
263
|
+
end
|
264
|
+
end
|
265
|
+
disabled_lines
|
266
|
+
end
|
267
|
+
|
268
|
+
def each_mentioned_cop(regexp, line)
|
269
|
+
match = line.match(regexp)
|
270
|
+
if match
|
271
|
+
kind, cops = match.captures
|
272
|
+
cops = Cop::Cop.all.map(&:cop_name).join(',') if cops.include?('all')
|
273
|
+
cops.split(/,\s*/).each { |cop_name| yield cop_name, kind }
|
274
|
+
end
|
275
|
+
end
|
276
|
+
|
277
|
+
def self.parse(file)
|
278
|
+
parser = Parser::CurrentRuby.new
|
279
|
+
|
280
|
+
# On JRuby and Rubinius, there's a risk that we hang in
|
281
|
+
# tokenize() if we don't set the all errors as fatal flag.
|
282
|
+
parser.diagnostics.all_errors_are_fatal = RUBY_ENGINE != 'ruby'
|
283
|
+
parser.diagnostics.ignore_warnings = false
|
284
|
+
|
285
|
+
diagnostics = []
|
286
|
+
parser.diagnostics.consumer = lambda do |diagnostic|
|
287
|
+
diagnostics << diagnostic
|
288
|
+
end
|
289
|
+
|
290
|
+
source_buffer = Parser::Source::Buffer.new(file, 1)
|
291
|
+
yield source_buffer
|
292
|
+
|
293
|
+
begin
|
294
|
+
ast, comments, tokens = parser.tokenize(source_buffer)
|
295
|
+
rescue Parser::SyntaxError # rubocop:disable HandleExceptions
|
296
|
+
# All errors are in diagnostics. No need to handle exception.
|
297
|
+
end
|
298
|
+
|
299
|
+
if tokens
|
300
|
+
tokens = tokens.map do |t|
|
301
|
+
type, details = *t
|
302
|
+
text, range = *details
|
303
|
+
Rubocop::Cop::Token.new(range, type, text)
|
304
|
+
end
|
305
|
+
end
|
306
|
+
|
307
|
+
syntax_offences = diagnostics.map do |d|
|
308
|
+
Cop::Offence.new(d.level, d.location, "#{d.message}",
|
309
|
+
'Syntax')
|
310
|
+
end
|
311
|
+
|
312
|
+
source = source_buffer.source.split($RS)
|
313
|
+
|
314
|
+
[ast, comments, tokens, source_buffer, source, syntax_offences]
|
315
|
+
end
|
316
|
+
|
317
|
+
# Generate a list of target files by expanding globing patterns
|
318
|
+
# (if any). If args is empty recursively finds all Ruby source
|
319
|
+
# files under the current directory
|
320
|
+
# @return [Array] array of filenames
|
321
|
+
def target_files(args)
|
322
|
+
return ruby_files if args.empty?
|
323
|
+
|
324
|
+
files = []
|
325
|
+
|
326
|
+
args.each do |target|
|
327
|
+
if File.directory?(target)
|
328
|
+
files += ruby_files(target.chomp(File::SEPARATOR))
|
329
|
+
elsif target =~ /\*/
|
330
|
+
files += Dir[target]
|
331
|
+
else
|
332
|
+
files << target
|
333
|
+
end
|
334
|
+
end
|
335
|
+
|
336
|
+
files.map { |f| File.expand_path(f) }.uniq
|
337
|
+
end
|
338
|
+
|
339
|
+
# Finds all Ruby source files under the current or other supplied
|
340
|
+
# directory. A Ruby source file is defined as a file with the `.rb`
|
341
|
+
# extension or a file with no extension that has a ruby shebang line
|
342
|
+
# as its first line.
|
343
|
+
# It is possible to specify includes and excludes using the config file,
|
344
|
+
# so you can include other Ruby files like Rakefiles and gemspecs.
|
345
|
+
# @param root Root directory under which to search for ruby source files
|
346
|
+
# @return [Array] Array of filenames
|
347
|
+
def ruby_files(root = Dir.pwd)
|
348
|
+
files = Dir["#{root}/**/*"].select { |file| FileTest.file?(file) }
|
349
|
+
|
350
|
+
rb = []
|
351
|
+
|
352
|
+
rb += files.select { |file| File.extname(file) == '.rb' }
|
353
|
+
rb += files.select do |file|
|
354
|
+
if File.extname(file) == '' && !excluded_file?(file)
|
355
|
+
begin
|
356
|
+
File.open(file) { |f| f.readline } =~ /#!.*ruby/
|
357
|
+
rescue EOFError, ArgumentError => e
|
358
|
+
log_error(e, "Unprocessable file #{file.inspect}: ")
|
359
|
+
false
|
360
|
+
end
|
361
|
+
end
|
362
|
+
end
|
363
|
+
|
364
|
+
rb += files.select do |file|
|
365
|
+
config = ConfigStore.for(file)
|
366
|
+
config.file_to_include?(file)
|
367
|
+
end
|
368
|
+
|
369
|
+
rb.reject { |file| excluded_file?(file) }.uniq
|
370
|
+
end
|
371
|
+
|
372
|
+
private
|
373
|
+
|
374
|
+
def log_error(e, msg = '')
|
375
|
+
if @options[:debug]
|
376
|
+
error_message = "#{e.class}, #{e.message}"
|
377
|
+
warn "#{msg}\t#{error_message}"
|
378
|
+
end
|
379
|
+
end
|
380
|
+
|
381
|
+
def formatter_set
|
382
|
+
@formatter_set ||= begin
|
383
|
+
set = Formatter::FormatterSet.new(!@options[:silent])
|
384
|
+
pairs = @options[:formatters] || [[DEFAULT_FORMATTER]]
|
385
|
+
pairs.each do |formatter_key, output_path|
|
386
|
+
set.add_formatter(formatter_key, output_path)
|
387
|
+
end
|
388
|
+
set
|
389
|
+
rescue => error
|
390
|
+
warn error.message
|
391
|
+
exit(1)
|
392
|
+
end
|
393
|
+
end
|
394
|
+
|
395
|
+
def deprecate(subject, alternative = nil, version = nil)
|
396
|
+
message = "#{subject} is deprecated"
|
397
|
+
message << " and will be removed in RuboCop #{version}" if version
|
398
|
+
message << '.'
|
399
|
+
message << " Please use #{alternative} instead." if alternative
|
400
|
+
warn message
|
401
|
+
end
|
402
|
+
|
403
|
+
def excluded_file?(file)
|
404
|
+
ConfigStore.for(file).file_to_exclude?(file)
|
405
|
+
end
|
406
|
+
end
|
407
|
+
end
|