rubocop 0.14.1 → 0.15.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.
Potentially problematic release.
This version of rubocop might be problematic. Click here for more details.
- checksums.yaml +4 -4
 - data/.rubocop.yml +5 -3
 - data/CHANGELOG.md +245 -198
 - data/README.md +7 -0
 - data/Rakefile +5 -1
 - data/config/default.yml +27 -4
 - data/config/enabled.yml +18 -4
 - data/lib/rubocop.rb +13 -1
 - data/lib/rubocop/cli.rb +83 -23
 - data/lib/rubocop/config.rb +1 -1
 - data/lib/rubocop/cop/cop.rb +31 -6
 - data/lib/rubocop/cop/lint/block_alignment.rb +11 -8
 - data/lib/rubocop/cop/lint/parentheses_as_grouped_expression.rb +21 -14
 - data/lib/rubocop/cop/lint/useless_setter_call.rb +1 -1
 - data/lib/rubocop/cop/rails/output.rb +35 -0
 - data/lib/rubocop/cop/style/{access_control.rb → access_modifier_indentation.rb} +18 -15
 - data/lib/rubocop/cop/style/alias.rb +14 -2
 - data/lib/rubocop/cop/style/align_hash.rb +174 -109
 - data/lib/rubocop/cop/style/autocorrect_alignment.rb +38 -18
 - data/lib/rubocop/cop/style/blocks.rb +4 -6
 - data/lib/rubocop/cop/style/braces_around_hash_parameters.rb +3 -3
 - data/lib/rubocop/cop/style/cyclomatic_complexity.rb +46 -0
 - data/lib/rubocop/cop/style/empty_lines_around_access_modifier.rb +48 -0
 - data/lib/rubocop/cop/style/empty_lines_around_body.rb +62 -0
 - data/lib/rubocop/cop/style/end_of_line.rb +6 -2
 - data/lib/rubocop/cop/style/favor_modifier.rb +11 -1
 - data/lib/rubocop/cop/style/final_newline.rb +10 -4
 - data/lib/rubocop/cop/style/hash_syntax.rb +32 -21
 - data/lib/rubocop/cop/style/leading_comment_space.rb +9 -0
 - data/lib/rubocop/cop/style/method_call_parentheses.rb +11 -1
 - data/lib/rubocop/cop/style/numeric_literals.rb +11 -15
 - data/lib/rubocop/cop/style/redundant_return.rb +7 -4
 - data/lib/rubocop/cop/style/redundant_self.rb +3 -3
 - data/lib/rubocop/cop/style/signal_exception.rb +4 -2
 - data/lib/rubocop/cop/style/space_after_comma_etc.rb +7 -1
 - data/lib/rubocop/cop/style/space_after_control_keyword.rb +6 -0
 - data/lib/rubocop/cop/style/space_after_method_name.rb +7 -1
 - data/lib/rubocop/cop/style/space_after_not.rb +6 -2
 - data/lib/rubocop/cop/style/space_around_block_braces.rb +149 -0
 - data/lib/rubocop/cop/style/space_around_equals_in_parameter_default.rb +33 -0
 - data/lib/rubocop/cop/style/space_around_operators.rb +169 -0
 - data/lib/rubocop/cop/style/space_before_modifier_keyword.rb +6 -0
 - data/lib/rubocop/cop/style/space_inside.rb +35 -0
 - data/lib/rubocop/cop/style/space_inside_brackets.rb +18 -0
 - data/lib/rubocop/cop/style/space_inside_hash_literal_braces.rb +99 -0
 - data/lib/rubocop/cop/style/space_inside_parens.rb +18 -0
 - data/lib/rubocop/cop/style/special_global_vars.rb +52 -25
 - data/lib/rubocop/cop/style/string_literals.rb +1 -1
 - data/lib/rubocop/cop/style/surrounding_space.rb +1 -344
 - data/lib/rubocop/cop/style/trailing_blank_lines.rb +17 -5
 - data/lib/rubocop/cop/style/trailing_whitespace.rb +9 -5
 - data/lib/rubocop/cop/style/trivial_accessors.rb +1 -2
 - data/lib/rubocop/cop/style/word_array.rb +16 -1
 - data/lib/rubocop/cop/team.rb +5 -5
 - data/lib/rubocop/cop/util.rb +1 -0
 - data/lib/rubocop/formatter/offence_count_formatter.rb +0 -1
 - data/lib/rubocop/options.rb +76 -111
 - data/lib/rubocop/rake_task.rb +4 -2
 - data/lib/rubocop/target_finder.rb +3 -3
 - data/lib/rubocop/version.rb +1 -1
 - data/spec/rubocop/cli_spec.rb +123 -13
 - data/spec/rubocop/config_spec.rb +2 -2
 - data/spec/rubocop/cop/lint/rescue_exception_spec.rb +10 -0
 - data/spec/rubocop/cop/lint/useless_setter_call_spec.rb +13 -0
 - data/spec/rubocop/cop/offence_spec.rb +2 -0
 - data/spec/rubocop/cop/rails/output_spec.rb +40 -0
 - data/spec/rubocop/cop/style/access_modifier_indentation_spec.rb +243 -0
 - data/spec/rubocop/cop/style/alias_spec.rb +8 -0
 - data/spec/rubocop/cop/style/align_array_spec.rb +12 -0
 - data/spec/rubocop/cop/style/align_hash_spec.rb +15 -0
 - data/spec/rubocop/cop/style/braces_around_hash_parameters_spec.rb +7 -4
 - data/spec/rubocop/cop/style/cyclomatic_complexity_spec.rb +203 -0
 - data/spec/rubocop/cop/style/empty_lines_around_access_modifier_spec.rb +56 -0
 - data/spec/rubocop/cop/style/empty_lines_around_body_spec.rb +87 -0
 - data/spec/rubocop/cop/style/end_of_line_spec.rb +17 -8
 - data/spec/rubocop/cop/style/favor_modifier_spec.rb +34 -0
 - data/spec/rubocop/cop/style/final_newline_spec.rb +5 -0
 - data/spec/rubocop/cop/style/hash_syntax_spec.rb +22 -2
 - data/spec/rubocop/cop/style/leading_comment_space_spec.rb +5 -0
 - data/spec/rubocop/cop/style/method_call_parentheses_spec.rb +39 -4
 - data/spec/rubocop/cop/style/numeric_literals_spec.rb +5 -0
 - data/spec/rubocop/cop/style/signal_exception_spec.rb +11 -0
 - data/spec/rubocop/cop/style/space_after_colon_spec.rb +7 -0
 - data/spec/rubocop/cop/style/space_after_comma_spec.rb +5 -0
 - data/spec/rubocop/cop/style/space_after_control_keyword_spec.rb +29 -8
 - data/spec/rubocop/cop/style/space_after_method_name_spec.rb +15 -0
 - data/spec/rubocop/cop/style/space_after_semicolon_spec.rb +5 -0
 - data/spec/rubocop/cop/style/space_around_block_braces_spec.rb +68 -0
 - data/spec/rubocop/cop/style/space_around_equals_in_default_parameter_spec.rb +5 -0
 - data/spec/rubocop/cop/style/space_around_operators_spec.rb +43 -0
 - data/spec/rubocop/cop/style/space_before_modifier_keyword_spec.rb +23 -0
 - data/spec/rubocop/cop/style/space_inside_brackets_spec.rb +7 -0
 - data/spec/rubocop/cop/style/space_inside_hash_literal_braces_spec.rb +65 -23
 - data/spec/rubocop/cop/style/space_inside_parens_spec.rb +7 -0
 - data/spec/rubocop/cop/style/special_global_vars_spec.rb +12 -2
 - data/spec/rubocop/cop/style/string_literals_spec.rb +6 -0
 - data/spec/rubocop/cop/style/symbol_array_spec.rb +5 -7
 - data/spec/rubocop/cop/style/trailing_blank_lines_spec.rb +26 -1
 - data/spec/rubocop/cop/style/trailing_whitespace_spec.rb +7 -0
 - data/spec/rubocop/cop/style/trivial_accessors_spec.rb +8 -0
 - data/spec/rubocop/cop/style/word_array_spec.rb +33 -2
 - data/spec/rubocop/cop/team_spec.rb +4 -4
 - data/spec/rubocop/formatter/json_formatter_spec.rb +1 -1
 - data/spec/rubocop/options_spec.rb +5 -96
 - data/spec/rubocop/processed_source_spec.rb +3 -3
 - data/spec/spec_helper.rb +28 -23
 - data/spec/support/mri_syntax_checker.rb +20 -16
 - metadata +24 -5
 - data/spec/rubocop/cop/style/access_control_spec.rb +0 -164
 
