reek 1.3.4 → 1.3.5
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/CHANGELOG +5 -0
- data/README.md +27 -2
- data/features/command_line_interface/options.feature +5 -2
- data/features/command_line_interface/smells_count.feature +43 -45
- data/features/command_line_interface/stdin.feature +9 -15
- data/features/configuration_files/masking_smells.feature +9 -17
- data/features/rake_task/rake_task.feature +4 -4
- data/features/reports/reports.feature +80 -21
- data/features/samples.feature +8 -18
- data/features/step_definitions/reek_steps.rb +4 -0
- data/lib/reek/cli/application.rb +3 -6
- data/lib/reek/cli/command_line.rb +16 -6
- data/lib/reek/cli/reek_command.rb +4 -12
- data/lib/reek/cli/report.rb +61 -19
- data/lib/reek/config_file_exception.rb +5 -0
- data/lib/reek/smells/control_parameter.rb +45 -14
- data/lib/reek/smells/data_clump.rb +15 -39
- data/lib/reek/smells/duplicate_method_call.rb +76 -26
- data/lib/reek/source/config_file.rb +30 -19
- data/lib/reek/source/sexp_extensions.rb +139 -0
- data/lib/reek/source/sexp_node.rb +64 -0
- data/lib/reek/source/source_code.rb +1 -1
- data/lib/reek/source/tree_dresser.rb +30 -175
- data/lib/reek/spec/should_reek.rb +2 -5
- data/lib/reek/version.rb +1 -1
- data/reek.gemspec +1 -1
- data/spec/matchers/smell_of_matcher.rb +12 -15
- data/spec/reek/cli/report_spec.rb +10 -6
- data/spec/reek/core/code_parser_spec.rb +0 -6
- data/spec/reek/smells/control_parameter_spec.rb +195 -8
- data/spec/reek/smells/data_clump_spec.rb +28 -3
- data/spec/reek/smells/uncommunicative_method_name_spec.rb +7 -7
- data/spec/reek/source/sexp_extensions_spec.rb +290 -0
- data/spec/reek/source/sexp_node_spec.rb +28 -0
- data/spec/reek/source/source_code_spec.rb +59 -19
- data/spec/reek/source/tree_dresser_spec.rb +7 -314
- data/spec/reek/spec/should_reek_spec.rb +51 -64
- data/spec/samples/all_but_one_masked/dirty.rb +2 -2
- data/spec/samples/corrupt_config_file/dirty.rb +1 -0
- data/spec/samples/masked/dirty.rb +1 -1
- data/spec/samples/masked_by_dotfile/dirty.rb +2 -2
- data/spec/samples/no_config_file/dirty.rb +8 -0
- data/spec/samples/not_quite_masked/dirty.rb +0 -3
- data/spec/samples/three_smelly_files/dirty_one.rb +3 -0
- data/spec/samples/three_smelly_files/dirty_three.rb +5 -0
- data/spec/samples/three_smelly_files/dirty_two.rb +4 -0
- data/spec/spec_helper.rb +5 -0
- metadata +145 -137
- data/spec/reek/cli/reek_command_spec.rb +0 -46
    
        checksums.yaml
    CHANGED
    
    | @@ -1,7 +1,7 @@ | |
| 1 1 | 
             
            ---
         | 
| 2 2 | 
             
            SHA1:
         | 
| 3 | 
            -
              metadata.gz:  | 
| 4 | 
            -
              data.tar.gz:  | 
| 3 | 
            +
              metadata.gz: ad832e1c2e46ca1fd1789a92f7b8b30854ff2215
         | 
| 4 | 
            +
              data.tar.gz: 800911908bdc3111d76ff930e161a7d6f87fecf1
         | 
| 5 5 | 
             
            SHA512:
         | 
| 6 | 
            -
              metadata.gz:  | 
| 7 | 
            -
              data.tar.gz:  | 
| 6 | 
            +
              metadata.gz: c4588f0c10b1bb8bb3e8ac9afab01f1209588919b8939a3dbec5276eb5b8383c9f55f52e68e5f111a21c77d72cc57fd9acc4755797383a6c72bc4ed86e04c42a
         | 
| 7 | 
            +
              data.tar.gz: 22d3b703a28c5b561ac4f53d2e846333d2cda22b27e8e4931fe7ea64033d4436486e40b7f5d02838f06a4e76d88d7a7d44b98492b040794c57c23ec499baf935
         | 
    
        data/CHANGELOG
    CHANGED
    
    
    
        data/README.md
    CHANGED
    
    | @@ -27,9 +27,32 @@ or run | |
| 27 27 | 
             
            $ reek --help
         | 
| 28 28 | 
             
            ```
         | 
| 29 29 |  | 
| 30 | 
            -
            ##  | 
| 30 | 
            +
            ## Usage
         | 
| 31 31 |  | 
| 32 | 
            -
             | 
| 32 | 
            +
            For scanning the current directory you're in do a
         | 
| 33 | 
            +
             | 
| 34 | 
            +
            ```bash
         | 
| 35 | 
            +
            $ reek .
         | 
| 36 | 
            +
            ```
         | 
| 37 | 
            +
             | 
| 38 | 
            +
            (Mind the "." at the end to indicate the current directory)
         | 
| 39 | 
            +
             | 
| 40 | 
            +
             | 
| 41 | 
            +
            Likewise you can scan specific directories like this
         | 
| 42 | 
            +
             | 
| 43 | 
            +
            ```bash
         | 
| 44 | 
            +
            $ reek lib/your/files
         | 
| 45 | 
            +
            ```
         | 
| 46 | 
            +
             | 
| 47 | 
            +
            Note that if you just call
         | 
| 48 | 
            +
             | 
| 49 | 
            +
            ```bash
         | 
| 50 | 
            +
            $ reek
         | 
| 51 | 
            +
            ```
         | 
| 52 | 
            +
             | 
| 53 | 
            +
            without any arguments reek will wait for input from STDIN.
         | 
| 54 | 
            +
             | 
| 55 | 
            +
            Given a source file <tt>demo.rb</tt> containing:
         | 
| 33 56 |  | 
| 34 57 | 
             
            ```ruby
         | 
