reek 3.8.1 → 3.8.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: fa22fd6869d0e417b1a06439dfe1708b19681806
4
- data.tar.gz: 64206ff481be4eec7b81f104414b8adfe20368c9
3
+ metadata.gz: 4b0a5ac6a8b0b3a7b7c68c09462e3337c8914e9e
4
+ data.tar.gz: 519f5ade29783ce076e8b6ee58b126ccef9afc27
5
5
  SHA512:
6
- metadata.gz: 5d1059a61327c5541cb78cc9d03eb14e09c07ecd282c4231ab84f18afc98aa627b581238e960d23d061b22dd6e18a1cc3b0a0e99c3d9928dc7adecdbd6466eec
7
- data.tar.gz: 849705c263f676c58fc845ccfdad492ee807fc28e1f7e20fa6a5fbd6b146aa69325f909bfdf6bf07a063c9a3172e494cbb0390e49c328e765293d32135ccde0e
6
+ metadata.gz: 336a10dfe8f830398b76dc288aab1eaad282d6f6e83d904d5292ee08436ea932e14090f791f9eee039fea211b772aee472ca66a0f31f4b10c5742db147b5e414
7
+ data.tar.gz: 8a120730d0611c4ca5e23bbddfca5c0ea76badf734dfe925588b299e2d5508298cbeae7be1c943e6e3b8dfe21e813907085eda4fcf15024c96dd32926edd0f4d
@@ -2,6 +2,10 @@
2
2
 
3
3
  ## Unreleased
4
4
 
5
+ ## 3.8.2 (2016-01-07)
6
+
7
+ * (pocke) Skip path if path doesn't exist.
8
+
5
9
  ## 3.8.1 (2015-12-28)
6
10
 
7
11
  * (troessner) Don't raise on missing directory for directive.
data/README.md CHANGED
@@ -17,7 +17,7 @@ Reek is a tool that examines Ruby classes, modules and methods and reports any
17
17
 
18
18
  For an excellent introduction to