| 
         @@ -19,13 +19,25 @@ module Rubocop 
     | 
|
| 
       19 
19 
     | 
    
         
             
                      end
         
     | 
| 
       20 
20 
     | 
    
         | 
| 
       21 
21 
     | 
    
         
             
                      if blank_lines > 0
         
     | 
| 
       22 
     | 
    
         
            -
                         
     | 
| 
       23 
     | 
    
         
            -
             
     | 
| 
       24 
     | 
    
         
            -
             
     | 
| 
       25 
     | 
    
         
            -
             
     | 
| 
       26 
     | 
    
         
            -
             
     | 
| 
      
 22 
     | 
    
         
            +
                        range_size =
         
     | 
| 
      
 23 
     | 
    
         
            +
                          processed_source.raw_lines.to_a[-blank_lines..-1].join.length
         
     | 
| 
      
 24 
     | 
    
         
            +
                        range = source_range(processed_source.buffer,
         
     | 
| 
      
 25 
     | 
    
         
            +
                                             processed_source[0...-blank_lines],
         
     | 
| 
      
 26 
     | 
    
         
            +
                                             0, range_size)
         
     | 
| 
      
 27 
     | 
    
         
            +
                        convention(range, range, format(MSG, blank_lines))
         
     | 
| 
       27 
28 
     | 
    
         
             
                      end
         
     | 
| 
       28 
29 
     | 
    
         
             
                    end
         
     | 
| 
      
 30 
     | 
    
         
            +
             
     | 
| 
      
 31 
     | 
    
         
            +
                    def autocorrect(range)
         
     | 
| 
      
 32 
     | 
    
         
            +
                      # Bail out if there's also trailing whitespace, because
         
     | 
| 
      
 33 
     | 
    
         
            +
                      # auto-correction in the two cops would result in clobbering.
         
     | 
| 
      
 34 
     | 
    
         
            +
                      if range.source =~ / / &&
         
     | 
| 
      
 35 
     | 
    
         
            +
                          config.for_cop('TrailingWhitespace')['Enabled']
         
     | 
| 
      
 36 
     | 
    
         
            +
                        fail CorrectionNotPossible
         
     | 
| 
      
 37 
     | 
    
         
            +
                      end
         
     | 
| 
      
 38 
     | 
    
         
            +
             
     | 
| 
      
 39 
     | 
    
         
            +
                      @corrections << ->(corrector) { corrector.remove(range) }
         
     | 
| 
      
 40 
     | 
    
         
            +
                    end
         
     | 
| 
       29 
41 
     | 
    
         
             
                  end
         
     | 
| 
       30 
42 
     | 
    
         
             
                end
         
     | 
| 
       31 
43 
     | 
    
         
             
              end
         
     | 
| 
         @@ -10,14 +10,18 @@ module Rubocop 
     | 
|
| 
       10 
10 
     | 
    
         
             
                    def investigate(processed_source)
         
     | 
| 
       11 
11 
     | 
    
         
             
                      processed_source.lines.each_with_index do |line, index|
         
     | 
| 
       12 
12 
     | 
    
         
             
                        if line =~ /.*[ \t]+$/
         
     | 
| 
       13 
     | 
    
         
            -
                           
     | 
| 
       14 
     | 
    
         
            -
             
     | 
| 
       15 
     | 
    
         
            -
             
     | 
| 
       16 
     | 
    
         
            -
             
     | 
| 
       17 
     | 
    
         
            -
             
     | 
| 
      
 13 
     | 
    
         
            +
                          range = source_range(processed_source.buffer,
         
     | 
| 
      
 14 
     | 
    
         
            +
                                               processed_source[0...index],
         
     | 
| 
      
 15 
     | 
    
         
            +
                                               line.rstrip.length,
         
     | 
| 
      
 16 
     | 
    
         
            +
                                               line.length - line.rstrip.length)
         
     | 
| 
      
 17 
     | 
    
         
            +
                          convention(range, range)
         
     | 
| 
       18 
18 
     | 
    
         
             
                        end
         
     | 
| 
       19 
19 
     | 
    
         
             
                      end
         
     | 
| 
       20 
20 
     | 
    
         
             
                    end
         
     | 
| 
      
 21 
     | 
    
         
            +
             
     | 
| 
      
 22 
     | 
    
         
            +
                    def autocorrect(range)
         
     | 
| 
      
 23 
     | 
    
         
            +
                      @corrections << ->(corrector) { corrector.remove(range) }
         
     | 
| 
      
 24 
     | 
    
         
            +
                    end
         
     | 
| 
       21 
25 
     | 
    
         
             
                  end
         
     | 
| 
       22 
26 
     | 
    
         
             
                end
         
     | 
| 
       23 
27 
     | 
    
         
             
              end
         
     | 
| 
         @@ -32,7 +32,6 @@ module Rubocop 
     | 
|
| 
       32 
32 
     | 
    
         
             
                        convention(node, :keyword,
         
     | 
| 
       33 
33 
     | 
    
         
             
                                   sprintf(MSG, kind, kind))
         
     | 
| 
       34 
34 
     | 
    
         
             
                      end
         
     | 
| 
       35 
     | 
    
         
            -
             
     | 
| 
       36 
35 
     | 
    
         
             
                    end
         
     | 
| 
       37 
36 
     | 
    
         | 
| 
       38 
37 
     | 
    
         
             
                    def exact_name_match?
         
     | 
| 
         @@ -67,7 +66,7 @@ module Rubocop 
     | 
|
| 
       67 
66 
     | 
    
         
             
                    end
         
     | 
| 
       68 
67 
     | 
    
         | 
| 
       69 
68 
     | 
    
         
             
                    def looks_like_trivial_writer?(args, body)
         
     | 
| 
       70 
     | 
    
         
            -
                      args.children.size == 1 &&
         
     | 
| 
      
 69 
     | 
    
         
            +
                      args.children.size == 1 && args.children[0].type != :restarg &&
         
     | 
| 
       71 
70 
     | 
    
         
             
                        body && body.type == :ivasgn &&
         
     | 
| 
       72 
71 
     | 
    
         
             
                        body.children[1] && body.children[1].type == :lvar
         
     | 
| 
       73 
72 
     | 
    
         
             
                    end
         
     | 
| 
         @@ -18,13 +18,24 @@ module Rubocop 
     | 
|
| 
       18 
18 
     | 
    
         | 
| 
       19 
19 
     | 
    
         
             
                      string_array = array_elems.all? { |e| e.type == :str }
         
     | 
| 
       20 
20 
     | 
    
         | 
| 
       21 
     | 
    
         
            -
                      if string_array && !complex_content?(array_elems)
         
     | 
| 
      
 21 
     | 
    
         
            +
                      if string_array && !complex_content?(array_elems) &&
         
     | 
| 
      
 22 
     | 
    
         
            +
                        array_elems.size > min_size && !comments_in_array?(node)
         
     | 
| 
       22 
23 
     | 
    
         
             
                        convention(node, :expression)
         
     | 
| 
       23 
24 
     | 
    
         
             
                      end
         
     | 
| 
       24 
25 
     | 
    
         
             
                    end
         
     | 
| 
       25 
26 
     | 
    
         | 
| 
       26 
27 
     | 
    
         
             
                    private
         
     | 
