reek 4.5.3 → 4.5.4

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 34053f46644b02e67bce28cf14ec83289581d477
4
- data.tar.gz: 66637070f65e2c5a95ef84c3e981de7a0ffa5bf5
3
+ metadata.gz: 779579909e4877e391f86f92756b1ce1b45a3202
4
+ data.tar.gz: a7f30fb8db30c839c335c47be2eb00ce0f321bac
5
5
  SHA512:
6
- metadata.gz: 9125b0336673170f5466a661f9c1893fcefc16bc7ace54d75979e817854844e7ccdd6cac5a223ca0c1a200fbaeafd56da79f0435b3f9ea14c9d67e9bea0dc024
7
- data.tar.gz: a8308b810ce8785c1fdd39abbcb19708a86c0aa276698f3d803550a4d1d332ec2612fcfa5c92dbdf29096c4fed4066b05506a78ce8ea6ff1a0a708e5e6fa42aa
6
+ metadata.gz: 5e10d6f4cf3e8f9bc0cf499261647cd167eb5bed0296c97d79263408b4f82b371904da23927e6853ddf2d5643137a513b9f947ce2c3593f3b7b89d602baae21e
7
+ data.tar.gz: 8b3e07023d3001002650fd4489aa130d1350093f4e604ba3ee5a33fa71c916618f2fc14d037c5e4eb737823e64ebc054166db2b6643b0e832c906210e85fd6c6
@@ -65,6 +65,7 @@ RSpec/MultipleExpectations:
65
65
 
66
66
  # FIXME: Update specs to avoid offenses
67
67
  RSpec/NestedGroups:
68
+ MaxNesting: 3
68
69
  Exclude:
69
70
  - 'spec/reek/cli/application_spec.rb'
70
71
 
@@ -21,6 +21,8 @@ matrix:
21
21
  - rvm: rbx-2
22
22
  - rvm: ruby-head
23
23
  fast_finish: true
24
+ before_install:
25
+ - gem install bundler
24
26
  notifications:
25
27
  email:
26
28
  - timo.roessner@googlemail.com
@@ -1,5 +1,9 @@
1
1
  # Change log
2
2
 
3
+ ## 4.5.4 (2017-01-17)
4
+
5
+ * (troessner) Improve documentation and fix PrimaDonnaMethod detector configuration via comment.
6
+
3
7
  ## 4.5.3 (2016-12-05)
4
8
 
5
9
  * (jhubert) Stop reporting FeatureEnvy with super and arguments.
data/Dockerfile CHANGED
@@ -3,7 +3,7 @@
3
3
  # Build and run via:
4
4
  # docker build -t codeclimate/codeclimate-reek . && docker run codeclimate/codeclimate-reek
5
5
 
6
- FROM codeclimate/alpine-ruby:b38
6
+ FROM ruby:2.3.3-alpine
7
7
 
8
8
  MAINTAINER The Reek core team
9
9
 
@@ -12,17 +12,17 @@ ENV app_dir /usr/src/app
12
12
  ENV user app
13
13
 
14
14
  RUN apk --update add git
15
-
16
15
  ADD . ${app_dir}
17
16
 
17
+ RUN adduser -u 9000 -D ${user}
18
+ RUN chown -R ${user}:${user} ${app_dir}
19
+ USER ${user}
20
+
18
21
  WORKDIR ${app_dir}
19
22
 
20
23
  RUN bundle install --without debugging development
21
- RUN adduser -u 9000 -D ${user}
22
- RUN chown -R ${user}:${user} ${app_dir}
23
24
 
24
25
  VOLUME ${code_dir}
25
26
  WORKDIR ${code_dir}
26
- USER ${user}
27
27
 
28
28
  CMD [ "/usr/src/app/bin/code_climate_reek" ]
data/Gemfile CHANGED
@@ -2,25 +2,27 @@ source 'https://rubygems.org'
2
2
 
3
3
  gemspec
4
4
 
5
+ ruby RUBY_VERSION
6
+
5
7
  group :development do
8
+ gem 'activesupport', '>= 4.2'
6
9
  gem 'aruba', '~> 0.14.0'
7
10
  gem 'ataru', '~> 0.2.0'
8
11
  gem 'cucumber', '~> 2.0'
9
12
  gem 'factory_girl', '~> 4.0'
10
13
  gem 'mutant-rspec', '~> 0.8.8'
11
- gem 'rake', '~> 11.1'
14
+ gem 'rake', '~> 12.0'
12
15
  gem 'rspec', '~> 3.0'
13
16
  gem 'simplecov', '~> 0.12.0'
14
17
  gem 'yard', '~> 0.9.5'
