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
         
     |