| 
       27 
28 
     | 
    
         | 
| 
      
 29 
     | 
    
         
            +
                    def comments_in_array?(node)
         
     | 
| 
      
 30 
     | 
    
         
            +
                      comments = processed_source.comments
         
     | 
| 
      
 31 
     | 
    
         
            +
             
     | 
| 
      
 32 
     | 
    
         
            +
                      array_range = node.loc.expression.to_a
         
     | 
| 
      
 33 
     | 
    
         
            +
             
     | 
| 
      
 34 
     | 
    
         
            +
                      comments.any? do |comment|
         
     | 
| 
      
 35 
     | 
    
         
            +
                        !(comment.loc.expression.to_a & array_range).empty?
         
     | 
| 
      
 36 
     | 
    
         
            +
                      end
         
     | 
| 
      
 37 
     | 
    
         
            +
                    end
         
     | 
| 
      
 38 
     | 
    
         
            +
             
     | 
| 
       28 
39 
     | 
    
         
             
                    def complex_content?(arr_sexp)
         
     | 
| 
       29 
40 
     | 
    
         
             
                      arr_sexp.each do |s|
         
     | 
| 
       30 
41 
     | 
    
         
             
                        source = s.loc.expression.source
         
     | 
| 
         @@ -36,6 +47,10 @@ module Rubocop 
     | 
|
| 
       36 
47 
     | 
    
         | 
| 
       37 
48 
     | 
    
         
             
                      false
         
     | 
| 
       38 
49 
     | 
    
         
             
                    end
         
     | 
| 
      
 50 
     | 
    
         
            +
             
     | 
| 
      
 51 
     | 
    
         
            +
                    def min_size
         
     | 
| 
      
 52 
     | 
    
         
            +
                      cop_config['MinSize']
         
     | 
| 
      
 53 
     | 
    
         
            +
                    end
         
     | 
| 
       39 
54 
     | 
    
         
             
                  end
         
     | 
| 
       40 
55 
     | 
    
         
             
                end
         
     | 
| 
       41 
56 
     | 
    
         
             
              end
         
     | 
    
        data/lib/rubocop/cop/team.rb
    CHANGED
    
    | 
         @@ -9,12 +9,12 @@ module Rubocop 
     | 
|
| 
       9 
9 
     | 
    
         
             
                  def initialize(cop_classes, config, options = nil)
         
     | 
| 
       10 
10 
     | 
    
         
             
                    @cop_classes = cop_classes
         
     | 
| 
       11 
11 
     | 
    
         
             
                    @config = config
         
     | 