15
- gem 'activesupport', '~> 4.2'
16
18
 
17
19
  if RUBY_VERSION >= '2.3'
18
- gem 'rubocop', '~> 0.45.0'
19
- gem 'rubocop-rspec', '~> 1.7'
20
+ gem 'rubocop', '~> 0.46.0'
21
+ gem 'rubocop-rspec', '~> 1.9.0'
20
22
  end
21
23
 
22
24
  platforms :mri do
23
- gem 'redcarpet', '~> 3.3.1'
25
+ gem 'redcarpet', '~> 3.4.0'
24
26
  end
25
27
  end
26
28
 
@@ -61,3 +61,30 @@ method `foo` of the `Dangerous` module.
61
61
  ## Configuration
62
62
 
63
63
  _Prima Donna Method_ offers the [Basic Smell Options](Basic-Smell-Options.md).
64
+
65
+ ## Example configuration via source comment
66
+
67
+ Imagine code like this:
68
+
69
+ ```Ruby
70
+ class Alfa
71
+ def bravo!
72
+ end
73
+ end
74
+ ```
75
+
76
+ This would report:
77
+
78
+ >>
79
+ ruby.rb -- 1 warning:
80
+ [1]:PrimaDonnaMethod: Alfa has prima donna method 'bravo!'
81
+
82
+ If you want to suppress this warning you can do this via source comment like this:
83
+
84
+ ```Ruby
85
+ # :reek:PrimaDonnaMethod: { exclude: [ bravo! ] }
86
+ class Alfa
87
+ def bravo!
88
+ end
89
+ end
90
+ ```
@@ -48,6 +48,33 @@ end
48
48
  Note that disabling this detector via comment works on a class scope, not
49
49
  a method scope (like you can see above).
50
50
 
51
+ Another simple example would be:
52
+
53
+ ```Ruby
54
+ class Alfa
55
+ private
56
+ def bravo
57
+ end
58
+ end
59
+ ```
60
+
61
+ This would report:
62
+
63
+ >>
64
+ ruby.rb -- 1 warning:
65
+ [3]:UnusedPrivateMethod: Alfa has the unused private instance method 'bravo'
66
+
67
+ If you want to suppress this warning you can do this via source comment like this:
68
+
69
+ ```Ruby
70
+ # :reek:UnusedPrivateMethod: { exclude: bravo }
71
+ class Alfa
72
+ private
73
+ def bravo
74
+ end
75
+ end
76
+ ```
77
+
51
78
  ## Known limitations
52
79
 