| 35 58 | 
             
            class Dirty
         | 
| @@ -106,6 +129,8 @@ spec spec/your/file -u     # Runs all tests stopping at the breakpoints you have | |
| 106 129 |  | 
| 107 130 | 
             
            There's a vim plugin for `reek`: [https://github.com/rainerborene/vim-reek](https://github.com/rainerborene/vim-reek)
         | 
| 108 131 |  | 
| 132 | 
            +
            TextMate Bundle for `reek`: [https://github.com/peeyush1234/reek.tmbundle](https://github.com/peeyush1234/reek.tmbundle)
         | 
| 133 | 
            +
             | 
| 109 134 | 
             
            ### Dependencies
         | 
| 110 135 |  | 
| 111 136 | 
             
            Reek makes use of the following other gems:
         | 
| @@ -38,9 +38,12 @@ Feature: Reek can be controlled using command-line options | |
| 38 38 | 
             
                      -c, --config FILE                Read configuration options from FILE
         | 
| 39 39 |  | 
| 40 40 | 
             
                  Report formatting:
         | 
| 41 | 
            -
                      -q, -- | 
| 42 | 
            -
                      - | 
| 41 | 
            +
                      -q, --quiet                      Suppress headings for smell-free source files (this is the default)
         | 
| 42 | 
            +
                      -V, --no-quiet, --verbose        Show headings for smell-free source files
         | 
| 43 | 
            +
                      -n, --no-line-numbers            Suppress line numbers from the output
         | 
| 44 | 
            +
                          --line-numbers               Show line numbers in the output (this is the default)
         | 
| 43 45 | 
             
                      -s, --single-line                Show IDE-compatible single-line-per-warning
         | 
| 46 | 
            +
                      -S, --sort-by-issue-count        Sort by "issue-count", listing the "smelliest" files first
         | 
| 44 47 | 
             
                      -y, --yaml                       Report smells in YAML format
         | 
| 45 48 |  | 
| 46 49 | 
             
                  """
         | 
| @@ -1,50 +1,48 @@ | |
| 1 1 | 
             
            @smells_count
         | 
| 2 2 | 
             
            Feature: Reports total number of code smells
         | 
| 3 | 
            -
             | 
| 4 | 
            -
             | 
| 3 | 
            +
              In order to monitor the total number of smells
         | 
| 4 | 
            +
              Reek outputs the total number of smells among all files inspected.
         | 
| 5 5 |  | 
| 6 | 
            -
             | 
| 7 | 
            -
             | 
| 8 | 
            -
             | 
| 9 | 
            -
             | 
| 10 | 
            -
             | 
| 11 | 
            -
             | 
| 12 | 
            -
             | 
| 13 | 
            -
             | 
| 14 | 
            -
             | 
| 15 | 
            -
             | 
| 16 | 
            -
             | 
| 17 | 
            -
             | 
| 6 | 
            +
              Scenario: Does not output total number of smells when inspecting single file
         | 
| 7 | 
            +
                When I run reek spec/samples/not_quite_masked/dirty.rb
         | 
| 8 | 
            +
                Then the exit status indicates smells
         | 
| 9 | 
            +
                And it reports:
         | 
| 10 | 
            +
                """
         | 
| 11 | 
            +
                spec/samples/not_quite_masked/dirty.rb -- 5 warnings:
         | 
| 12 | 
            +
                  [5]:Dirty has the variable name '@s' (UncommunicativeVariableName)
         | 
| 13 | 
            +
                  [4, 6]:Dirty#a calls @s.title twice (DuplicateMethodCall)
         | 
| 14 | 
            +
                  [4, 6]:Dirty#a calls puts(@s.title) twice (DuplicateMethodCall)
         | 
| 15 | 
            +
                  [5]:Dirty#a contains iterators nested 2 deep (NestedIterators)
         | 
| 16 | 
            +
                  [3]:Dirty#a has the name 'a' (UncommunicativeMethodName)
         | 
| 17 | 
            +
                """
         | 
| 18 18 |  | 
| 19 | 
            -
             | 
| 20 | 
            -
             | 
| 21 | 
            -
             | 
| 22 | 
            -
             | 
| 23 | 
            -
             | 
| 24 | 
            -
             | 
| 25 | 
            -
             | 
| 26 | 
            -
             | 
| 27 | 
            -
             | 
| 28 | 
            -
             | 
| 29 | 
            -
             | 
| 30 | 
            -
             | 
| 31 | 
            -
             | 
| 32 | 
            -
             | 
| 33 | 
            -
             | 
| 34 | 
            -
             | 
| 35 | 
            -
             | 
| 36 | 
            -
             | 
| 37 | 
            -
             | 
| 38 | 
            -
             | 
| 39 | 
            -
             | 
| 19 | 
            +
              Scenario: Output total number of smells when inspecting multiple files
         | 
| 20 | 
            +
                When I run reek spec/samples/two_smelly_files
         | 
| 21 | 
            +
                Then the exit status indicates smells
         | 
| 22 | 
            +
                And it reports:
         | 
| 23 | 
            +
                """
         | 
| 24 | 
            +
                spec/samples/two_smelly_files/dirty_one.rb -- 6 warnings:
         | 
| 25 | 
            +
                  [5]:Dirty has the variable name '@s' (UncommunicativeVariableName)
         | 
| 26 | 
            +
                  [4, 6]:Dirty#a calls @s.title twice (DuplicateMethodCall)
         | 
| 27 | 
            +
                  [4, 6]:Dirty#a calls puts(@s.title) twice (DuplicateMethodCall)
         | 
| 28 | 
            +
                  [5]:Dirty#a contains iterators nested 2 deep (NestedIterators)
         | 
| 29 | 
            +
                  [3]:Dirty#a has the name 'a' (UncommunicativeMethodName)
         | 
| 30 | 
            +
                  [5]:Dirty#a has the variable name 'x' (UncommunicativeVariableName)
         | 
| 31 | 
            +
                spec/samples/two_smelly_files/dirty_two.rb -- 6 warnings:
         | 
| 32 | 
            +
                  [5]:Dirty has the variable name '@s' (UncommunicativeVariableName)
         | 
| 33 | 
            +
                  [4, 6]:Dirty#a calls @s.title twice (DuplicateMethodCall)
         | 
| 34 | 
            +
                  [4, 6]:Dirty#a calls puts(@s.title) twice (DuplicateMethodCall)
         | 
| 35 | 
            +
                  [5]:Dirty#a contains iterators nested 2 deep (NestedIterators)
         | 
| 36 | 
            +
                  [3]:Dirty#a has the name 'a' (UncommunicativeMethodName)
         | 
| 37 | 
            +
                  [5]:Dirty#a has the variable name 'x' (UncommunicativeVariableName)
         | 
| 38 | 
            +
                12 total warnings
         | 
| 39 | 
            +
                """
         | 
| 40 40 |  | 
| 41 | 
            -
             | 
| 42 | 
            -
             | 
| 43 | 
            -
             | 
| 44 | 
            -
             | 
| 45 | 
            -
             | 
| 46 | 
            -
             | 
| 47 | 
            -
             | 
| 48 | 
            -
             | 
| 49 | 
            -
                    0 total warnings
         | 
| 50 | 
            -
                    """
         | 
| 41 | 
            +
              Scenario: Output total number of smells even if total equals 0
         | 
| 42 | 
            +
                When I run reek spec/samples/three_clean_files
         | 
| 43 | 
            +
                Then it succeeds
         | 
| 44 | 
            +
                And it reports:
         | 
| 45 | 
            +
                """
         | 
| 46 | 
            +
             | 
| 47 | 
            +
                0 total warnings
         | 
| 48 | 
            +
                """
         | 
| @@ -9,12 +9,15 @@ Feature: Reek reads from $stdin when no files are given | |
| 9 9 | 
             
                Then it succeeds
         | 
| 10 10 | 
             
                And it reports:
         | 
| 11 11 | 
             
                  """
         | 
| 12 | 
            -
                  $stdin -- 0 warnings
         | 
| 13 | 
            -
             | 
| 14 12 | 
             
                  """
         | 
| 15 13 |  | 
| 16 | 
            -
              Scenario: outputs  | 
| 17 | 
            -
                When I pass "" to reek
         | 
| 14 | 
            +
              Scenario: outputs nothing on empty stdin
         | 
| 15 | 
            +
                When I pass "" to reek --quiet
         | 
| 16 | 
            +
                Then it succeeds
         | 
| 17 | 
            +
                And stdout equals ""
         | 
| 18 | 
            +
             | 
| 19 | 
            +
              Scenario: outputs header only on empty stdin in verbose mode
         | 
| 20 | 
            +
                When I pass "" to reek -V
         | 
| 18 21 | 
             
                Then it succeeds
         | 
| 19 22 | 
             
                And it reports:
         | 
| 20 23 | 
             
                  """
         | 
| @@ -22,11 +25,6 @@ Feature: Reek reads from $stdin when no files are given | |
| 22 25 |  | 
| 23 26 | 
             
                  """
         | 
| 24 27 |  | 
| 25 | 
            -
              Scenario: outputs nothing on empty stdin in quiet mode
         | 
| 26 | 
            -
                When I pass "" to reek --quiet
         | 
| 27 | 
            -
                Then it succeeds
         | 
| 28 | 
            -
                And stdout equals ""
         | 
| 29 | 
            -
             | 
| 30 28 | 
             
              Scenario: return non-zero status when there are smells
         | 
| 31 29 | 
             
                When I pass "class Turn; def y() @x = 3; end end" to reek
         | 
| 32 30 | 
             
                Then the exit status indicates smells
         | 
| @@ -42,11 +40,7 @@ Feature: Reek reads from $stdin when no files are given | |
| 42 40 | 
             
              @stderr
         | 
| 43 41 | 
             
              Scenario: syntax error causes the source to be ignored
         | 
| 44 42 | 
             
                When I pass "def incomplete" to reek
         | 
| 43 | 
            +
                Then it reports a parsing error
         | 
| 45 44 | 
             
                Then it succeeds
         | 
| 46 | 
            -
                And  | 
| 47 | 
            -
                  """
         | 
| 48 | 
            -
                  $stdin -- 0 warnings
         | 
| 49 | 
            -
             | 
| 50 | 
            -
                  """
         | 
| 51 | 
            -
                And it reports a parsing error
         | 
| 45 | 
            +
                And stdout equals ""
         | 
| 52 46 |  | 
| @@ -6,7 +6,8 @@ Feature: Masking smells using config files | |
| 6 6 |  | 
| 7 7 | 
             
              Scenario: empty config file is ignored
         | 
| 8 8 | 
             
                When I run reek spec/samples/empty_config_file/dirty.rb
         | 
| 9 | 
            -
                Then the  | 
| 9 | 
            +
                Then it reports the error 'Warning: Invalid configuration file "empty.reek" -- Empty file'
         | 
| 10 | 
            +
                And the exit status indicates smells
         | 
| 10 11 | 
             
                And it reports:
         | 
| 11 12 | 
             
                  """
         | 
| 12 13 | 
             
                  spec/samples/empty_config_file/dirty.rb -- 6 warnings:
         | 
| @@ -20,19 +21,11 @@ Feature: Masking smells using config files | |
| 20 21 |  | 
| 21 22 | 
             
              Scenario: corrupt config file prevents normal output
         | 
| 22 23 | 
             
                When I run reek spec/samples/corrupt_config_file
         | 
| 23 | 
            -
                Then the  | 
| 24 | 
            +
                Then it reports the error 'Error: Invalid configuration file "corrupt.reek" -- Not a hash'
         | 
| 25 | 
            +
                And the exit status indicates an error
         | 
| 24 26 | 
             
                And it reports:
         | 
| 25 27 | 
             
                  """
         | 
| 26 | 
            -
                  spec/samples/corrupt_config_file/dirty.rb -- 7 warnings:
         | 
| 27 | 
            -
                    [1]:Dirty has no descriptive comment (IrresponsibleModule)
         | 
| 28 | 
            -
                    [4]:Dirty has the variable name '@s' (UncommunicativeVariableName)
         | 
| 29 | 
            -
                    [3, 5]:Dirty#a calls @s.title twice (DuplicateMethodCall)
         | 
| 30 | 
            -
                    [3, 5]:Dirty#a calls puts(@s.title) twice (DuplicateMethodCall)
         | 
| 31 | 
            -
                    [4]:Dirty#a contains iterators nested 2 deep (NestedIterators)
         | 
| 32 | 
            -
                    [2]:Dirty#a has the name 'a' (UncommunicativeMethodName)
         | 
| 33 | 
            -
                    [4]:Dirty#a has the variable name 'x' (UncommunicativeVariableName)
         | 
| 34 28 | 
             
                  """
         | 
| 35 | 
            -
                And it reports an error
         | 
| 36 29 |  | 
| 37 30 | 
             
              Scenario: missing source file is an error
         | 
| 38 31 | 
             
                When I run reek no_such_file.rb spec/samples/masked/dirty.rb
         | 
| @@ -63,11 +56,11 @@ Feature: Masking smells using config files | |
| 63 56 | 
             
                And it reports:
         | 
| 64 57 | 
             
                  """
         | 
| 65 58 | 
             
                  spec/samples/not_quite_masked/dirty.rb -- 5 warnings:
         | 
| 66 | 
            -
                    [ | 
| 67 | 
            -
                    [ | 
| 68 | 
            -
                    [ | 
| 69 | 
            -
                    [ | 
| 70 | 
            -
                    [ | 
| 59 | 
            +
                    [5]:Dirty has the variable name '@s' (UncommunicativeVariableName)
         | 
| 60 | 
            +
                    [4, 6]:Dirty#a calls @s.title twice (DuplicateMethodCall)
         | 
| 61 | 
            +
                    [4, 6]:Dirty#a calls puts(@s.title) twice (DuplicateMethodCall)
         | 
| 62 | 
            +
                    [5]:Dirty#a contains iterators nested 2 deep (NestedIterators)
         | 
| 63 | 
            +
                    [3]:Dirty#a has the name 'a' (UncommunicativeMethodName)
         | 
| 71 64 | 
             
                  """
         | 
| 72 65 |  | 
| 73 66 | 
             
              @overrides
         | 
| @@ -115,5 +108,4 @@ Feature: Masking smells using config files | |
| 115 108 | 
             
                Then it succeeds
         | 
| 116 109 | 
             
                And it reports:
         | 
| 117 110 | 
             
                  """
         | 
| 118 | 
            -
                  spec/samples/masked/dirty.rb -- 0 warnings
         | 
| 119 111 | 
             
                  """
         | 
| @@ -51,13 +51,14 @@ Feature: Reek can be driven through its Task | |
| 51 51 | 
             
                  """
         | 
| 52 52 | 
             
                  Reek::Rake::Task.new do |t|
         | 
| 53 53 | 
             
                    t.fail_on_error = false
         | 
| 54 | 
            -
                    t.source_files = 'spec/samples/ | 
| 54 | 
            +
                    t.source_files = 'spec/samples/no_config_file/dirty.rb'
         | 
| 55 55 | 
             
                  end
         | 
| 56 56 | 
             
                  """
         | 
| 57 | 
            -
                Then it  | 
| 57 | 
            +
                Then it reports no errors
         | 
| 58 | 
            +
                And it succeeds
         | 
| 58 59 | 
             
                And it reports:
         | 
| 59 60 | 
             
                  """
         | 
| 60 | 
            -
                  spec/samples/ | 
| 61 | 
            +
                  spec/samples/no_config_file/dirty.rb -- 6 warnings:
         | 
| 61 62 | 
             
                    [5]:Dirty has the variable name '@s' (UncommunicativeVariableName)
         | 
| 62 63 | 
             
                    [4, 6]:Dirty#a calls @s.title twice (DuplicateMethodCall)
         | 
| 63 64 | 
             
                    [4, 6]:Dirty#a calls puts(@s.title) twice (DuplicateMethodCall)
         | 
| @@ -77,5 +78,4 @@ Feature: Reek can be driven through its Task | |
| 77 78 | 
             
                Then it succeeds
         | 
| 78 79 | 
             
                And it reports:
         | 
| 79 80 | 
             
                  """
         | 
| 80 | 
            -
                  spec/samples/masked/dirty.rb -- 0 warnings
         | 
| 81 81 | 
             
                  """
         | 
| @@ -31,14 +31,57 @@ Feature: Correctly formatted reports | |
| 31 31 | 
             
                  | spec/samples/two_smelly_files/*.rb |
         | 
| 32 32 | 
             
                  | spec/samples/two_smelly_files      |
         | 
| 33 33 |  | 
| 34 | 
            -
              Scenario | 
| 34 | 
            +
              Scenario: Do not sort by default (which means report each file as it is read in)
         | 
| 35 | 
            +
                When I run reek spec/samples/three_smelly_files/*.rb
         | 
| 36 | 
            +
                Then the exit status indicates smells
         | 
| 37 | 
            +
                And it reports:
         | 
| 38 | 
            +
                  """
         | 
| 39 | 
            +
                  spec/samples/three_smelly_files/dirty_one.rb -- 2 warnings:
         | 
| 40 | 
            +
                    [1]:Dirty has no descriptive comment (IrresponsibleModule)
         | 
| 41 | 
            +
                    [2]:Dirty#a has the name 'a' (UncommunicativeMethodName)
         | 
| 42 | 
            +
                  spec/samples/three_smelly_files/dirty_three.rb -- 4 warnings:
         | 
| 43 | 
            +
                    [1]:Dirty has no descriptive comment (IrresponsibleModule)
         | 
| 44 | 
            +
                    [2]:Dirty#a has the name 'a' (UncommunicativeMethodName)
         | 
| 45 | 
            +
                    [3]:Dirty#b has the name 'b' (UncommunicativeMethodName)
         | 
| 46 | 
            +
                    [4]:Dirty#c has the name 'c' (UncommunicativeMethodName)
         | 
| 47 | 
            +
                  spec/samples/three_smelly_files/dirty_two.rb -- 3 warnings:
         | 
| 48 | 
            +
                    [1]:Dirty has no descriptive comment (IrresponsibleModule)
         | 
| 49 | 
            +
                    [2]:Dirty#a has the name 'a' (UncommunicativeMethodName)
         | 
| 50 | 
            +
                    [3]:Dirty#b has the name 'b' (UncommunicativeMethodName)
         | 
| 51 | 
            +
                  9 total warnings
         | 
| 52 | 
            +
                  """
         | 
| 53 | 
            +
             | 
| 54 | 
            +
              Scenario Outline: Sort by issue count
         | 
| 55 | 
            +
                When I run reek <option> spec/samples/three_smelly_files/*.rb
         | 
| 56 | 
            +
                Then the exit status indicates smells
         | 
| 57 | 
            +
                And it reports:
         | 
| 58 | 
            +
                  """
         | 
| 59 | 
            +
                  spec/samples/three_smelly_files/dirty_three.rb -- 4 warnings:
         | 
| 60 | 
            +
                    [1]:Dirty has no descriptive comment (IrresponsibleModule)
         | 
| 61 | 
            +
                    [2]:Dirty#a has the name 'a' (UncommunicativeMethodName)
         | 
| 62 | 
            +
                    [3]:Dirty#b has the name 'b' (UncommunicativeMethodName)
         | 
| 63 | 
            +
                    [4]:Dirty#c has the name 'c' (UncommunicativeMethodName)
         | 
| 64 | 
            +
                  spec/samples/three_smelly_files/dirty_two.rb -- 3 warnings:
         | 
| 65 | 
            +
                    [1]:Dirty has no descriptive comment (IrresponsibleModule)
         | 
| 66 | 
            +
                    [2]:Dirty#a has the name 'a' (UncommunicativeMethodName)
         | 
| 67 | 
            +
                    [3]:Dirty#b has the name 'b' (UncommunicativeMethodName)
         | 
| 68 | 
            +
                  spec/samples/three_smelly_files/dirty_one.rb -- 2 warnings:
         | 
| 69 | 
            +
                    [1]:Dirty has no descriptive comment (IrresponsibleModule)
         | 
| 70 | 
            +
                    [2]:Dirty#a has the name 'a' (UncommunicativeMethodName)
         | 
| 71 | 
            +
                  9 total warnings
         | 
| 72 | 
            +
                  """
         | 
| 73 | 
            +
             | 
| 74 | 
            +
                Examples:
         | 
| 75 | 
            +
                  | option                |
         | 
| 76 | 
            +
                  | -S                    |
         | 
| 77 | 
            +
                  | --sort-by-issue-count |
         | 
| 78 | 
            +
             | 
| 79 | 
            +
              Scenario Outline: good files show no headers by default
         | 
| 35 80 | 
             
                When I run reek <args>
         | 
| 36 81 | 
             
                Then it succeeds
         | 
| 37 82 | 
             
                And it reports:
         | 
| 38 83 | 
             
                  """
         | 
| 39 | 
            -
             | 
| 40 | 
            -
                  spec/samples/three_clean_files/clean_three.rb -- 0 warnings
         | 
| 41 | 
            -
                  spec/samples/three_clean_files/clean_two.rb -- 0 warnings
         | 
| 84 | 
            +
             | 
| 42 85 | 
             
                  0 total warnings
         | 
| 43 86 | 
             
                  """
         | 
| 44 87 |  | 
| @@ -47,20 +90,36 @@ Feature: Correctly formatted reports | |
| 47 90 | 
             
                  | spec/samples/three_clean_files/*.rb |
         | 
| 48 91 | 
             
                  | spec/samples/three_clean_files      |
         | 
| 49 92 |  | 
| 93 | 
            +
              Scenario Outline: --verbose and --no-quiet turn on headers for fragrant files
         | 
| 94 | 
            +
                When I run reek <option> spec/samples/three_clean_files/*.rb
         | 
| 95 | 
            +
                Then it succeeds
         | 
| 96 | 
            +
                And it reports:
         | 
| 97 | 
            +
                  """
         | 
| 98 | 
            +
                  spec/samples/three_clean_files/clean_one.rb -- 0 warnings
         | 
| 99 | 
            +
                  spec/samples/three_clean_files/clean_three.rb -- 0 warnings
         | 
| 100 | 
            +
                  spec/samples/three_clean_files/clean_two.rb -- 0 warnings
         | 
| 101 | 
            +
                  0 total warnings
         | 
| 102 | 
            +
                  """
         | 
| 103 | 
            +
             | 
| 104 | 
            +
                Examples:
         | 
| 105 | 
            +
                  | option     |
         | 
| 106 | 
            +
                  | --verbose  |
         | 
| 107 | 
            +
                  | -V         |
         | 
| 108 | 
            +
                  | --no-quiet |
         | 
| 109 | 
            +
             | 
| 50 110 | 
             
              Scenario Outline: --quiet turns off headers for fragrant files
         | 
| 51 111 | 
             
                When I run reek <option> spec/samples/three_clean_files/*.rb
         | 
| 52 112 | 
             
                Then it succeeds
         | 
| 53 113 | 
             
                And it reports:
         | 
| 54 114 | 
             
                """
         | 
| 115 | 
            +
             | 
| 55 116 | 
             
                0 total warnings
         | 
| 56 117 | 
             
                """
         | 
| 57 118 |  | 
| 58 119 | 
             
                Examples:
         | 
| 59 | 
            -
                  | option | 
| 60 | 
            -
                  | -q | 
| 61 | 
            -
                  | --quiet | 
| 62 | 
            -
                  | -n -q   |
         | 
| 63 | 
            -
                  | -q -n   |
         | 
| 120 | 
            +
                  | option        |
         | 
| 121 | 
            +
                  | -V -q         |
         | 
| 122 | 
            +
                  | -V --quiet    |
         | 
| 64 123 |  | 
| 65 124 | 
             
              Scenario Outline: --line-number turns off line numbers
         | 
| 66 125 | 
             
                When I run reek <option> spec/samples/not_quite_masked/dirty.rb
         | 
| @@ -76,11 +135,11 @@ Feature: Correctly formatted reports | |
| 76 135 | 
             
                  """
         | 
| 77 136 |  | 
| 78 137 | 
             
                Examples:
         | 
| 79 | 
            -
                  | option | 
| 80 | 
            -
                  | -n | 
| 81 | 
            -
                  | --line- | 
| 82 | 
            -
                  | -n - | 
| 83 | 
            -
                  | - | 
| 138 | 
            +
                  | option            |
         | 
| 139 | 
            +
                  | -n                |
         | 
| 140 | 
            +
                  | --no-line-numbers |
         | 
| 141 | 
            +
                  | -n -V             |
         | 
| 142 | 
            +
                  | -V -n             |
         | 
| 84 143 |  | 
| 85 144 | 
             
              Scenario Outline: --single-line shows filename and one line number
         | 
| 86 145 | 
             
                When I run reek <option> spec/samples/not_quite_masked/dirty.rb
         | 
| @@ -88,19 +147,19 @@ Feature: Correctly formatted reports | |
| 88 147 | 
             
                And it reports:
         | 
| 89 148 | 
             
                  """
         | 
| 90 149 | 
             
                  spec/samples/not_quite_masked/dirty.rb -- 5 warnings:
         | 
| 91 | 
            -
                    spec/samples/not_quite_masked/dirty.rb: | 
| 92 | 
            -
                    spec/samples/not_quite_masked/dirty.rb: | 
| 93 | 
            -
                    spec/samples/not_quite_masked/dirty.rb: | 
| 94 | 
            -
                    spec/samples/not_quite_masked/dirty.rb: | 
| 95 | 
            -
                    spec/samples/not_quite_masked/dirty.rb: | 
| 150 | 
            +
                    spec/samples/not_quite_masked/dirty.rb:5: Dirty has the variable name '@s' (UncommunicativeVariableName)
         | 
| 151 | 
            +
                    spec/samples/not_quite_masked/dirty.rb:4: Dirty#a calls @s.title twice (DuplicateMethodCall)
         | 
| 152 | 
            +
                    spec/samples/not_quite_masked/dirty.rb:4: Dirty#a calls puts(@s.title) twice (DuplicateMethodCall)
         | 
| 153 | 
            +
                    spec/samples/not_quite_masked/dirty.rb:5: Dirty#a contains iterators nested 2 deep (NestedIterators)
         | 
| 154 | 
            +
                    spec/samples/not_quite_masked/dirty.rb:3: Dirty#a has the name 'a' (UncommunicativeMethodName)
         | 
| 96 155 | 
             
                  """
         | 
| 97 156 |  | 
| 98 157 | 
             
                Examples:
         | 
| 99 158 | 
             
                  | option        |
         | 
| 100 159 | 
             
                  | -s            |
         | 
| 101 160 | 
             
                  | --single-line |
         | 
| 102 | 
            -
                  | -s - | 
| 103 | 
            -
                  | - | 
| 161 | 
            +
                  | -s -V         |
         | 
| 162 | 
            +
                  | -V -s         |
         | 
| 104 163 |  | 
| 105 164 | 
             
              Scenario Outline: Extra slashes aren't added to directory names
         | 
| 106 165 | 
             
                When I run reek <args>
         | 
    
        data/features/samples.feature
    CHANGED
    
    | @@ -10,7 +10,7 @@ Feature: Basic smell detection | |
| 10 10 | 
             
                Then the exit status indicates smells
         | 
| 11 11 | 
             
                And it reports:
         | 
| 12 12 | 
             
                """
         | 
| 13 | 
            -
                spec/samples/inline.rb --  | 
| 13 | 
            +
                spec/samples/inline.rb -- 39 warnings:
         | 
| 14 14 | 
             
                  File has no descriptive comment (IrresponsibleModule)
         | 
| 15 15 | 
             
                  Inline declares the class variable @@directory (ClassVariable)
         | 
| 16 16 | 
             
                  Inline declares the class variable @@rootdir (ClassVariable)
         | 
| @@ -23,7 +23,7 @@ Feature: Basic smell detection | |
| 23 23 | 
             
                  Inline::C tests $DEBUG at least 7 times (RepeatedConditional)
         | 
| 24 24 | 
             
                  Inline::C tests $TESTING at least 4 times (RepeatedConditional)
         | 
| 25 25 | 
             
                  Inline::C tests @@type_map.has_key?(type) at least 3 times (RepeatedConditional)
         | 
| 26 | 
            -
                  Inline::C#build calls  | 
| 26 | 
            +
                  Inline::C#build calls ($? != 0) twice (DuplicateMethodCall)
         | 
| 27 27 | 
             
                  Inline::C#build calls Inline.directory 5 times (DuplicateMethodCall)
         | 
| 28 28 | 
             
                  Inline::C#build calls io.puts 6 times (DuplicateMethodCall)
         | 
| 29 29 | 
             
                  Inline::C#build calls io.puts("#endif") twice (DuplicateMethodCall)
         | 
| @@ -50,7 +50,6 @@ Feature: Basic smell detection | |
| 50 50 | 
             
                  Inline::C#strip_comments refers to src more than self (FeatureEnvy)
         | 
| 51 51 | 
             
                  Module#inline calls Inline.const_get(lang) twice (DuplicateMethodCall)
         | 
| 52 52 | 
             
                  Module#inline has approx 11 statements (TooManyStatements)
         | 
| 53 | 
            -
                  Module#inline is controlled by argument options (ControlParameter)
         | 
| 54 53 | 
             
                """
         | 
| 55 54 |  | 
| 56 55 | 
             
              Scenario: Correct smells from optparse.rb
         | 
| @@ -58,7 +57,7 @@ Feature: Basic smell detection | |
| 58 57 | 
             
                Then the exit status indicates smells
         | 
| 59 58 | 
             
                And it reports:
         | 
| 60 59 | 
             
                """
         | 
| 61 | 
            -
                spec/samples/optparse.rb --  | 
| 60 | 
            +
                spec/samples/optparse.rb -- 103 warnings:
         | 
| 62 61 | 
             
                  OptionParser has at least 42 methods (TooManyMethods)
         | 
| 63 62 | 
             
                  OptionParser has the variable name 'f' (UncommunicativeVariableName)
         | 
| 64 63 | 
             
                  OptionParser has the variable name 'k' (UncommunicativeVariableName)
         | 
| @@ -110,7 +109,6 @@ Feature: Basic smell detection | |
| 110 109 | 
             
                  OptionParser#parse_in_order calls sw.switch_name twice (DuplicateMethodCall)
         | 
| 111 110 | 
             
                  OptionParser#parse_in_order contains iterators nested 3 deep (NestedIterators)
         | 
| 112 111 | 
             
                  OptionParser#parse_in_order has approx 28 statements (TooManyStatements)
         | 
| 113 | 
            -
                  OptionParser#parse_in_order is controlled by argument setter (ControlParameter)
         | 
| 114 112 | 
             
                  OptionParser#permute calls argv[0] twice (DuplicateMethodCall)
         | 
| 115 113 | 
             
                  OptionParser#permute refers to argv more than self (FeatureEnvy)
         | 
| 116 114 | 
             
                  OptionParser#search has the variable name 'k' (UncommunicativeVariableName)
         | 
| @@ -118,6 +116,7 @@ Feature: Basic smell detection | |
| 118 116 | 
             
                  OptionParser#summarize has 4 parameters (LongParameterList)
         | 
| 119 117 | 
             
                  OptionParser#summarize has the variable name 'l' (UncommunicativeVariableName)
         | 
| 120 118 | 
             
                  OptionParser#ver has the variable name 'v' (UncommunicativeVariableName)
         | 
| 119 | 
            +
                  OptionParser::Arguable#options= is controlled by argument opt (ControlParameter)
         | 
| 121 120 | 
             
                  OptionParser::CompletingHash#match contains iterators nested 2 deep (NestedIterators)
         | 
| 122 121 | 
             
                  OptionParser::Completion#complete calls candidates.size twice (DuplicateMethodCall)
         | 
| 123 122 | 
             
                  OptionParser::Completion#complete calls k.id2name twice (DuplicateMethodCall)
         | 
| @@ -128,7 +127,6 @@ Feature: Basic smell detection | |
| 128 127 | 
             
                  OptionParser::Completion#complete refers to candidates more than self (FeatureEnvy)
         | 
| 129 128 | 
             
                  OptionParser::Completion#convert has unused parameter 'opt' (UnusedParameters)
         | 
| 130 129 | 
             
                  OptionParser::List#accept has the parameter name 't' (UncommunicativeParameterName)
         | 
| 131 | 
            -
                  OptionParser::List#accept is controlled by argument pat (ControlParameter)
         | 
| 132 130 | 
             
                  OptionParser::List#accept refers to pat more than self (FeatureEnvy)
         | 
| 133 131 | 
             
                  OptionParser::List#add_banner refers to opt more than self (FeatureEnvy)
         | 
| 134 132 | 
             
                  OptionParser::List#complete has 4 parameters (LongParameterList)
         | 
| @@ -138,8 +136,6 @@ Feature: Basic smell detection | |
| 138 136 | 
             
                  OptionParser::List#update has 5 parameters (LongParameterList)
         | 
| 139 137 | 
             
                  OptionParser::List#update has approx 6 statements (TooManyStatements)
         | 
| 140 138 | 
             
                  OptionParser::List#update has the variable name 'o' (UncommunicativeVariableName)
         | 
| 141 | 
            -
                  OptionParser::List#update is controlled by argument lopts (ControlParameter)
         | 
| 142 | 
            -
                  OptionParser::List#update is controlled by argument sopts (ControlParameter)
         | 
| 143 139 | 
             
                  OptionParser::ParseError#set_option is controlled by argument eq (ControlParameter)
         | 
| 144 140 | 
             
                  OptionParser::Switch#add_banner has the variable name 's' (UncommunicativeVariableName)
         | 
| 145 141 | 
             
                  OptionParser::Switch#initialize has 7 parameters (LongParameterList)
         | 
| @@ -163,11 +159,8 @@ Feature: Basic smell detection | |
| 163 159 | 
             
                  OptionParser::Switch#summarize has the variable name 'r' (UncommunicativeVariableName)
         | 
| 164 160 | 
             
                  OptionParser::Switch#summarize has the variable name 's' (UncommunicativeVariableName)
         | 
| 165 161 | 
             
                  OptionParser::Switch::NoArgument#parse has unused parameter 'argv' (UnusedParameters)
         | 
| 166 | 
            -
                  OptionParser::Switch::NoArgument#parse is controlled by argument arg (ControlParameter)
         | 
| 167 162 | 
             
                  OptionParser::Switch::OptionalArgument#parse has unused parameter 'argv' (UnusedParameters)
         | 
| 168 | 
            -
                  OptionParser::Switch::OptionalArgument#parse is controlled by argument arg (ControlParameter)
         | 
| 169 163 | 
             
                  OptionParser::Switch::PlacedArgument#parse has approx 6 statements (TooManyStatements)
         | 
| 170 | 
            -
                  OptionParser::Switch::RequiredArgument#parse is controlled by argument arg (ControlParameter)
         | 
| 171 164 | 
             
                """
         | 
| 172 165 |  | 
| 173 166 | 
             
              Scenario: Correct smells from redcloth.rb
         | 
| @@ -175,7 +168,7 @@ Feature: Basic smell detection | |
| 175 168 | 
             
                Then the exit status indicates smells
         | 
| 176 169 | 
             
                And it reports:
         | 
| 177 170 | 
             
                """
         | 
| 178 | 
            -
                spec/samples/redcloth.rb --  | 
| 171 | 
            +
                spec/samples/redcloth.rb -- 98 warnings:
         | 
| 179 172 | 
             
                  RedCloth has at least 44 methods (TooManyMethods)
         | 
| 180 173 | 
             
                  RedCloth has the variable name 'a' (UncommunicativeVariableName)
         | 
| 181 174 | 
             
                  RedCloth has the variable name 'b' (UncommunicativeVariableName)
         | 
| @@ -207,7 +200,6 @@ Feature: Basic smell detection | |
| 207 200 | 
             
                  RedCloth#blocks has approx 18 statements (TooManyStatements)
         | 
| 208 201 | 
             
                  RedCloth#blocks has boolean parameter 'deep_code' (BooleanParameter)
         | 
| 209 202 | 
             
                  RedCloth#blocks is controlled by argument deep_code (ControlParameter)
         | 
| 210 | 
            -
                  RedCloth#check_refs is controlled by argument text (ControlParameter)
         | 
| 211 203 | 
             
                  RedCloth#clean_html calls tags[tag] twice (DuplicateMethodCall)
         | 
| 212 204 | 
             
                  RedCloth#clean_html contains iterators nested 3 deep (NestedIterators)
         | 
| 213 205 | 
             
                  RedCloth#clean_html doesn't depend on instance state (UtilityFunction)
         | 
| @@ -224,6 +216,7 @@ Feature: Basic smell detection | |
| 224 216 | 
             
                  RedCloth#footnote_ref refers to text more than self (FeatureEnvy)
         | 
| 225 217 | 
             
                  RedCloth#glyphs_textile has approx 10 statements (TooManyStatements)
         | 
| 226 218 | 
             
                  RedCloth#htmlesc doesn't depend on instance state (UtilityFunction)
         | 
| 219 | 
            +
                  RedCloth#htmlesc is controlled by argument mode (ControlParameter)
         | 
| 227 220 | 
             
                  RedCloth#htmlesc refers to str more than self (FeatureEnvy)
         | 
| 228 221 | 
             
                  RedCloth#incoming_entities refers to text more than self (FeatureEnvy)
         | 
| 229 222 | 
             
                  RedCloth#initialize has the variable name 'r' (UncommunicativeVariableName)
         | 
| @@ -243,11 +236,12 @@ Feature: Basic smell detection | |
| 243 236 | 
             
                  RedCloth#inline_textile_span has approx 8 statements (TooManyStatements)
         | 
| 244 237 | 
             
                  RedCloth#inline_textile_span has the variable name 'm' (UncommunicativeVariableName)
         | 
| 245 238 | 
             
                  RedCloth#lT has the name 'lT' (UncommunicativeMethodName)
         | 
| 239 | 
            +
                  RedCloth#lT is controlled by argument text (ControlParameter)
         | 
| 246 240 | 
             
                  RedCloth#no_textile doesn't depend on instance state (UtilityFunction)
         | 
| 247 241 | 
             
                  RedCloth#no_textile refers to text more than self (FeatureEnvy)
         | 
| 248 242 | 
             
                  RedCloth#pba calls $1.length twice (DuplicateMethodCall)
         | 
| 249 243 | 
             
                  RedCloth#pba has approx 21 statements (TooManyStatements)
         | 
| 250 | 
            -
                  RedCloth#pba is controlled by argument  | 
| 244 | 
            +
                  RedCloth#pba is controlled by argument element (ControlParameter)
         | 
| 251 245 | 
             
                  RedCloth#pba refers to style more than self (FeatureEnvy)
         | 
| 252 246 | 
             
                  RedCloth#pba refers to text more than self (FeatureEnvy)
         | 
| 253 247 | 
             
                  RedCloth#refs_markdown has the variable name 'm' (UncommunicativeVariableName)
         | 
| @@ -265,15 +259,11 @@ Feature: Basic smell detection | |
| 265 259 | 
             
                  RedCloth#rip_offtags has approx 18 statements (TooManyStatements)
         | 
| 266 260 | 
             
                  RedCloth#textile_bq has 4 parameters (LongParameterList)
         | 
| 267 261 | 
             
                  RedCloth#textile_bq has unused parameter 'tag' (UnusedParameters)
         | 
| 268 | 
            -
                  RedCloth#textile_bq is controlled by argument atts (ControlParameter)
         | 
| 269 | 
            -
                  RedCloth#textile_bq is controlled by argument cite (ControlParameter)
         | 
| 270 262 | 
             
                  RedCloth#textile_fn_ has 5 parameters (LongParameterList)
         | 
| 271 263 | 
             
                  RedCloth#textile_fn_ has unused parameter 'cite' (UnusedParameters)
         | 
| 272 264 | 
             
                  RedCloth#textile_fn_ has unused parameter 'tag' (UnusedParameters)
         | 
| 273 | 
            -
                  RedCloth#textile_fn_ is controlled by argument atts (ControlParameter)
         | 
| 274 265 | 
             
                  RedCloth#textile_p has 4 parameters (LongParameterList)
         | 
| 275 266 | 
             
                  RedCloth#textile_p has unused parameter 'cite' (UnusedParameters)
         | 
| 276 | 
            -
                  RedCloth#textile_p is controlled by argument atts (ControlParameter)
         | 
| 277 267 | 
             
                  RedCloth#textile_popup_help has the parameter name 'windowH' (UncommunicativeParameterName)
         | 
| 278 268 | 
             
                  RedCloth#textile_popup_help has the parameter name 'windowW' (UncommunicativeParameterName)
         | 
| 279 269 | 
             
                  RedCloth#to_html has approx 24 statements (TooManyStatements)
         |