| 
       12 
     | 
    
         
            -
                    @options = options || {  
     | 
| 
      
 12 
     | 
    
         
            +
                    @options = options || { auto_correct: false, debug: false }
         
     | 
| 
       13 
13 
     | 
    
         
             
                    @errors = []
         
     | 
| 
       14 
14 
     | 
    
         
             
                  end
         
     | 
| 
       15 
15 
     | 
    
         | 
| 
       16 
16 
     | 
    
         
             
                  def autocorrect?
         
     | 
| 
       17 
     | 
    
         
            -
                    @options[: 
     | 
| 
      
 17 
     | 
    
         
            +
                    @options[:auto_correct]
         
     | 
| 
       18 
18 
     | 
    
         
             
                  end
         
     | 
| 
       19 
19 
     | 
    
         | 
| 
       20 
20 
     | 
    
         
             
                  def debug?
         
     | 
| 
         @@ -25,9 +25,9 @@ module Rubocop 
     | 
|
| 
       25 
25 
     | 
    
         
             
                    begin
         
     | 
| 
       26 
26 
     | 
    
         
             
                      processed_source = SourceParser.parse_file(file)
         
     | 
| 
       27 
27 
     | 
    
         
             
                    rescue Encoding::UndefinedConversionError, ArgumentError => e
         
     | 
| 
       28 
     | 
    
         
            -
                       
     | 
| 
       29 
     | 
    
         
            -
             
     | 
| 
       30 
     | 
    
         
            -
             
     | 
| 
      
 28 
     | 
    
         
            +
                      range = Struct.new(:line, :column, :source_line).new(1, 0, '')
         
     | 
| 
      
 29 
     | 
    
         
            +
                      return [Offence.new(:fatal, range, e.message.capitalize + '.',
         
     | 
| 
      
 30 
     | 
    
         
            +
                                          'Parser')]
         
     | 
| 
       31 
31 
     | 
    
         
             
                    end
         
     | 
| 
       32 
32 
     | 
    
         | 
| 
       33 
33 
     | 
    
         
             
                    # If we got any syntax errors, return only the syntax offences.
         
     | 
    
        data/lib/rubocop/cop/util.rb
    CHANGED
    
    
    
        data/lib/rubocop/options.rb
    CHANGED
    
    | 
         @@ -7,12 +7,10 @@ module Rubocop 
     | 
|
| 
       7 
7 
     | 
    
         
             
              class Options
         
     | 
| 
       8 
8 
     | 
    
         
             
                DEFAULT_FORMATTER = 'progress'
         
     | 
| 
       9 
9 
     | 
    
         | 
| 
       10 
     | 
    
         
            -
                def initialize 
     | 
| 
       11 
     | 
    
         
            -
                  @config_store = config_store
         
     | 
| 
      
 10 
     | 
    
         
            +
                def initialize
         
     | 
| 
       12 
11 
     | 
    
         
             
                  @options = {}
         
     | 
| 
       13 
12 
     | 
    
         
             
                end
         
     | 
| 
       14 
13 
     | 
    
         | 
| 
       15 
     | 
    
         
            -
                # rubocop:disable MethodLength
         
     | 
| 
       16 
14 
     | 
    
         
             
                def parse(args)
         
     | 
| 
       17 
15 
     | 
    
         
             
                  ignore_dropped_options(args)
         
     | 
| 
       18 
16 
     | 
    
         
             
                  convert_deprecated_options(args)
         
     | 
| 
         @@ -20,89 +18,91 @@ module Rubocop 
     | 
|
| 
       20 
18 
     | 
    
         
             
                  OptionParser.new do |opts|
         
     | 
| 
       21 
19 
     | 
    
         
             
                    opts.banner = 'Usage: rubocop [options] [file1, file2, ...]'
         
     | 
| 
       22 
20 
     | 
    
         | 
| 
       23 
     | 
    
         
            -
                    opts 
     | 
| 
       24 
     | 
    
         
            -
                      @options[:debug] = d
         
     | 
| 
       25 
     | 
    
         
            -
                    end
         
     | 
| 
       26 
     | 
    
         
            -
                    opts.on('-c', '--config FILE', 'Specify configuration file.') do |f|
         
     | 
| 
       27 
     | 
    
         
            -
                      @options[:config] = f
         
     | 
| 
       28 
     | 
    
         
            -
                      @config_store.set_options_config(@options[:config])
         
     | 
| 
       29 
     | 
    
         
            -
                    end
         
     | 
| 
       30 
     | 
    
         
            -
                    opts.on('--only COP', 'Run just one cop.') do |s|
         
     | 
| 
       31 
     | 
    
         
            -
                      @options[:only] = s
         
     | 
| 
      
 21 
     | 
    
         
            +
                    option(opts, '--only COP', 'Run just one cop.') do
         
     | 
| 
       32 
22 
     | 
    
         
             
                      validate_only_option
         
     | 
| 
       33 
23 
     | 
    
         
             
                    end
         
     | 
| 
       34 
     | 
    
         
            -
             
     | 
| 
       35 
     | 
    
         
            -
             
     | 
| 
       36 
     | 
    
         
            -
             
     | 
| 
       37 
     | 
    
         
            -
             
     | 
| 
       38 
     | 
    
         
            -
             
     | 
| 
       39 
     | 
    
         
            -
             
     | 
| 
       40 
     | 
    
         
            -
                                               [Formatter::DisabledConfigFormatter,
         
     | 
| 
       41 
     | 
    
         
            -
                                                ConfigLoader::AUTO_GENERATED_FILE]
         
     | 
| 
       42 
     | 
    
         
            -
                                              ]
         
     | 
| 
       43 
     | 
    
         
            -
                      validate_auto_gen_config_option(args)
         
     | 
| 
       44 
     | 
    
         
            -
                    end
         
     | 
| 
       45 
     | 
    
         
            -
                    opts.on('--show-cops',
         
     | 
| 
       46 
     | 
    
         
            -
                            'Shows cops and their config for the',
         
     | 
| 
       47 
     | 
    
         
            -
                            'current directory.') do
         
     | 
| 
       48 
     | 
    
         
            -
                      print_available_cops
         
     | 
| 
       49 
     | 
    
         
            -
                      exit(0)
         
     | 
| 
       50 
     | 
    
         
            -
                    end
         
     | 
| 
       51 
     | 
    
         
            -
                    opts.on('-f', '--format FORMATTER',
         
     | 
| 
       52 
     | 
    
         
            -
                            'Choose an output formatter. This option',
         
     | 
| 
       53 
     | 
    
         
            -
                            'can be specified multiple times to enable',
         
     | 
| 
       54 
     | 
    
         
            -
                            'multiple formatters at the same time.',
         
     | 
| 
       55 
     | 
    
         
            -
                            '  [p]rogress (default)',
         
     | 
| 
       56 
     | 
    
         
            -
                            '  [s]imple',
         
     | 
| 
       57 
     | 
    
         
            -
                            '  [c]lang',
         
     | 
| 
       58 
     | 
    
         
            -
                            '  [e]macs',
         
     | 
| 
       59 
     | 
    
         
            -
                            '  [j]son',
         
     | 
| 
       60 
     | 
    
         
            -
                            '  [f]iles',
         
     | 
| 
       61 
     | 
    
         
            -
                            '  [o]ffences',
         
     | 
| 
       62 
     | 
    
         
            -
                            '  custom formatter class name') do |key|
         
     | 
| 
       63 
     | 
    
         
            -
                      @options[:formatters] ||= []
         
     | 
| 
       64 
     | 
    
         
            -
                      @options[:formatters] << [key]
         
     | 
| 
       65 
     | 
    
         
            -
                    end
         
     | 
| 
       66 
     | 
    
         
            -
                    opts.on('-o', '--out FILE',
         
     | 
| 
       67 
     | 
    
         
            -
                            'Write output to a file instead of STDOUT.',
         
     | 
| 
       68 
     | 
    
         
            -
                            'This option applies to the previously',
         
     | 
| 
       69 
     | 
    
         
            -
                            'specified --format, or the default format',
         
     | 
| 
       70 
     | 
    
         
            -
                            'if no format is specified.') do |path|
         
     | 
| 
       71 
     | 
    
         
            -
                      @options[:formatters] ||= [[DEFAULT_FORMATTER]]
         
     | 
| 
       72 
     | 
    
         
            -
                      @options[:formatters].last << path
         
     | 
| 
       73 
     | 
    
         
            -
                    end
         
     | 
| 
       74 
     | 
    
         
            -
                    opts.on('-r', '--require FILE', 'Require Ruby file.') do |f|
         
     | 
| 
      
 24 
     | 
    
         
            +
             
     | 
| 
      
 25 
     | 
    
         
            +
                    option(opts, '-c', '--config FILE', 'Specify configuration file.')
         
     | 
| 
      
 26 
     | 
    
         
            +
             
     | 
| 
      
 27 
     | 
    
         
            +
                    add_formatting_options(opts, args)
         
     | 
| 
      
 28 
     | 
    
         
            +
             
     | 
| 
      
 29 
     | 
    
         
            +
                    option(opts, '-r', '--require FILE', 'Require Ruby file.') do |f|
         
     | 
| 
       75 
30 
     | 
    
         
             
                      require f
         
     | 
| 
       76 
31 
     | 
    
         
             
                    end
         
     | 
| 
       77 
     | 
    
         
            -
             
     | 
| 
       78 
     | 
    
         
            -
             
     | 
| 
       79 
     | 
    
         
            -
                    end
         
     | 
| 
       80 
     | 
    
         
            -
                    opts.on('-l', '--lint', 'Run only lint cops.') do |l|
         
     | 
| 
       81 
     | 
    
         
            -
                      @options[:lint] = l
         
     | 
| 
       82 
     | 
    
         
            -
                    end
         
     | 
| 
       83 
     | 
    
         
            -
                    opts.on('-a', '--auto-correct', 'Auto-correct offences.') do |a|
         
     | 
| 
       84 
     | 
    
         
            -
                      @options[:autocorrect] = a
         
     | 
| 
       85 
     | 
    
         
            -
                    end
         
     | 
| 
       86 
     | 
    
         
            -
                    opts.on('-n', '--no-color', 'Disable color output.') do |s|
         
     | 
| 
       87 
     | 
    
         
            -
                      Sickill::Rainbow.enabled = false
         
     | 
| 
       88 
     | 
    
         
            -
                    end
         
     | 
| 
       89 
     | 
    
         
            -
                    opts.on('-v', '--version', 'Display version.') do
         
     | 
| 
       90 
     | 
    
         
            -
                      puts Rubocop::Version.version(false)
         
     | 
| 
       91 
     | 
    
         
            -
                      exit(0)
         
     | 
| 
       92 
     | 
    
         
            -
                    end
         
     | 
| 
       93 
     | 
    
         
            -
                    opts.on('-V', '--verbose-version', 'Display verbose version.') do
         
     | 
| 
       94 
     | 
    
         
            -
                      puts Rubocop::Version.version(true)
         
     | 
| 
       95 
     | 
    
         
            -
                      exit(0)
         
     | 
| 
       96 
     | 
    
         
            -
                    end
         
     | 
| 
      
 32 
     | 
    
         
            +
             
     | 
| 
      
 33 
     | 
    
         
            +
                    add_boolean_flags(opts)
         
     | 
| 
       97 
34 
     | 
    
         
             
                  end.parse!(args)
         
     | 
| 
       98 
35 
     | 
    
         | 
| 
       99 
     | 
    
         
            -
                   
     | 
| 
       100 
     | 
    
         
            -
                  [@options, target_files]
         
     | 
| 
      
 36 
     | 
    
         
            +
                  [@options, args]
         
     | 
| 
       101 
37 
     | 
    
         
             
                end
         
     | 
| 
       102 
     | 
    
         
            -
                # rubocop:enable MethodLength
         
     | 
| 
       103 
38 
     | 
    
         | 
| 
       104 
39 
     | 
    
         
             
                private
         
     | 
| 
       105 
40 
     | 
    
         | 
| 
      
 41 
     | 
    
         
            +
                FORMAT_HELP = ['Choose an output formatter. This option',
         
     | 
| 
      
 42 
     | 
    
         
            +
                               'can be specified multiple times to enable',
         
     | 
| 
      
 43 
     | 
    
         
            +
                               'multiple formatters at the same time.',
         
     | 
| 
      
 44 
     | 
    
         
            +
                               '  [p]rogress (default)',
         
     | 
| 
      
 45 
     | 
    
         
            +
                               '  [s]imple',
         
     | 
| 
      
 46 
     | 
    
         
            +
                               '  [c]lang',
         
     | 
| 
      
 47 
     | 
    
         
            +
                               '  [e]macs',
         
     | 
| 
      
 48 
     | 
    
         
            +
                               '  [j]son',
         
     | 
| 
      
 49 
     | 
    
         
            +
                               '  [f]iles',
         
     | 
| 
      
 50 
     | 
    
         
            +
                               '  [o]ffences',
         
     | 
| 
      
 51 
     | 
    
         
            +
                               '  custom formatter class name']
         
     | 
| 
      
 52 
     | 
    
         
            +
             
     | 
| 
      
 53 
     | 
    
         
            +
                def add_formatting_options(opts, args)
         
     | 
| 
      
 54 
     | 
    
         
            +
                  option(opts, '--auto-gen-config',
         
     | 
| 
      
 55 
     | 
    
         
            +
                         'Generate a configuration file acting as a', 'TODO list.') do
         
     | 
| 
      
 56 
     | 
    
         
            +
                    validate_auto_gen_config_option(args)
         
     | 
| 
      
 57 
     | 
    
         
            +
                    @options[:formatters] = [[DEFAULT_FORMATTER],
         
     | 
| 
      
 58 
     | 
    
         
            +
                                             [Formatter::DisabledConfigFormatter,
         
     | 
| 
      
 59 
     | 
    
         
            +
                                              ConfigLoader::AUTO_GENERATED_FILE]]
         
     | 
| 
      
 60 
     | 
    
         
            +
                  end
         
     | 
| 
      
 61 
     | 
    
         
            +
             
     | 
| 
      
 62 
     | 
    
         
            +
                  option(opts, '-f', '--format FORMATTER', *FORMAT_HELP) do |key|
         
     | 
| 
      
 63 
     | 
    
         
            +
                    @options[:formatters] ||= []
         
     | 
| 
      
 64 
     | 
    
         
            +
                    @options[:formatters] << [key]
         
     | 
| 
      
 65 
     | 
    
         
            +
                  end
         
     | 
| 
      
 66 
     | 
    
         
            +
             
     | 
| 
      
 67 
     | 
    
         
            +
                  option(opts, '-o', '--out FILE',
         
     | 
| 
      
 68 
     | 
    
         
            +
                         'Write output to a file instead of STDOUT.',
         
     | 
| 
      
 69 
     | 
    
         
            +
                         'This option applies to the previously',
         
     | 
| 
      
 70 
     | 
    
         
            +
                         'specified --format, or the default format',
         
     | 
| 
      
 71 
     | 
    
         
            +
                         'if no format is specified.') do |path|
         
     | 
| 
      
 72 
     | 
    
         
            +
                    @options[:formatters] ||= [[DEFAULT_FORMATTER]]
         
     | 
| 
      
 73 
     | 
    
         
            +
                    @options[:formatters].last << path
         
     | 
| 
      
 74 
     | 
    
         
            +
                  end
         
     | 
| 
      
 75 
     | 
    
         
            +
                end
         
     | 
| 
      
 76 
     | 
    
         
            +
             
     | 
| 
      
 77 
     | 
    
         
            +
                def add_boolean_flags(opts)
         
     | 
| 
      
 78 
     | 
    
         
            +
                  option(opts, '--show-cops',
         
     | 
| 
      
 79 
     | 
    
         
            +
                         'Shows cops and their config for the',
         
     | 
| 
      
 80 
     | 
    
         
            +
                         'current directory.')
         
     | 
| 
      
 81 
     | 
    
         
            +
                  option(opts, '-d', '--debug', 'Display debug info.')
         
     | 
| 
      
 82 
     | 
    
         
            +
                  option(opts, '-R', '--rails', 'Run extra Rails cops.')
         
     | 
| 
      
 83 
     | 
    
         
            +
                  option(opts, '-l', '--lint', 'Run only lint cops.')
         
     | 
| 
      
 84 
     | 
    
         
            +
                  option(opts, '-a', '--auto-correct', 'Auto-correct offences.')
         
     | 
| 
      
 85 
     | 
    
         
            +
                  option(opts, '-n', '--no-color', 'Disable color output.')
         
     | 
| 
      
 86 
     | 
    
         
            +
                  option(opts, '-v', '--version', 'Display version.')
         
     | 
| 
      
 87 
     | 
    
         
            +
                  option(opts, '-V', '--verbose-version', 'Display verbose version.')
         
     | 
| 
      
 88 
     | 
    
         
            +
                end
         
     | 
| 
      
 89 
     | 
    
         
            +
             
     | 
| 
      
 90 
     | 
    
         
            +
                # Sets a value in the @options hash, based on the given long option and its
         
     | 
| 
      
 91 
     | 
    
         
            +
                # value, in addition to calling the block if a block is given.
         
     | 
| 
      
 92 
     | 
    
         
            +
                def option(opts, *args)
         
     | 
| 
      
 93 
     | 
    
         
            +
                  opts.on(*args) do |arg|
         
     | 
| 
      
 94 
     | 
    
         
            +
                    @options[long_opt_symbol(args)] = arg
         
     | 
| 
      
 95 
     | 
    
         
            +
                    yield arg if block_given?
         
     | 
| 
      
 96 
     | 
    
         
            +
                  end
         
     | 
| 
      
 97 
     | 
    
         
            +
                end
         
     | 
| 
      
 98 
     | 
    
         
            +
             
     | 
| 
      
 99 
     | 
    
         
            +
                # Finds the option in `args` starting with -- and converts it to a symbol,
         
     | 
| 
      
 100 
     | 
    
         
            +
                # e.g. [..., '--auto-correct', ...] to :auto_correct.
         
     | 
| 
      
 101 
     | 
    
         
            +
                def long_opt_symbol(args)
         
     | 
| 
      
 102 
     | 
    
         
            +
                  long_opt = args.find { |arg| arg.start_with?('--') }
         
     | 
| 
      
 103 
     | 
    
         
            +
                  long_opt[2..-1].sub(/ .*/, '').gsub(/-/, '_').to_sym
         
     | 
| 
      
 104 
     | 
    
         
            +
                end
         
     | 
| 
      
 105 
     | 
    
         
            +
             
     | 
| 
       106 
106 
     | 
    
         
             
                def ignore_dropped_options(args)
         
     | 
| 
       107 
107 
     | 
    
         
             
                  # Currently we don't make -s/--silent option raise error
         
     | 
| 
       108 
108 
     | 
    
         
             
                  # since those are mostly used by external tools.
         
     | 
| 
         @@ -144,41 +144,6 @@ module Rubocop 
     | 
|
| 
       144 
144 
     | 
    
         
             
                    fail ArgumentError,
         
     | 
| 
       145 
145 
     | 
    
         
             
                         '--auto-gen-config can not be combined with any other arguments.'
         
     | 
| 
       146 
146 
     | 
    
         
             
                  end
         
     | 
| 
       147 
     | 
    
         
            -
             
     | 
| 
       148 
     | 
    
         
            -
                  target_finder.find(args).each do |file|
         
     | 
| 
       149 
     | 
    
         
            -
                    config = @config_store.for(file)
         
     | 
| 
       150 
     | 
    
         
            -
                    if @options[:auto_gen_config] && config.contains_auto_generated_config
         
     | 
| 
       151 
     | 
    
         
            -
                      fail "Remove #{ConfigLoader::AUTO_GENERATED_FILE} from the " +
         
     | 
| 
       152 
     | 
    
         
            -
                        'current configuration before generating it again.'
         
     | 
| 
       153 
     | 
    
         
            -
                    end
         
     | 
| 
       154 
     | 
    
         
            -
                  end
         
     | 
| 
       155 
     | 
    
         
            -
                end
         
     | 
| 
       156 
     | 
    
         
            -
             
     | 
| 
       157 
     | 
    
         
            -
                def target_finder
         
     | 
| 
       158 
     | 
    
         
            -
                  @target_finder ||= TargetFinder.new(@config_store, @options[:debug])
         
     | 
| 
       159 
     | 
    
         
            -
                end
         
     | 
| 
       160 
     | 
    
         
            -
             
     | 
| 
       161 
     | 
    
         
            -
                def print_available_cops
         
     | 
| 
       162 
     | 
    
         
            -
                  cops = Cop::Cop.all
         
     | 
| 
       163 
     | 
    
         
            -
                  puts "Available cops (#{cops.length}) + config for #{Dir.pwd.to_s}: "
         
     | 
| 
       164 
     | 
    
         
            -
                  dirconf = @config_store.for(Dir.pwd.to_s)
         
     | 
| 
       165 
     | 
    
         
            -
                  cops.types.sort!.each do |type|
         
     | 
| 
       166 
     | 
    
         
            -
                    coptypes = cops.with_type(type).sort_by!(&:cop_name)
         
     | 
| 
       167 
     | 
    
         
            -
                    puts "Type '#{type.to_s.capitalize}' (#{coptypes.size}):"
         
     | 
| 
       168 
     | 
    
         
            -
                    coptypes.each do |cop|
         
     | 
| 
       169 
     | 
    
         
            -
                      puts " - #{cop.cop_name}"
         
     | 
| 
       170 
     | 
    
         
            -
                      cnf = dirconf.for_cop(cop).dup
         
     | 
| 
       171 
     | 
    
         
            -
                      print_conf_option('Description',
         
     | 
| 
       172 
     | 
    
         
            -
                                        cnf.delete('Description') { 'None' })
         
     | 
| 
       173 
     | 
    
         
            -
                      cnf.each { |k, v| print_conf_option(k, v) }
         
     | 
| 
       174 
     | 
    
         
            -
                      print_conf_option('SupportsAutoCorrection',
         
     | 
| 
       175 
     | 
    
         
            -
                                        cop.new.support_autocorrect?.to_s)
         
     | 
| 
       176 
     | 
    
         
            -
                    end
         
     | 
| 
       177 
     | 
    
         
            -
                  end
         
     | 
| 
       178 
     | 
    
         
            -
                end
         
     | 
| 
       179 
     | 
    
         
            -
             
     | 
| 
       180 
     | 
    
         
            -
                def print_conf_option(option, value)
         
     | 
| 
       181 
     | 
    
         
            -
                  puts  "    - #{option}: #{value}"
         
     | 
| 
       182 
147 
     | 
    
         
             
                end
         
     | 
| 
       183 
148 
     | 
    
         
             
              end
         
     | 
| 
       184 
149 
     | 
    
         
             
            end
         
     | 
    
        data/lib/rubocop/rake_task.rb
    CHANGED
    
    | 
         @@ -1,6 +1,5 @@ 
     | 
|
| 
       1 
1 
     | 
    
         
             
            # encoding: utf-8
         
     | 
| 
       2 
2 
     | 
    
         | 
| 
       3 
     | 
    
         
            -
            require 'rubocop'
         
     | 
| 
       4 
3 
     | 
    
         
             
            require 'rake'
         
     | 
| 
       5 
4 
     | 
    
         
             
            require 'rake/tasklib'
         
     | 
| 
       6 
5 
     | 
    
         | 
| 
         @@ -10,7 +9,6 @@ module Rubocop 
     | 
|
| 
       10 
9 
     | 
    
         
             
              # require 'rubocop/rake_task'
         
     | 
| 
       11 
10 
     | 
    
         
             
              # Rubocop::RakeTask.new
         
     | 
| 
       12 
11 
     | 
    
         
             
              class RakeTask < Rake::TaskLib
         
     | 
| 
       13 
     | 
    
         
            -
             
     | 
| 
       14 
12 
     | 
    
         
             
                attr_accessor :name
         
     | 
| 
       15 
13 
     | 
    
         
             
                attr_accessor :verbose
         
     | 
| 
       16 
14 
     | 
    
         
             
                attr_accessor :fail_on_error
         
     | 
| 
         @@ -32,6 +30,10 @@ module Rubocop 
     | 
|
| 
       32 
30 
     | 
    
         
             
                end
         
     | 
| 
       33 
31 
     | 
    
         | 
| 
       34 
32 
     | 
    
         
             
                def run_task(verbose)
         
     | 
| 
      
 33 
     | 
    
         
            +
                  # We lazy-load rubocop so that the task doesn't dramatically impact the
         
     | 
| 
      
 34 
     | 
    
         
            +
                  # load time of your Rakefile.
         
     | 
| 
      
 35 
     | 
    
         
            +
                  require 'rubocop'
         
     | 
| 
      
 36 
     | 
    
         
            +
             
     | 
| 
       35 
37 
     | 
    
         
             
                  cli = CLI.new
         
     | 
| 
       36 
38 
     | 
    
         
             
                  puts 'Running RuboCop...' if verbose
         
     | 
| 
       37 
39 
     | 
    
         
             
                  result = cli.run(patterns)
         
     | 
| 
         @@ -42,13 +42,13 @@ module Rubocop 
     | 
|
| 
       42 
42 
     | 
    
         
             
                # @return [Array] Array of filenames
         
     | 
| 
       43 
43 
     | 
    
         
             
                def target_files_in_dir(base_dir = Dir.pwd)
         
     | 
| 
       44 
44 
     | 
    
         
             
                  files = Dir["#{base_dir}/**/*"].select { |path| FileTest.file?(path) }
         
     | 
| 
      
 45 
     | 
    
         
            +
                  base_dir_config = @config_store.for("#{base_dir}/foobar.rb")
         
     | 
| 
       45 
46 
     | 
    
         | 
| 
       46 
47 
     | 
    
         
             
                  target_files = files.select do |file|
         
     | 
| 
       47 
     | 
    
         
            -
                     
     | 
| 
       48 
     | 
    
         
            -
                    next false if config.file_to_exclude?(file)
         
     | 
| 
      
 48 
     | 
    
         
            +
                    next false if base_dir_config.file_to_exclude?(file)
         
     | 
| 
       49 
49 
     | 
    
         
             
                    next true if File.extname(file) == '.rb'
         
     | 
| 
       50 
50 
     | 
    
         
             
                    next true if ruby_executable?(file)
         
     | 
| 
       51 
     | 
    
         
            -
                     
     | 
| 
      
 51 
     | 
    
         
            +
                    @config_store.for(file).file_to_include?(file)
         
     | 
| 
       52 
52 
     | 
    
         
             
                  end
         
     | 
| 
       53 
53 
     | 
    
         | 
| 
       54 
54 
     | 
    
         
             
                  target_files.uniq
         
     | 
    
        data/lib/rubocop/version.rb
    CHANGED
    
    
    
        data/spec/rubocop/cli_spec.rb
    CHANGED
    
    | 
         @@ -25,6 +25,14 @@ describe Rubocop::CLI, :isolated_environment do 
     | 
|
| 
       25 
25 
     | 
    
         
             
              end
         
     | 
| 
       26 
26 
     | 
    
         | 
| 
       27 
27 
     | 
    
         
             
              describe 'option' do
         
     | 
| 
      
 28 
     | 
    
         
            +
                describe '--version' do
         
     | 
| 
      
 29 
     | 
    
         
            +
                  it 'exits cleanly' do
         
     | 
| 
      
 30 
     | 
    
         
            +
                    expect { cli.run ['-v'] }.to exit_with_code(0)
         
     | 
| 
      
 31 
     | 
    
         
            +
                    expect { cli.run ['--version'] }.to exit_with_code(0)
         
     | 
| 
      
 32 
     | 
    
         
            +
                    expect($stdout.string).to eq((Rubocop::Version::STRING + "\n") * 2)
         
     | 
| 
      
 33 
     | 
    
         
            +
                  end
         
     | 
| 
      
 34 
     | 
    
         
            +
                end
         
     | 
| 
      
 35 
     | 
    
         
            +
             
     | 
| 
       28 
36 
     | 
    
         
             
                describe '--auto-gen-config' do
         
     | 
| 
       29 
37 
     | 
    
         
             
                  it 'exits with error if asked to re-generate a todo list that is in ' +
         
     | 
| 
       30 
38 
     | 
    
         
             
                    'use' do
         
     | 
| 
         @@ -171,6 +179,88 @@ describe Rubocop::CLI, :isolated_environment do 
     | 
|
| 
       171 
179 
     | 
    
         
             
                  end
         
     | 
| 
       172 
180 
     | 
    
         
             
                end
         
     | 
| 
       173 
181 
     | 
    
         | 
| 
      
 182 
     | 
    
         
            +
                describe '--show-cops' do
         
     | 
| 
      
 183 
     | 
    
         
            +
                  let(:cops) { Rubocop::Cop::Cop.all }
         
     | 
| 
      
 184 
     | 
    
         
            +
             
     | 
| 
      
 185 
     | 
    
         
            +
                  let(:global_conf) do
         
     | 
| 
      
 186 
     | 
    
         
            +
                    config_path =
         
     | 
| 
      
 187 
     | 
    
         
            +
                      Rubocop::ConfigLoader.configuration_file_for(Dir.pwd.to_s)
         
     | 
| 
      
 188 
     | 
    
         
            +
                    Rubocop::ConfigLoader.configuration_from_file(config_path)
         
     | 
| 
      
 189 
     | 
    
         
            +
                  end
         
     | 
| 
      
 190 
     | 
    
         
            +
             
     | 
| 
      
 191 
     | 
    
         
            +
                  let(:stdout) { $stdout.string }
         
     | 
| 
      
 192 
     | 
    
         
            +
             
     | 
| 
      
 193 
     | 
    
         
            +
                  before do
         
     | 
| 
      
 194 
     | 
    
         
            +
                    expect { cli.run ['--show-cops'] }.to exit_with_code(0)
         
     | 
| 
      
 195 
     | 
    
         
            +
                  end
         
     | 
| 
      
 196 
     | 
    
         
            +
             
     | 
| 
      
 197 
     | 
    
         
            +
                  # Extracts the first line out of the description
         
     | 
| 
      
 198 
     | 
    
         
            +
                  def short_description_of_cop(cop)
         
     | 
| 
      
 199 
     | 
    
         
            +
                    desc = full_description_of_cop(cop)
         
     | 
| 
      
 200 
     | 
    
         
            +
                    desc ? desc.lines.first.strip : ''
         
     | 
| 
      
 201 
     | 
    
         
            +
                  end
         
     | 
| 
      
 202 
     | 
    
         
            +
             
     | 
| 
      
 203 
     | 
    
         
            +
                  # Gets the full description of the cop or nil if no description is set.
         
     | 
| 
      
 204 
     | 
    
         
            +
                  def full_description_of_cop(cop)
         
     | 
| 
      
 205 
     | 
    
         
            +
                    cop_config = global_conf.for_cop(cop)
         
     | 
| 
      
 206 
     | 
    
         
            +
                    cop_config['Description']
         
     | 
| 
      
 207 
     | 
    
         
            +
                  end
         
     | 
| 
      
 208 
     | 
    
         
            +
             
     | 
| 
      
 209 
     | 
    
         
            +
                  it 'prints all available cops and their description' do
         
     | 
| 
      
 210 
     | 
    
         
            +
                    cops.each do |cop|
         
     | 
| 
      
 211 
     | 
    
         
            +
                      expect(stdout).to include cop.cop_name
         
     | 
| 
      
 212 
     | 
    
         
            +
                      expect(stdout).to include short_description_of_cop(cop)
         
     | 
| 
      
 213 
     | 
    
         
            +
                    end
         
     | 
| 
      
 214 
     | 
    
         
            +
                  end
         
     | 
| 
      
 215 
     | 
    
         
            +
             
     | 
| 
      
 216 
     | 
    
         
            +
                  it 'prints all types' do
         
     | 
| 
      
 217 
     | 
    
         
            +
                    cops
         
     | 
| 
      
 218 
     | 
    
         
            +
                      .types
         
     | 
| 
      
 219 
     | 
    
         
            +
                      .map(&:to_s)
         
     | 
| 
      
 220 
     | 
    
         
            +
                      .map(&:capitalize)
         
     | 
| 
      
 221 
     | 
    
         
            +
                      .each { |type| expect(stdout).to include(type) }
         
     | 
| 
      
 222 
     | 
    
         
            +
                  end
         
     | 
| 
      
 223 
     | 
    
         
            +
             
     | 
| 
      
 224 
     | 
    
         
            +
                  it 'prints all cops in their right type listing' do
         
     | 
| 
      
 225 
     | 
    
         
            +
                    lines = stdout.lines
         
     | 
| 
      
 226 
     | 
    
         
            +
                    lines.slice_before(/Type /).each do |slice|
         
     | 
| 
      
 227 
     | 
    
         
            +
                      types = cops.types.map(&:to_s).map(&:capitalize)
         
     | 
| 
      
 228 
     | 
    
         
            +
                      current = types.delete(slice.shift[/Type '(?<c>[^'']+)'/, 'c'])
         
     | 
| 
      
 229 
     | 
    
         
            +
                      # all cops in their type listing
         
     | 
| 
      
 230 
     | 
    
         
            +
                      cops.with_type(current).each do |cop|
         
     | 
| 
      
 231 
     | 
    
         
            +
                        expect(slice.any? { |l| l.include? cop.cop_name }).to be_true
         
     | 
| 
      
 232 
     | 
    
         
            +
                      end
         
     | 
| 
      
 233 
     | 
    
         
            +
             
     | 
| 
      
 234 
     | 
    
         
            +
                      # no cop in wrong type listing
         
     | 
| 
      
 235 
     | 
    
         
            +
                      types.each do |type|
         
     | 
| 
      
 236 
     | 
    
         
            +
                        cops.with_type(type).each do |cop|
         
     | 
| 
      
 237 
     | 
    
         
            +
                          expect(slice.any? { |l| l.include? cop.cop_name }).to be_false
         
     | 
| 
      
 238 
     | 
    
         
            +
                        end
         
     | 
| 
      
 239 
     | 
    
         
            +
                      end
         
     | 
| 
      
 240 
     | 
    
         
            +
                    end
         
     | 
| 
      
 241 
     | 
    
         
            +
                  end
         
     | 
| 
      
 242 
     | 
    
         
            +
             
     | 
| 
      
 243 
     | 
    
         
            +
                  it 'prints the current configuration' do
         
     | 
| 
      
 244 
     | 
    
         
            +
                    out = stdout.lines.to_a
         
     | 
| 
      
 245 
     | 
    
         
            +
                    cops.each do |cop|
         
     | 
| 
      
 246 
     | 
    
         
            +
                      conf = global_conf[cop.cop_name].dup
         
     | 
| 
      
 247 
     | 
    
         
            +
                      confstrt =
         
     | 
| 
      
 248 
     | 
    
         
            +
                        out.find_index { |i| i.include?("- #{cop.cop_name}") } + 1
         
     | 
| 
      
 249 
     | 
    
         
            +
                      c = out[confstrt, conf.keys.size].to_s
         
     | 
| 
      
 250 
     | 
    
         
            +
                      conf.delete('Description')
         
     | 
| 
      
 251 
     | 
    
         
            +
                      expect(c).to include(short_description_of_cop(cop))
         
     | 
| 
      
 252 
     | 
    
         
            +
                      conf.each do |k, v|
         
     | 
| 
      
 253 
     | 
    
         
            +
                        # ugly hack to get hash/array content tested
         
     | 
| 
      
 254 
     | 
    
         
            +
                        if v.kind_of?(Hash) || v.kind_of?(Array)
         
     | 
| 
      
 255 
     | 
    
         
            +
                          expect(c).to include "#{k}: #{v.to_s.dump[2, -2]}"
         
     | 
| 
      
 256 
     | 
    
         
            +
                        else
         
     | 
| 
      
 257 
     | 
    
         
            +
                          expect(c).to include "#{k}: #{v}"
         
     | 
| 
      
 258 
     | 
    
         
            +
                        end
         
     | 
| 
      
 259 
     | 
    
         
            +
                      end
         
     | 
| 
      
 260 
     | 
    
         
            +
                    end
         
     | 
| 
      
 261 
     | 
    
         
            +
                  end
         
     | 
| 
      
 262 
     | 
    
         
            +
                end
         
     | 
| 
      
 263 
     | 
    
         
            +
             
     | 
| 
       174 
264 
     | 
    
         
             
                describe '-f/--format' do
         
     | 
| 
       175 
265 
     | 
    
         
             
                  let(:target_file) { 'example.rb' }
         
     | 
| 
       176 
266 
     | 
    
         | 
| 
         @@ -498,7 +588,10 @@ describe Rubocop::CLI, :isolated_environment do 
     | 
|
| 
       498 
588 
     | 
    
         
             
                                           '# encoding: utf-8',
         
     | 
| 
       499 
589 
     | 
    
         
             
                                           "# #{'f9'.hex.chr}#{'29'.hex.chr}"
         
     | 
| 
       500 
590 
     | 
    
         
             
                                          ])
         
     | 