53
80
  * Method calls via dynamic dispatch (e.g. via `send`) is something Reek (or any other
@@ -41,7 +41,9 @@ Feature: Reek can be controlled using command-line options
41
41
 
42
42
  Configuration:
43
43
  -c, --config FILE Read configuration options from FILE
44
- --smell SMELL Detect smell SMELL (default: all enabled smells)
44
+ --smell SMELL Only look for a specific smell.
45
+ Call it like this: reek --smell PrimaDonnaMethod source.rb
46
+ Check out https://github.com/troessner/reek/blob/master/docs/Code-Smells.md for a list of smells
45
47
 
46
48
  Generate a todo list:
47
49
  -t, --todo Generate a todo list
@@ -6,8 +6,6 @@ module Reek
6
6
  # of an abstract syntax tree.
7
7
  #
8
8
  class ReferenceCollector
9
- STOP_NODES = [:class, :module, :def, :defs].freeze
10
-
11
9
  def initialize(ast)
12
10
  @ast = ast
13
11
  end
@@ -22,12 +20,12 @@ module Reek
22
20
 
23
21
  def explicit_self_calls
24
22
  [:self, :super, :zsuper, :ivar, :ivasgn].flat_map do |node_type|
25
- ast.each_node(node_type, STOP_NODES)
23
+ ast.each_node(node_type)
26
24
  end
27
25
  end
28
26
 
29
27
  def implicit_self_calls
30
- ast.each_node(:send, STOP_NODES).reject(&:receiver)
28
+ ast.each_node(:send).reject(&:receiver)
31
29
  end
32
30
  end
33
31
  end
@@ -95,7 +95,11 @@ module Reek
95
95
  parser.on('-c', '--config FILE', 'Read configuration options from FILE') do |file|
96
96
  self.config_file = Pathname.new(file)
97
97
  end
98
- parser.on('--smell SMELL', 'Detect smell SMELL (default: all enabled smells)') do |smell|
98
+ parser.on('--smell SMELL',
99
+ 'Only look for a specific smell.',
100
+ 'Call it like this: reek --smell PrimaDonnaMethod source.rb',
101
+ 'Check out https://github.com/troessner/reek/blob/master/docs/Code-Smells.md '\
102
+ 'for a list of smells') do |smell|
99
103
  smells_to_detect << smell
100
104
  end
101
105
  end
@@ -40,8 +40,7 @@ module Reek
40
40
  names: names
41
41
  end
42
42
 
43
- def track_singleton_visibility(_visibility, _names)
44
- end
43
+ def track_singleton_visibility(_visibility, _names); end
45
44
 
46
45
  def record_use_of_self
47
46
  parent.record_use_of_self
@@ -28,6 +28,24 @@ module Reek
28
28
  [:class]
29
29
  end
30
30
 
31
+ #
32
+ # @param ctx [Context::ModuleContext]
33
+ # @return [Array<SmellWarning>]
34
+ #
35
+ # Given this code:
36
+ #
37
+ # class Alfa
38
+ # def bravo!
39
+ # end
40
+ # end
41
+ #
42
+ # An example `ctx` could look like this:
43
+ #
44
+ # s(:class,
45
+ # s(:const, nil, :Alfa), nil,
46
+ # s(:def, :bravo!,
47
+ # s(:args), nil))
48
+ #
31
49
  def sniff(ctx)
32
50
  ctx.node_instance_methods.select do |method_sexp|
33
51
  prima_donna_method?(method_sexp, ctx)
@@ -45,6 +63,7 @@ module Reek
45
63
 
46
64
  def prima_donna_method?(method_sexp, ctx)
47
65
  return false unless method_sexp.ends_with_bang?
66
+ return false if ignore_method?(method_sexp, ctx)
48
67
  return false if version_without_bang_exists?(method_sexp, ctx)
49
68
  true
50
69
  end
@@ -55,6 +74,17 @@ module Reek
55
74
  sexp_item.name.to_s == method_sexp.name_without_bang
56
75
  end
57
76
  end
77
+
78
+ #
79
+ # @param method_node [Reek::AST::Node],
80
+ # e.g. s(:def, :bravo!, s(:args), nil)
81
+ # @param ctx [Context::ModuleContext]
82
+ # @return [Boolean]
83
+ #
84
+ def ignore_method?(method_node, ctx)
85
+ ignore_method_names = value(EXCLUDE_KEY, ctx) # e.g. ["bravo!"]
86
+ ignore_method_names.include? method_node.name.to_s # method_node.name is e.g.: :bravo!
87
+ end
58
88
  end
59
89
  end
60
90
  end
@@ -7,6 +7,6 @@ module Reek
7
7
  # @public
8
8
  module Version
9
9
  # @public
10
- STRING = '4.5.3'.freeze
10
+ STRING = '4.5.4'.freeze
11
11
  end
12
12
  end
@@ -43,22 +43,5 @@ RSpec.describe Reek::AST::ReferenceCollector do
43
43
  it 'ignores global variables' do
44
44
  expect(refs_to_self('def no_envy(arga) $s2.to_a; $s2[arga] end')).to eq(0)
45
45
  end
46
-
47
- it 'ignores global variables' do
48
- src = <<-EOS
49
- def accept(t, pat = /.*/nm, &block)
50
- if pat
51
- pat.respond_to?(:match) or raise TypeError, "has no `match'"
52
- else
53
- pat = t if t.respond_to?(:match)
54
- end
55
- unless block
56
- block = pat.method(:convert).to_proc if pat.respond_to?(:convert)
57
- end
58
- @atype[t] = [pat, block]
59
- end
60
- EOS
61
- expect(refs_to_self(src)).to eq(2)
62
- end
63
46
  end
64
47
  end
@@ -47,4 +47,16 @@ RSpec.describe Reek::SmellDetectors::PrimaDonnaMethod do
47
47
 
48
48
  expect(src).not_to reek_of(:PrimaDonnaMethod)
49
49
  end
50
+
51
+ it 'does not report methods we excluded via comment' do
52
+ source = <<-EOF
53
+ # :reek:PrimaDonnaMethod: { exclude: [ bravo! ] }
54
+ class Alfa
55
+ def bravo!
56
+ end
57
+ end
58
+ EOF
59
+
60
+ expect(source).not_to reek_of(:PrimaDonnaMethod)
61
+ end
50
62
  end
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: 4.5.3
4
+ version: 4.5.4
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: 2016-12-05 00:00:00.000000000 Z
14
+ date: 2017-01-17 00:00:00.000000000 Z
15
15
  dependencies:
16
16
  - !ruby/object:Gem::Dependency
17
17
  name: codeclimate-engine-rb