19
19
  [Code Smells](docs/Code-Smells.md) and `Reek` check out [this blog post](https://blog.codeship.com/how-to-find-ruby-code-smells-with-reek/)
20
- or [this talk](https://www.youtube.com/watch?v=ZzqOuHI5MkA).
20
+ or [that one](https://troessner.wordpress.com/2016/01/01/the-latest-and-greatest-additions-to-reek/). There is also [this talk](https://www.youtube.com/watch?v=ZzqOuHI5MkA) from the RUBYCONF Porto.
21
21
 
22
22
  Install it via rubygems:
23
23
 
@@ -385,6 +385,8 @@ Just add this to your configuration file:
385
385
  enabled: false
386
386
  NestedIterators:
387
387
  max_allowed_nesting: 2
388
+ UnusedPrivateMethod:
389
+ enabled: false
388
390
  "app/helpers":
389
391
  IrresponsibleModule:
390
392
  enabled: false
@@ -14,6 +14,16 @@ Feature: Reek can be controlled using command-line options
14
14
  Then it succeeds
15
15
  And it reports the current version
16
16
 
17
+ Scenario: return given status code when using --failure-exit-code
18
+ Given the smelly file 'smelly.rb'
19
+ When I run reek smelly.rb --failure-exit-code 23
20
+ Then the exit status is 23
21
+
22
+ Scenario: return given status code when using --success-exit-code
23
+ Given the clean file 'clean.rb'
24
+ When I run reek clean.rb --success-exit-code 42
25
+ Then the exit status is 42
26
+
17
27
  Scenario: display the help information
18
28
  When I run reek --help
19
29
  Then it succeeds
@@ -52,6 +62,10 @@ Feature: Reek can be controlled using command-line options
52
62
  smelliness ("smelliest" files first)
53
63
  none (default - output in processing order)
54
64
 
65
+ Exit codes:
66
+ --success-exit-code CODE The exit code when no smells are found (default: 0)
67
+ --failure-exit-code CODE The exit code when smells are found (default: 2)
68
+
55
69
  Utility options:
56
70
  -h, --help Show this message
57
71
  -v, --version Show version
@@ -23,20 +23,24 @@ Then /^stdout includes "(.*)"$/ do |text|
23
23
  end
24
24
 
25
25
  Then /^it succeeds$/ do
26
- success = Reek::CLI::Application::STATUS_SUCCESS
26
+ success = Reek::CLI::Options::DEFAULT_SUCCESS_EXIT_CODE
27
27
  expect(last_command_started).to have_exit_status(success)
28
28
  end
29
29
 
30
30
  Then /^the exit status indicates an error$/ do
31
- error = Reek::CLI::Application::STATUS_ERROR
31
+ error = Reek::CLI::Options::DEFAULT_ERROR_EXIT_CODE
32
32
  expect(last_command_started).to have_exit_status(error)
33
33
  end
34
34
 
35
35
  Then /^the exit status indicates smells$/ do
36
- smells = Reek::CLI::Application::STATUS_SMELLS
36
+ smells = Reek::CLI::Options::DEFAULT_FAILURE_EXIT_CODE
37
37
  expect(last_command_started).to have_exit_status(smells)
38
38
  end
39
39
 
40
+ Then(/^the exit status is (\d+)$/) do |status|
41
+ expect(last_command_started).to have_exit_status(status.to_i)
42
+ end
43
+
40
44
  Then /^it reports:$/ do |report|
41
45
  expect(last_command_started).to have_output_on_stdout(report.gsub('\n', "\n"))
42
46
  end
@@ -1,3 +1,22 @@
1
+ Given(/^the smelly file 'smelly.rb'$/) do
2
+ contents = <<-EOS.strip_heredoc
3
+ class Smelly
4
+ def x; end
5
+ end
6
+ EOS
7
+ write_file('smelly.rb', contents)
8
+ end
9
+
10
+ Given(/^the clean file 'clean.rb'$/) do
11
+ contents = <<-EOS.strip_heredoc
12
+ # Explanatory comment
13
+ class Clean
14
+ def foo; end
15
+ end
16
+ EOS
17
+ write_file('clean.rb', contents)
18
+ end
19
+
1
20
  Given(/^the smelly file 'demo.rb' from the example in the README$/) do
2
21
  contents = <<-EOS.strip_heredoc
3
22
  class Dirty
@@ -11,53 +11,45 @@ module Reek
11
11
  # command line.
12
12
  #
13
13
  class Application
14
- STATUS_SUCCESS = 0
15
- STATUS_ERROR = 1
16
- STATUS_SMELLS = 2
17
14
  attr_reader :configuration
18
15
 
19
16
  private_attr_accessor :status
20
17
  private_attr_reader :command, :options
21
18
 
22
19
  def initialize(argv)
23
- @status = STATUS_SUCCESS
24
20
  @options = configure_options(argv)
21
+ @status = options.success_exit_code
25
22
  @configuration = configure_app_configuration(options.config_file)
26
23
  @command = ReekCommand.new(OptionInterpreter.new(options))
27
24
  end
28
25
 
29
26
  def execute
30
- return status if error_occured?
31
27
  command.execute self
32
28
  status
33
29
  end
34
30
 
35
31
  def report_success
36
- self.status = STATUS_SUCCESS
32
+ self.status = options.success_exit_code
37
33
  end
38
34
 
39
35
  def report_smells
40
- self.status = STATUS_SMELLS
36
+ self.status = options.failure_exit_code
41
37
  end
42
38
 
43
39
  private
44
40
 
45
- def error_occured?
46
- status == STATUS_ERROR
47
- end
48
-
49
41
  def configure_options(argv)
50
42
  Options.new(argv).parse
51
43
  rescue OptionParser::InvalidOption => error
52
44
  $stderr.puts "Error: #{error}"
53
- exit STATUS_ERROR
45
+ exit Options::DEFAULT_ERROR_EXIT_CODE
54
46
  end
55
47
 
56
48
  def configure_app_configuration(config_file)
57
49
  Configuration::AppConfiguration.from_path(config_file)
58
50
  rescue Reek::Configuration::ConfigFileException => error
59
51
  $stderr.puts "Error: #{error}"
60
- exit STATUS_ERROR
52
+ exit Options::DEFAULT_ERROR_EXIT_CODE
61
53
  end
62
54
  end
63
55
  end
@@ -9,9 +9,14 @@ module Reek
9
9
  #
10
10
  # See {file:docs/Command-Line-Options.md} for details.
11
11
  #
12
- # :reek:TooManyInstanceVariables: { max_instance_variables: 7 }
12
+ # :reek:TooManyInstanceVariables: { max_instance_variables: 9 }
13
13
  # :reek:Attribute: { enabled: false }
14
+ #
14
15
  class Options
16
+ DEFAULT_SUCCESS_EXIT_CODE = 0
17
+ DEFAULT_ERROR_EXIT_CODE = 1
18
+ DEFAULT_FAILURE_EXIT_CODE = 2
19
+
15
20
  attr_reader :argv, :parser, :smells_to_detect
16
21
  attr_accessor :colored,
17
22
  :config_file,
@@ -19,16 +24,20 @@ module Reek
19
24
  :report_format,
20
25
  :show_empty,
21
26
  :show_links,
22
- :sorting
27
+ :sorting,
28
+ :success_exit_code,
29
+ :failure_exit_code
23
30
 
24
31
  def initialize(argv = [])
25
- @argv = argv
26
- @parser = OptionParser.new
27
- @report_format = :text
28
- @location_format = :numbers
29
- @show_links = true
30
- @smells_to_detect = []
31
- @colored = color_support?
32
+ @argv = argv
33
+ @parser = OptionParser.new
34
+ @report_format = :text
35
+ @location_format = :numbers
36
+ @show_links = true
37
+ @smells_to_detect = []
38
+ @colored = color_support?
39
+ @success_exit_code = DEFAULT_SUCCESS_EXIT_CODE
40
+ @failure_exit_code = DEFAULT_FAILURE_EXIT_CODE
32
41
 
33
42
  set_up_parser
34
43
  end
@@ -46,11 +55,13 @@ module Reek
46
55
  $stdout.tty?
47
56
  end
48
57
 
58
+ # :reek:TooManyStatements: { max_statements: 6 }
49
59
  def set_up_parser
50
60
  set_banner
51
61
  set_configuration_options
52
62
  set_alternative_formatter_options
53
63
  set_report_formatting_options
64
+ set_exit_codes
54
65
  set_utility_options
55
66
  end
56
67
 
@@ -138,6 +149,21 @@ module Reek
138
149
  end
139
150
  end
140
151
 
152
+ # :reek:DuplicateMethodCall: { max_calls: 2 }
153
+ def set_exit_codes
154
+ parser.separator "\nExit codes:"
155
+ parser.on('--success-exit-code CODE',
156
+ 'The exit code when no smells are found '\
157
+ "(default: #{DEFAULT_SUCCESS_EXIT_CODE})") do |option|
158
+ self.success_exit_code = Integer(option)
159
+ end
160
+ parser.on('--failure-exit-code CODE',
161
+ 'The exit code when smells are found '\
162
+ "(default: #{DEFAULT_FAILURE_EXIT_CODE})") do |option|
163
+ self.failure_exit_code = Integer(option)
164
+ end
165
+ end
166
+
141
167
  # :reek:TooManyStatements: { max_statements: 7 }
142
168
  def set_utility_options
143
169
  parser.separator "\nUtility options:"
@@ -21,7 +21,7 @@ module Reek
21
21
  # code - Ruby code as String
22
22
  # origin - 'STDIN', 'string' or a filepath as String
23
23
  # parser - the parser to use for generating AST's out of the given source
24
- def initialize(code, origin, parser: Parser::Ruby22)
24
+ def initialize(code: raise, origin: raise, parser: Parser::Ruby22)
25
25
  @source = code
26
26
  @origin = origin
27
27
  @parser = parser
@@ -39,10 +39,10 @@ module Reek
39
39
  # :reek:DuplicateMethodCall: { max_calls: 2 }
40
40
  def self.from(source)
41
41
  case source
42
- when File then new(source.read, source.path)
43
- when IO then new(source.readlines.join, IO_IDENTIFIER)
44
- when Pathname then new(source.read, source.to_s)
45
- when String then new(source, STRING_IDENTIFIER)
42
+ when File then new(code: source.read, origin: source.path)
43
+ when IO then new(code: source.readlines.join, origin: IO_IDENTIFIER)
44
+ when Pathname then new(code: source.read, origin: source.to_s)
45
+ when String then new(code: source, origin: STRING_IDENTIFIER)
46
46
  end
47
47
  end
48
48
 
@@ -31,11 +31,15 @@ module Reek
31
31
 
32
32
  private_attr_reader :configuration, :paths
33
33
 
34
- # :reek:TooManyStatements: { max_statements: 6 }
34
+ # :reek:TooManyStatements: { max_statements: 7 }
35
35
  # :reek:NestedIterators: { max_allowed_nesting: 2 }
36
36
  def source_paths
37
37
  paths.each_with_object([]) do |given_path, relevant_paths|
38
- print_no_such_file_error(given_path) && next unless given_path.exist?
38
+ unless given_path.exist?
39
+ print_no_such_file_error(given_path)
40
+ next
41
+ end
42
+
39
43
  given_path.find do |path|
40
44
  if path.directory?
41
45
  ignore_path?(path) ? Find.prune : next
@@ -6,6 +6,6 @@ module Reek
6
6
  # @public
7
7
  module Version
8
8
  # @public
9
- STRING = '3.8.1'
9
+ STRING = '3.8.2'
10
10
  end
11
11
  end
@@ -6,20 +6,20 @@ RSpec.describe Reek::Source::SourceCode do
6
6
  describe '#syntax_tree' do
7
7
  it 'associates comments with the AST' do
8
8
  source = "# this is\n# a comment\ndef foo; end"
9
- source_code = Reek::Source::SourceCode.new(source, '(string)')
9
+ source_code = Reek::Source::SourceCode.new(code: source, origin: '(string)')
10
10
  result = source_code.syntax_tree
11
11
  expect(result.leading_comment).to eq "# this is\n# a comment"
12
12
  end
13
13
 
14
14
  it 'cleanly processes empty source' do
15
- source_code = Reek::Source::SourceCode.new('', '(string)')
15
+ source_code = Reek::Source::SourceCode.new(code: '', origin: '(string)')
16
16
  result = source_code.syntax_tree
17
17
  expect(result).to be_nil
18
18
  end
19
19
 
20
20
  it 'cleanly processes empty source with comments' do
21
21
  source = "# this is\n# a comment\n"
22
- source_code = Reek::Source::SourceCode.new(source, '(string)')
22
+ source_code = Reek::Source::SourceCode.new(code: source, origin: '(string)')
23
23
  result = source_code.syntax_tree
24
24
  expect(result).to be_nil
25
25
  end
@@ -30,7 +30,7 @@ RSpec.describe Reek::Source::SourceCode do
30
30
  let(:source_name) { 'Test source' }
31
31
  let(:error_message) { 'Error message' }
32
32
  let(:parser) { double('parser') }
33
- let(:src) { Reek::Source::SourceCode.new('', source_name, parser: parser) }
33
+ let(:src) { Reek::Source::SourceCode.new(code: '', origin: source_name, parser: parser) }
34
34
 
35
35
  before { $stderr = catcher }
36
36
 
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: 3.8.1
4
+ version: 3.8.2
5
5
  platform: ruby
6
6
  authors:
7
7
  - Kevin Rutherford
@@ -11,7 +11,7 @@ authors:
11
11
  autorequire:
12
12
  bindir: bin
13
13
  cert_chain: []
14
- date: 2015-12-27 00:00:00.000000000 Z
14
+ date: 2016-01-07 00:00:00.000000000 Z
15
15
  dependencies:
16
16
  - !ruby/object:Gem::Dependency
17
17
  name: codeclimate-engine-rb
@@ -538,7 +538,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
538
538
  version: '0'
539
539
  requirements: []
540
540
  rubyforge_project:
541
- rubygems_version: 2.4.5.1
541
+ rubygems_version: 2.4.5
542
542
  signing_key:
543
543
  specification_version: 4
544
544
  summary: Code smell detector for Ruby