| 
       501 
     | 
    
         
            -
                expect(cli.run(['--format', 'emacs', 'example.rb'])).to eq( 
     | 
| 
      
 591 
     | 
    
         
            +
                expect(cli.run(['--format', 'emacs', 'example.rb'])).to eq(1)
         
     | 
| 
      
 592 
     | 
    
         
            +
                expect($stdout.string)
         
     | 
| 
      
 593 
     | 
    
         
            +
                  .to eq(["#{abs('example.rb')}:1:1: F: Invalid byte sequence in utf-8.",
         
     | 
| 
      
 594 
     | 
    
         
            +
                          ''].join("\n"))
         
     | 
| 
       502 
595 
     | 
    
         
             
              end
         
     | 
| 
       503 
596 
     | 
    
         | 
| 
       504 
597 
     | 
    
         
             
              describe 'rubocop:disable comment' do
         
     | 
| 
         @@ -927,6 +1020,31 @@ describe Rubocop::CLI, :isolated_environment do 
     | 
|
| 
       927 
1020 
     | 
    
         
             
                            ''].join("\n"))
         
     | 
| 
       928 
1021 
     | 
    
         
             
                end
         
     | 
| 
       929 
1022 
     | 
    
         | 
| 
      
 1023 
     | 
    
         
            +
                # Being immune to bad configuration files in excluded directories has
         
     | 
