reek 1.6.1 → 1.6.2

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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: d1ca3caed81210da21611c9fb1de45c3aca7ddea
4
- data.tar.gz: 669b33cc75cb7ec917dfab1ea1f132507bbf31d7
3
+ metadata.gz: 654a7a3741c1426d2a2e40b05fe4f07515f7fe2e
4
+ data.tar.gz: c6b97971092b5645f2ae4ee55e5a82859371e360
5
5
  SHA512:
6
- metadata.gz: aaccd35e8f1a2c0e4593c5a0e859dd2beb4b631566773816e0ba906de0ba939be9fc1794e76ef3b53abc29b4a8b953250344ac9dd55f5bc6b71c56377312aa37
7
- data.tar.gz: 089641f2903a7594330f596d642b2d8f1dcc883ed5f4b999be64a3933949d5738aef3878b76a7a8e80b25fae8074c6c9dd64da6e16e0143d9892fdedcdf6a1da
6
+ metadata.gz: 7272b0e52da60a43de15c0dc72d794554fb01652c054c07be603de16ab52c156fa857e71330b2087528a9fe049bb13366b09e55c60883037e2df199bbdfcf0e5
7
+ data.tar.gz: 717834c506b575606000461375091233f5d90b5cbd8bc3ccf6bb9b7fc93d4035ad4944d5b4ba570f16a7249cb1b72681d377f44f5e44ae487f4c0627dad97d39
data/CHANGELOG CHANGED
@@ -1,3 +1,8 @@
1
+ == 1.6.2
2
+
3
+ * (mvz) Fix rake task bug when no config file was given explicitly.
4
+ * (troessner) Run on working directory when no source is given.
5
+
1
6
  == 1.6.1
2
7
 
3
8
  * (mvz) Fix regression in rake task: Provide alias for backward compatibility
data/README.md CHANGED
@@ -54,6 +54,43 @@ spec/samples/demo/demo.rb -- 6 warnings:
54
54
  Dirty#awful has unused parameter 'y' (UnusedParameters)