| 
      
 1024 
     | 
    
         
            +
                # become important due to a bug in rubygems
         
     | 
| 
      
 1025 
     | 
    
         
            +
                # (https://github.com/rubygems/rubygems/issues/680) that makes
         
     | 
| 
      
 1026 
     | 
    
         
            +
                # installations of, for example, rubocop lack their .rubocop.yml in the
         
     | 
| 
      
 1027 
     | 
    
         
            +
                # root directory.
         
     | 
| 
      
 1028 
     | 
    
         
            +
                it 'can exclude a vendor directory with an erroneous config file' do
         
     | 
| 
      
 1029 
     | 
    
         
            +
                  create_file('vendor/bundle/ruby/1.9.1/gems/parser-2.0.0/.rubocop.yml',
         
     | 
| 
      
 1030 
     | 
    
         
            +
                              ['inherit_from: non_existent.yml'])
         
     | 
| 
      
 1031 
     | 
    
         
            +
             
     | 
| 
      
 1032 
     | 
    
         
            +
                  create_file('vendor/bundle/ruby/1.9.1/gems/parser-2.0.0/lib/ex.rb',
         
     | 
| 
      
 1033 
     | 
    
         
            +
                              ['# encoding: utf-8',
         
     | 
| 
      
 1034 
     | 
    
         
            +
                               '#' * 90])
         
     | 
| 
      
 1035 
     | 
    
         
            +
             
     | 
| 
      
 1036 
     | 
    
         
            +
                  create_file('.rubocop.yml',
         
     | 
| 
      
 1037 
     | 
    
         
            +
                              ['AllCops:',
         
     | 
| 
      
 1038 
     | 
    
         
            +
                               '  Excludes:',
         
     | 
| 
      
 1039 
     | 
    
         
            +
                               '    - vendor/**'])
         
     | 
| 
      
 1040 
     | 
    
         
            +
             
     | 
| 
      
 1041 
     | 
    
         
            +
                  cli.run(%w(--format simple))
         
     | 
| 
      
 1042 
     | 
    
         
            +
                  expect($stderr.string).to eq('')
         
     | 
| 
      
 1043 
     | 
    
         
            +
                  expect($stdout.string)
         
     | 
| 
      
 1044 
     | 
    
         
            +
                    .to eq(['', '0 files inspected, no offences detected',
         
     | 
| 
      
 1045 
     | 
    
         
            +
                            ''].join("\n"))
         
     | 
| 
      
 1046 
     | 
    
         
            +
                end
         
     | 
| 
      
 1047 
     | 
    
         
            +
             
     | 
| 
       930 
1048 
     | 
    
         
             
                # Relative exclude paths in .rubocop.yml files are relative to that file,
         
     | 