55
55
  ```
56
56
 
57
+ ## Sources
58
+
59
+ There are multiple ways you can have `reek` work on sources, the most common one just being
60
+
61
+ ```Bash
62
+ reek lib/
63
+ ```
64
+
65
+ If you don't pass any source arguments to `reek` it just takes the current working directory as source.
66
+
67
+ So
68
+
69
+ ```Bash
70
+ reek
71
+ ```
72
+
73
+ is the exact same thing like being explicit:
74
+
75
+ ```Bash
76
+ reek .
77
+ ```
78
+
79
+ Additionally can you pipe code to reek like this:
80
+
81
+ ```Bash
82
+ echo "class C; def m; end; end" | reek
83
+ ```
84
+
85
+ This would print out:
86
+
87
+ ```Bash
88
+ $stdin -- 3 warnings:
89
+ [1]:C has no descriptive comment (IrresponsibleModule)
90
+ [1]:C has the name 'C' (UncommunicativeModuleName)
91
+ [1]:C#m has the name 'm' (UncommunicativeMethodName)
92
+ ```
93
+
57
94
  ## Code smells
58
95
 
59
96
  `reek` currently includes checks for some aspects of [Control Couple](https://github.com/troessner/reek/wiki/Control-Couple), [Data Clump](https://github.com/troessner/reek/wiki/Data-Clump), [Feature Envy](https://github.com/troessner/reek/wiki/Feature-Envy), [Large Class](https://github.com/troessner/reek/wiki/Large-Class), [Long Parameter List](https://github.com/troessner/reek/wiki/Long-Parameter-List), [Simulated Polymorphism](https://github.com/troessner/reek/wiki/Simulated-Polymorphism), [Too Many Statements](https://github.com/troessner/reek/wiki/Too-Many-Statements), [Uncommunicative Name](https://github.com/troessner/reek/wiki/Uncommunicative-Name), [Unused Parameters](https://github.com/troessner/reek/wiki/Unused-Parameters) and more. See the [Code Smells](https://github.com/troessner/reek/wiki/Code-Smells) for up to date details of exactly what `reek` will check in your code.
@@ -0,0 +1,62 @@
1
+ Feature: Offer different ways how to load configuration
2
+
3
+ There are 3 ways of passing reek a configuration file:
4
+ - Using the cli "-c" switch
5
+ - Having a file ending with .reek either in your current working directory or in a parent directory
6
+ - Having a file ending with .reek in your HOME directory
7
+ The order in which reek tries to find such a configuration file should exactly be like above:
8
+ First reek should check if we have given it a configuration file explicitly via CLI.
9
+ Then it should check the current working directory for a file and if it can't find one,
10
+ it should traverse up the directories until it hits the root directory.
11
+ And finally, it should check your HOME directory.
12
+
13
+ Scenario: No configuration
14
+ When I run reek spec/samples/configuration_loading/minimal_dirty.rb
15
+ Then the exit status indicates smells
16
+ And it reports:
17
+ """
18
+ spec/samples/configuration_loading/minimal_dirty.rb -- 3 warnings:
19
+ [1]:C has no descriptive comment (IrresponsibleModule)
20
+ [1]:C has the name 'C' (UncommunicativeModuleName)
21
+ [2]:C#m has the name 'm' (UncommunicativeMethodName)
22
+ """
23
+
24
+ Scenario: Configuration via CLI
25
+ When I run reek -c spec/samples/minimal_smelly_and_masked/config.reek spec/samples/minimal_smelly_and_masked/minimal_dirty.rb
26
+ Then it reports no errors
27
+ And it succeeds
28
+
29
+ @remove-disable-smell-config-from-current-dir
30
+ Scenario: Configuration file in working directory
31
+ Given "spec/samples/configuration_loading/reek-test-run-disable_smells.reek" exists in the working directory
32
+ When I run reek spec/samples/configuration_loading/minimal_dirty.rb
33
+ Then it reports no errors
34
+ And it succeeds
35
+
36
+ @remove-disable-smell-config-from-parent-dir
37
+ Scenario: Configuration file in the parent directory of the working directory
38
+ Given "spec/samples/configuration_loading/reek-test-run-disable_smells.reek" exists in the parent directory of the working directory
39
+ When I run reek spec/samples/configuration_loading/minimal_dirty.rb
40
+ Then it reports no errors
41
+ And it succeeds
42
+
43
+ @remove-disable-smell-config-from-home-dir
44
+ Scenario: Configuration file in the HOME directory
45
+ Given "spec/samples/configuration_loading/reek-test-run-disable_smells.reek" exists in the HOME directory
46
+ When I run reek spec/samples/configuration_loading/minimal_dirty.rb
47
+ Then it reports no errors
48
+ And it succeeds
49
+
50
+ @remove-enable-smell-config-from-current-dir @remove-disable-smell-config-from-parent-dir
51
+ Scenario: Two opposing configuration files and we stop after the first one
52
+ Given "spec/samples/configuration_loading/reek-test-run-enable_smells.reek" exists in the working directory
53
+ And "spec/samples/configuration_loading/reek-test-run-disable_smells.reek" exists in the parent directory of the working directory
54
+ When I run reek spec/samples/configuration_loading/minimal_dirty.rb
55
+ Then the exit status indicates smells
56
+ And it reports:
57
+ """
58
+ spec/samples/configuration_loading/minimal_dirty.rb -- 3 warnings:
59
+ [1]:C has no descriptive comment (IrresponsibleModule)
60
+ [1]:C has the name 'C' (UncommunicativeModuleName)
61
+ [2]:C#m has the name 'm' (UncommunicativeMethodName)
62
+ """
@@ -67,3 +67,15 @@ end
67
67
  Then /^it reports the current version$/ do
68
68
  expect(@last_stdout).to eq "reek #{Reek::VERSION}\n"
69
69
  end
70
+
71
+ Given(/^"(.*?)" exists in the working directory$/) do |path|
72
+ FileUtils.cp path, Pathname.pwd
73
+ end
74
+
75
+ Given(/^"(.*?)" exists in the parent directory of the working directory$/) do |path|
76
+ FileUtils.cp path, Pathname.pwd.parent
77
+ end
78
+
79
+ Given(/^"(.*?)" exists in the HOME directory$/) do |path|
80
+ FileUtils.cp path, Pathname.new(Dir.home)
81
+ end
@@ -5,8 +5,7 @@ require 'open3'
5
5
  require 'reek/cli/application'
6
6
 
7
7
  begin
8
- require 'pry'
9
- require 'byebug'
8
+ require 'pry-byebug'
10
9
  rescue LoadError # rubocop:disable Lint/HandleExceptions
11
10
  end
12
11
 
@@ -0,0 +1,15 @@
1
+ After('@remove-disable-smell-config-from-current-dir') do
2
+ Pathname.pwd.join('reek-test-run-disable_smells.reek').delete
3
+ end
4
+
5
+ After('@remove-disable-smell-config-from-parent-dir') do
6
+ Pathname.pwd.parent.join('reek-test-run-disable_smells.reek').delete
7
+ end
8
+
9
+ After('@remove-disable-smell-config-from-home-dir') do
10
+ Pathname.new(Dir.home).join('reek-test-run-disable_smells.reek').delete
11
+ end
12
+
13
+ After('@remove-enable-smell-config-from-current-dir') do
14
+ Pathname.pwd.join('reek-test-run-enable_smells.reek').delete
15
+ end
@@ -0,0 +1,46 @@
1
+ require 'reek/source'
2
+
3
+ module Reek
4
+ module CLI
5
+ #
6
+ # CLI Input utility
7
+ #
8
+ module Input
9
+ def sources
10
+ if input_was_piped?
11
+ source_from_pipe
12
+ else
13
+ if no_source_files_given?
14
+ working_directory_as_source
15
+ else
16
+ sources_from_argv
17
+ end
18
+ end
19
+ end
20
+
21
+ private
22
+
23
+ def input_was_piped?
24
+ !$stdin.tty?
25
+ end
26
+
27
+ def no_source_files_given?
28
+ # At this point we have deleted all options from @argv. The only remaining entries
29
+ # are paths to the source files. If @argv is empty, this means that no files were given.
30
+ @argv.empty?
31
+ end
32
+
33
+ def working_directory_as_source
34
+ Source::SourceLocator.new(['.']).all_sources
35
+ end
36
+
37
+ def sources_from_argv
38
+ Source::SourceLocator.new(@argv).all_sources
39
+ end
40
+
41
+ def source_from_pipe
42
+ [$stdin.to_reek_source('$stdin')]
43
+ end
44
+ end
45
+ end
46
+ end
@@ -6,7 +6,7 @@ require 'reek/cli/report/strategy'
6
6
  require 'reek/cli/reek_command'
7
7
  require 'reek/cli/help_command'
8
8
  require 'reek/cli/version_command'
9
- require 'reek/source'
9
+ require 'reek/cli/input'
10
10
 
11
11
  module Reek
12
12
  module Cli
@@ -14,50 +14,38 @@ module Reek
14
14
  # Parses the command line
15
15
  #
16
16
  class Options
17
+ include CLI::Input
18
+
19
+ attr_reader :config_file, :smells_to_detect
20
+
17
21
  def initialize(argv)
18
- @argv = argv
19
- @parser = OptionParser.new
20
- @colored = true
21
- @report_class = Report::TextReport
22
- @strategy = Report::Strategy::Quiet
23
- @warning_formatter = Report::WarningFormatterWithLineNumbers
24
- @command_class = ReekCommand
25
- @config_file = nil
22
+ @argv = argv
23
+ @parser = OptionParser.new
24
+ @colored = true
25
+ @report_class = Report::TextReport
26
+ @strategy = Report::Strategy::Quiet
27
+ @warning_formatter = Report::WarningFormatterWithLineNumbers
28
+ @command_class = ReekCommand
29
+ @config_file = nil
26
30
  @sort_by_issue_count = false
27
- @smells_to_detect = []
31
+ @smells_to_detect = []
28
32
  set_options
29
33
  end
30
34
 
31
35
  def banner
32
36
  progname = @parser.program_name
33
- # SMELL:
34
- # The following banner isn't really correct. Help, Version and Reek
35
- # are really sub-commands (in the git/svn sense) and so the usage
36
- # banner should show three different command-lines. The other
37
- # options are all flags for the Reek sub-command.
38
- #
39
- # reek -h|--help Display a help message
40
- #
41
- # reek -v|--version Output the tool's version number
42
- #
43
- # reek [options] files List the smells in the given files
44
- # -c|--config file Specify file(s) with config options
45
- # -n|--line-number Prefix smelly lines with line numbers
46
- # -q|-[no-]quiet Only list files that have smells
47
- # files Names of files or dirs to be checked
48
- #
49
- <<EOB
50
- Usage: #{progname} [options] [files]
37
+ <<-EOB.gsub(/^[ ]+/, '')
38
+ Usage: #{progname} [options] [files]
51
39
 
52
- Examples:
40
+ Examples:
53
41
 
54
- #{progname} lib/*.rb
55
- #{progname} -q lib
56
- cat my_class.rb | #{progname}
42
+ #{progname} lib/*.rb
43
+ #{progname} -q lib
44
+ cat my_class.rb | #{progname}
57
45
 
58
- See http://wiki.github.com/troessner/reek for detailed help.
46
+ See http://wiki.github.com/troessner/reek for detailed help.
59
47
 
60
- EOB
48
+ EOB
61
49
  end
62
50
 
63
51
  def set_options
@@ -117,9 +105,6 @@ EOB
117
105
  @command_class.new(self)
118
106
  end
119
107
 
120
- attr_reader :config_file
121
- attr_reader :smells_to_detect
122
-
123
108
  def reporter
124
109
  @reporter ||= @report_class.new(warning_formatter: @warning_formatter,
125
110
  report_formatter: Report::Formatter,
@@ -127,14 +112,6 @@ EOB
127
112
  strategy: @strategy)
128
113
  end
129
114
 
130
- def sources
131
- if @argv.empty?
132
- return [$stdin.to_reek_source('$stdin')]
133
- else
134
- return Source::SourceLocator.new(@argv).all_sources
135
- end
136
- end
137
-
138
115
  def program_name
139
116
  @parser.program_name
140
117
  end
@@ -115,10 +115,18 @@ module Reek
115
115
  ruby_options +
116
116
  [%(reek)] +
117
117
  [sort_option] +
118
- ['-c', config_file] +
118
+ config_option +
119
119
  source_file_list.map { |fn| %("#{fn}") }
120
120
  end
121
121
 
122
+ def config_option
123
+ if config_file
124
+ ['-c', config_file]
125
+ else
126
+ []
127
+ end
128
+ end
129
+
122
130
  def config_file
123
131
  ENV['REEK_CFG'] || @config_file
124
132
  end
@@ -1,3 +1,3 @@
1
1
  module Reek
2
- VERSION = '1.6.1'
2
+ VERSION = '1.6.2'
3
3
  end
@@ -31,7 +31,7 @@ Gem::Specification.new do |s|
31
31
  s.summary = 'Code smell detector for Ruby'
32
32
 
33
33
  s.add_runtime_dependency('parser', ['~> 2.2.0.pre.7'])
34
- s.add_runtime_dependency('unparser', ['~> 0.1.16'])
34
+ s.add_runtime_dependency('unparser', ['= 0.1.16'])
35
35
  s.add_runtime_dependency('rainbow', ['>= 1.99', '< 3.0'])
36
36
 
37
37
  s.add_development_dependency('bundler', ['~> 1.1'])
@@ -0,0 +1,4 @@
1
+ class C
2
+ def m
3
+ end
4
+ end
@@ -0,0 +1,7 @@
1
+ ---
2
+ IrresponsibleModule:
3
+ enabled: false
4
+ UncommunicativeModuleName:
5
+ enabled: false
6
+ UncommunicativeMethodName:
7
+ enabled: false
@@ -0,0 +1,7 @@
1
+ ---
2
+ IrresponsibleModule:
3
+ enabled: true
4
+ UncommunicativeModuleName:
5
+ enabled: true
6
+ UncommunicativeMethodName:
7
+ enabled: true
@@ -5,8 +5,7 @@ require 'matchers/smell_of_matcher'
5
5
  require 'factory_girl'
6
6
 
7
7
  begin
8
- require 'pry'
9
- require 'byebug'
8
+ require 'pry-byebug'
10
9
  rescue LoadError # rubocop:disable Lint/HandleExceptions
11
10
  end
12
11
 
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: reek
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.6.1
4
+ version: 1.6.2
5
5
  platform: ruby
6
6
  authors:
7
7
  - Kevin Rutherford
@@ -10,7 +10,7 @@ authors:
10
10
  autorequire:
11
11
  bindir: bin
12
12
  cert_chain: []
13
- date: 2014-12-30 00:00:00.000000000 Z
13
+ date: 2015-01-13 00:00:00.000000000 Z
14
14
  dependencies:
15
15
  - !ruby/object:Gem::Dependency
16
16
  name: parser
@@ -30,14 +30,14 @@ dependencies:
30
30
  name: unparser
31
31
  requirement: !ruby/object:Gem::Requirement
32
32
  requirements:
33
- - - "~>"
33
+ - - '='
34
34
  - !ruby/object:Gem::Version
35
35
  version: 0.1.16
36
36
  type: :runtime
37
37
  prerelease: false
38
38
  version_requirements: !ruby/object:Gem::Requirement
39
39
  requirements:
40
- - - "~>"
40
+ - - '='
41
41
  - !ruby/object:Gem::Version
42
42
  version: 0.1.16
43
43
  - !ruby/object:Gem::Dependency
@@ -190,6 +190,7 @@ files:
190
190
  - features/command_line_interface/stdin.feature
191
191
  - features/configuration_files/masking_smells.feature
192
192
  - features/configuration_files/overrides_defaults.feature
193
+ - features/configuration_loading.feature
193
194
  - features/rake_task/rake_task.feature
194
195
  - features/reports/reports.feature
195
196
  - features/reports/yaml.feature
@@ -197,10 +198,12 @@ files:
197
198
  - features/samples.feature
198
199
  - features/step_definitions/reek_steps.rb
199
200
  - features/support/env.rb
201
+ - features/support/hooks.rb
200
202
  - lib/reek.rb
201
203
  - lib/reek/cli/application.rb
202
204
  - lib/reek/cli/command.rb
203
205
  - lib/reek/cli/help_command.rb
206
+ - lib/reek/cli/input.rb
204
207
  - lib/reek/cli/options.rb
205
208
  - lib/reek/cli/reek_command.rb
206
209
  - lib/reek/cli/report/formatter.rb
@@ -338,6 +341,9 @@ files:
338
341
  - spec/samples/clean_due_to_masking/masked.reek
339
342
  - spec/samples/config/allow_duplication.reek
340
343
  - spec/samples/config/deeper_nested_iterators.reek
344
+ - spec/samples/configuration_loading/minimal_dirty.rb
345
+ - spec/samples/configuration_loading/reek-test-run-disable_smells.reek
346
+ - spec/samples/configuration_loading/reek-test-run-enable_smells.reek
341
347
  - spec/samples/corrupt_config_file/corrupt.reek
342
348
  - spec/samples/corrupt_config_file/dirty.rb
343
349
  - spec/samples/demo/demo.rb
@@ -413,7 +419,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
413
419
  version: '0'
414
420
  requirements: []
415
421
  rubyforge_project: reek
416
- rubygems_version: 2.2.2
422
+ rubygems_version: 2.4.4
417
423
  signing_key:
418
424
  specification_version: 4
419
425
  summary: Code smell detector for Ruby