| 
       931 
1049 
     | 
    
         
             
                # but in configuration files with other names they will be relative to
         
     | 
| 
       932 
1050 
     | 
    
         
             
                # whatever file inherits from them.
         
     | 
| 
         @@ -967,14 +1085,10 @@ describe Rubocop::CLI, :isolated_environment do 
     | 
|
| 
       967 
1085 
     | 
    
         
             
                                                      ])
         
     | 
| 
       968 
1086 
     | 
    
         | 
| 
       969 
1087 
     | 
    
         
             
                  expect(cli.run(%w(--format simple example))).to eq(1)
         
     | 
| 
       970 
     | 
    
         
            -
                  expect($ 
     | 
| 
      
 1088 
     | 
    
         
            +
                  expect($stderr.string)
         
     | 
| 
       971 
1089 
     | 
    
         
             
                    .to eq(
         
     | 
| 
       972 
1090 
     | 
    
         
             
                           ['Warning: unrecognized cop LyneLenth found in ' +
         
     | 
| 
       973 
     | 
    
         
            -
                             
     | 
| 
       974 
     | 
    
         
            -
                            '== example/example1.rb ==',
         
     | 
| 
       975 
     | 
    
         
            -
                            'C:  2: 80: Line is too long. [90/79]',
         
     | 
| 
       976 
     | 
    
         
            -
                            '',
         
     | 
| 
       977 
     | 
    
         
            -
                            '1 file inspected, 1 offence detected',
         
     | 
| 
      
 1091 
     | 
    
         
            +
                            abs('example/.rubocop.yml'),
         
     | 
| 
       978 
1092 
     | 
    
         
             
                            ''].join("\n"))
         
     | 
| 
       979 
1093 
     | 
    
         
             
                end
         
     | 
| 
       980 
1094 
     | 
    
         | 
| 
         @@ -991,14 +1105,10 @@ describe Rubocop::CLI, :isolated_environment do 
     | 
|
| 
       991 
1105 
     | 
    
         
             
                                                      ])
         
     | 
| 
       992 
1106 
     | 
    
         | 
| 
       993 
1107 
     | 
    
         
             
                  expect(cli.run(%w(--format simple example))).to eq(1)
         
     | 
| 
       994 
     | 
    
         
            -
                  expect($ 
     | 
| 
      
 1108 
     | 
    
         
            +
                  expect($stderr.string)
         
     | 
| 
       995 
1109 
     | 
    
         
             
                    .to eq(
         
     | 
| 
       996 
1110 
     | 
    
         
             
                           ['Warning: unrecognized parameter LineLength:Min found in ' +
         
     | 
| 
       997 
     | 
    
         
            -
                             
     | 
| 
       998 
     | 
    
         
            -
                            '== example/example1.rb ==',
         
     | 
| 
       999 
     | 
    
         
            -
                            'C:  2: 80: Line is too long. [90/79]',
         
     | 
| 
       1000 
     | 
    
         
            -
                            '',
         
     | 
| 
       1001 
     | 
    
         
            -
                            '1 file inspected, 1 offence detected',
         
     | 
| 
      
 1111 
     | 
    
         
            +
                            abs('example/.rubocop.yml'),
         
     | 
| 
       1002 
1112 
     | 
    
         
             
                            ''].join("\n"))
         
     | 
| 
       1003 
1113 
     | 
    
         
             
                end
         
     | 
| 
       1004 
1114 
     | 
    
         
             
              end
         
     |