reek 3.2.1 → 3.3.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (112) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +5 -0
  3. data/Rakefile +0 -1
  4. data/config/defaults.reek +1 -1
  5. data/features/samples.feature +17 -16
  6. data/lib/reek.rb +0 -1
  7. data/lib/reek/ast/ast_node_class_map.rb +5 -1
  8. data/lib/reek/ast/node.rb +10 -3
  9. data/lib/reek/ast/object_refs.rb +11 -5
  10. data/lib/reek/ast/reference_collector.rb +6 -2
  11. data/lib/reek/ast/sexp_extensions.rb +42 -1
  12. data/lib/reek/ast/sexp_formatter.rb +2 -1
  13. data/lib/reek/cli/application.rb +12 -9
  14. data/lib/reek/cli/command.rb +6 -0
  15. data/lib/reek/cli/input.rb +4 -4
  16. data/lib/reek/cli/option_interpreter.rb +11 -7
  17. data/lib/reek/cli/options.rb +42 -40
  18. data/lib/reek/cli/reek_command.rb +3 -3
  19. data/lib/reek/cli/silencer.rb +12 -3
  20. data/lib/reek/cli/warning_collector.rb +8 -3
  21. data/lib/reek/code_comment.rb +6 -1
  22. data/lib/reek/configuration/app_configuration.rb +65 -100
  23. data/lib/reek/configuration/configuration_file_finder.rb +4 -13
  24. data/lib/reek/configuration/configuration_validator.rb +35 -0
  25. data/lib/reek/configuration/default_directive.rb +12 -0
  26. data/lib/reek/configuration/directory_directives.rb +54 -0
  27. data/lib/reek/configuration/excluded_paths.rb +18 -0
  28. data/lib/reek/context/code_context.rb +19 -17
  29. data/lib/reek/examiner.rb +9 -7
  30. data/lib/reek/rake/task.rb +12 -22
  31. data/lib/reek/report/formatter.rb +6 -1
  32. data/lib/reek/report/report.rb +22 -13
  33. data/lib/reek/smells/attribute.rb +6 -53
  34. data/lib/reek/smells/control_parameter.rb +21 -13
  35. data/lib/reek/smells/data_clump.rb +17 -9
  36. data/lib/reek/smells/duplicate_method_call.rb +12 -6
  37. data/lib/reek/smells/long_parameter_list.rb +2 -2
  38. data/lib/reek/smells/long_yield_list.rb +4 -4
  39. data/lib/reek/smells/nested_iterators.rb +4 -2
  40. data/lib/reek/smells/nil_check.rb +6 -2
  41. data/lib/reek/smells/repeated_conditional.rb +3 -3
  42. data/lib/reek/smells/smell_configuration.rb +17 -7
  43. data/lib/reek/smells/smell_detector.rb +24 -11
  44. data/lib/reek/smells/smell_repository.rb +1 -1
  45. data/lib/reek/smells/smell_warning.rb +6 -6
  46. data/lib/reek/smells/too_many_instance_variables.rb +2 -2
  47. data/lib/reek/smells/too_many_methods.rb +4 -4
  48. data/lib/reek/smells/too_many_statements.rb +4 -4
  49. data/lib/reek/smells/uncommunicative_method_name.rb +5 -5
  50. data/lib/reek/smells/uncommunicative_module_name.rb +6 -6
  51. data/lib/reek/smells/uncommunicative_parameter_name.rb +8 -4
  52. data/lib/reek/smells/uncommunicative_variable_name.rb +9 -5
  53. data/lib/reek/smells/utility_function.rb +1 -1
  54. data/lib/reek/source/source_code.rb +5 -1
  55. data/lib/reek/source/source_locator.rb +3 -2
  56. data/lib/reek/spec.rb +3 -3
  57. data/lib/reek/spec/should_reek.rb +10 -5
  58. data/lib/reek/spec/should_reek_of.rb +9 -6
  59. data/lib/reek/spec/should_reek_only_of.rb +13 -8
  60. data/lib/reek/tree_dresser.rb +6 -2
  61. data/lib/reek/tree_walker.rb +40 -32
  62. data/lib/reek/version.rb +1 -1
  63. data/reek.gemspec +1 -1
  64. data/spec/reek/ast/node_spec.rb +1 -2
  65. data/spec/reek/ast/object_refs_spec.rb +40 -42
  66. data/spec/reek/ast/sexp_extensions_spec.rb +98 -104
  67. data/spec/reek/cli/warning_collector_spec.rb +8 -12
  68. data/spec/reek/code_comment_spec.rb +3 -5
  69. data/spec/reek/configuration/app_configuration_spec.rb +43 -57
  70. data/spec/reek/configuration/configuration_file_finder_spec.rb +5 -7
  71. data/spec/reek/configuration/default_directive_spec.rb +13 -0
  72. data/spec/reek/configuration/directory_directives_spec.rb +89 -0
  73. data/spec/reek/configuration/excluded_paths_spec.rb +30 -0
  74. data/spec/reek/context/code_context_spec.rb +63 -62
  75. data/spec/reek/context/method_context_spec.rb +8 -12
  76. data/spec/reek/context/module_context_spec.rb +1 -1
  77. data/spec/reek/context/root_context_spec.rb +3 -7
  78. data/spec/reek/examiner_spec.rb +14 -25
  79. data/spec/reek/smells/attribute_spec.rb +2 -4
  80. data/spec/reek/smells/boolean_parameter_spec.rb +5 -7
  81. data/spec/reek/smells/class_variable_spec.rb +29 -44
  82. data/spec/reek/smells/control_parameter_spec.rb +7 -9
  83. data/spec/reek/smells/data_clump_spec.rb +25 -32
  84. data/spec/reek/smells/duplicate_method_call_spec.rb +8 -7
  85. data/spec/reek/smells/feature_envy_spec.rb +16 -17
  86. data/spec/reek/smells/irresponsible_module_spec.rb +2 -4
  87. data/spec/reek/smells/long_parameter_list_spec.rb +6 -9
  88. data/spec/reek/smells/long_yield_list_spec.rb +6 -9
  89. data/spec/reek/smells/nested_iterators_spec.rb +14 -16
  90. data/spec/reek/smells/repeated_conditional_spec.rb +25 -25
  91. data/spec/reek/smells/smell_configuration_spec.rb +32 -27
  92. data/spec/reek/smells/smell_detector_shared.rb +12 -13
  93. data/spec/reek/smells/smell_warning_spec.rb +54 -58
  94. data/spec/reek/smells/too_many_instance_variables_spec.rb +9 -9
  95. data/spec/reek/smells/too_many_methods_spec.rb +13 -14
  96. data/spec/reek/smells/too_many_statements_spec.rb +8 -10
  97. data/spec/reek/smells/uncommunicative_method_name_spec.rb +8 -9
  98. data/spec/reek/smells/uncommunicative_module_name_spec.rb +12 -13
  99. data/spec/reek/smells/uncommunicative_parameter_name_spec.rb +7 -10
  100. data/spec/reek/smells/uncommunicative_variable_name_spec.rb +16 -20
  101. data/spec/reek/smells/utility_function_spec.rb +11 -15
  102. data/spec/reek/source/source_code_spec.rb +6 -11
  103. data/spec/reek/spec/should_reek_of_spec.rb +19 -30
  104. data/spec/reek/spec/should_reek_only_of_spec.rb +28 -34
  105. data/spec/reek/tree_walker_spec.rb +14 -2
  106. data/spec/spec_helper.rb +2 -3
  107. data/tasks/test.rake +0 -5
  108. metadata +10 -6
  109. data/docs/Configuration-Files.md +0 -49
  110. data/spec/gem/updates_spec.rb +0 -25
  111. data/spec/gem/yard_spec.rb +0 -11
  112. data/spec/reek/smells/behaves_like_variable_detector.rb +0 -39
@@ -18,21 +18,12 @@ module Reek
18
18
  module ConfigurationFileFinder
19
19
  module_function
20
20
 
21
- def find_and_load(params = {})
22
- load_from_file(find(params))
21
+ def find_and_load(path: nil)
22
+ load_from_file(find(path: path))
23
23
  end
24
24
 
25
- # FIXME: switch to kwargs on upgrade to Ruby 2 and drop `params.fetch` calls:
26
- # def find(options: nil, current: Pathname.pwd, home: Pathname.new(Dir.home))
27
- def find(params = {})
28
- options = params.fetch(:options) { nil }
29
- current = params.fetch(:current) { Pathname.pwd }
30
- home = params.fetch(:home) { Pathname.new(Dir.home) }
31
- find_by_cli(options) || find_by_dir(current) || find_by_dir(home)
32
- end
33
-
34
- def find_by_cli(options)
35
- options && options.config_file
25
+ def find(path: nil, current: Pathname.pwd, home: Pathname.new(Dir.home))
26
+ path || find_by_dir(current) || find_by_dir(home)
36
27
  end
37
28
 
38
29
  def find_by_dir(start)
@@ -0,0 +1,35 @@
1
+ module Reek
2
+ module Configuration
3
+ #
4
+ # Configuration validator module.
5
+ #
6
+ module ConfigurationValidator
7
+ private
8
+
9
+ def smell_type?(key)
10
+ Reek::Smells.const_get key
11
+ rescue NameError
12
+ false
13
+ end
14
+
15
+ def error_message_for_missing_directory(pathname)
16
+ "Configuration error: Directory `#{pathname}` does not exist"
17
+ end
18
+
19
+ def error_message_for_file_given(pathname)
20
+ "Configuration error: `#{pathname}` is supposed to be a directory but is a file"
21
+ end
22
+
23
+ def validate_directory(pathname)
24
+ abort(error_message_for_missing_directory(pathname)) unless pathname.exist?
25
+ abort(error_message_for_file_given(pathname)) if pathname.file?
26
+ end
27
+
28
+ def with_valid_directory(path)
29
+ directory = Pathname.new path.to_s.chomp('/')
30
+ validate_directory directory
31
+ yield directory if block_given?
32
+ end
33
+ end
34
+ end
35
+ end
@@ -0,0 +1,12 @@
1
+ module Reek
2
+ module Configuration
3
+ #
4
+ # Hash extension for the default directive.
5
+ #
6
+ module DefaultDirective
7
+ def add(key, config)
8
+ self[Reek::Smells.const_get(key)] = config
9
+ end
10
+ end
11
+ end
12
+ end
@@ -0,0 +1,54 @@
1
+ require_relative './configuration_validator'
2
+
3
+ module Reek
4
+ module Configuration
5
+ #
6
+ # Hash extension for directory directives.
7
+ #
8
+ module DirectoryDirectives
9
+ include ConfigurationValidator
10
+
11
+ # Returns the directive for a given source.
12
+ #
13
+ # @param source_via [String] the source of the code inspected
14
+ #
15
+ # @return [Hash | nil] the configuration for the source or nil
16
+ def directive_for(source_via)
17
+ return unless source_via
18
+ source_base_dir = Pathname.new(source_via).dirname
19
+ hit = best_match_for source_base_dir
20
+ self[hit]
21
+ end
22
+
23
+ # Adds a directive and returns self.
24
+ #
25
+ # @param path [Pathname] the path
26
+ # @param config [Hash] the configuration
27
+ #
28
+ # @return [self]
29
+ def add(path, config)
30
+ with_valid_directory(path) do |directory|
31
+ self[directory] = config.each_with_object({}) do |(key, value), hash|
32
+ abort(error_message_for_invalid_smell_type(key)) unless smell_type?(key)
33
+ hash[Reek::Smells.const_get(key)] = value
34
+ end
35
+ end
36
+ self
37
+ end
38
+
39
+ private
40
+
41
+ def best_match_for(source_base_dir)
42
+ keys.
43
+ select { |pathname| source_base_dir.to_s.match(/#{Regexp.escape(pathname.to_s)}/) }.
44
+ max_by { |pathname| pathname.to_s.length }
45
+ end
46
+
47
+ def error_message_for_invalid_smell_type(klass)
48
+ "You are trying to configure smell type #{klass} but we can't find one with that name.\n" \
49
+ "Please make sure you spelled it right (see 'config/defaults.reek' in the reek\n" \
50
+ 'repository for a list of all available smell types.'
51
+ end
52
+ end
53
+ end
54
+ end
@@ -0,0 +1,18 @@
1
+ require_relative './configuration_validator'
2
+
3
+ module Reek
4
+ module Configuration
5
+ #
6
+ # Hash extension for excluded paths.
7
+ #
8
+ module ExcludedPaths
9
+ include ConfigurationValidator
10
+
11
+ def add(paths)
12
+ paths.each do |path|
13
+ with_valid_directory(path) { |directory| self << directory }
14
+ end
15
+ end
16
+ end
17
+ end
18
+ end
@@ -70,11 +70,11 @@ module Reek
70
70
  # @param child [CodeContext] the child context to register
71
71
  def append_child_context(child)
72
72
  child.visibility = tracked_visibility
73
- @children << child
73
+ children << child
74
74
  end
75
75
 
76
76
  def count_statements(num)
77
- @num_statements += num
77
+ self.num_statements += num
78
78
  end
79
79
 
80
80
  def record_call_to(exp)
@@ -83,19 +83,19 @@ module Reek
83
83
  case type
84
84
  when :lvar, :lvasgn
85
85
  unless exp.object_creation_call?
86
- @refs.record_reference_to(receiver.name, line: exp.line)
86
+ refs.record_reference_to(receiver.name, line: exp.line)
87
87
  end
88
88
  when :self
89
- @refs.record_reference_to(:self, line: exp.line)
89
+ refs.record_reference_to(:self, line: exp.line)
90
90
  end
91
91
  end
92
92
 
93
93
  def record_use_of_self
94
- @refs.record_reference_to(:self)
94
+ refs.record_reference_to(:self)
95
95
  end
96
96
 
97
97
  def name
98
- @exp.name
98
+ exp.name
99
99
  end
100
100
 
101
101
  def local_nodes(type, &blk)
@@ -103,7 +103,7 @@ module Reek
103
103
  end
104
104
 
105
105
  def each_node(type, ignoring, &blk)
106
- @exp.each_node(type, ignoring, &blk)
106
+ exp.each_node(type, ignoring, &blk)
107
107
  end
108
108
 
109
109
  def matches?(candidates)
@@ -119,8 +119,7 @@ module Reek
119
119
  end
120
120
 
121
121
  def full_name
122
- context = @context ? @context.full_name : ''
123
- exp.full_name(context)
122
+ exp.full_name(context ? context.full_name : '')
124
123
  end
125
124
 
126
125
  def config_for(detector_class)
@@ -140,46 +139,49 @@ module Reek
140
139
  # @param names [Array<Symbol>]
141
140
  def track_visibility(visibility, names = [])
142
141
  if names.any?
143
- @children.each do |child|
142
+ children.each do |child|
144
143
  child.visibility = visibility if names.include? child.name
145
144
  end
146
145
  else
147
- @tracked_visibility = visibility
146
+ self.tracked_visibility = visibility
148
147
  end
149
148
  end
150
149
 
151
150
  def type
152
- @exp.type
151
+ exp.type
153
152
  end
154
153
 
155
154
  # Iterate over +self+ and child contexts.
156
155
  def each(&block)
157
156
  yield self
158
- @children.each do |child|
157
+ children.each do |child|
159
158
  child.each(&block)
160
159
  end
161
160
  end
162
161
 
163
162
  protected
164
163
 
165
- attr_writer :visibility
164
+ attr_writer :num_statements, :visibility
166
165
 
167
166
  private
168
167
 
168
+ private_attr_writer :tracked_visibility
169
+ private_attr_reader :context, :refs
170
+
169
171
  def tracked_visibility
170
172
  @tracked_visibility ||= :public
171
173
  end
172
174
 
173
175
  def config
174
- @config ||= if @exp
175
- CodeComment.new(@exp.full_comment || '').config
176
+ @config ||= if exp
177
+ CodeComment.new(exp.full_comment || '').config
176
178
  else
177
179
  {}
178
180
  end
179
181
  end
180
182
 
181
183
  def context_config_for(detector_class)
182
- @context ? @context.config_for(detector_class) : {}
184
+ context ? context.config_for(detector_class) : {}
183
185
  end
184
186
  end
185
187
  end
@@ -26,7 +26,7 @@ module Reek
26
26
  #
27
27
  def initialize(source,
28
28
  filter_by_smells = [],
29
- configuration: Configuration::AppConfiguration.new)
29
+ configuration: Configuration::AppConfiguration.default)
30
30
  @source = Source::SourceCode.from(source)
31
31
  @configuration = configuration
32
32
  @collector = CLI::WarningCollector.new
@@ -39,14 +39,14 @@ module Reek
39
39
  # @return [String] description of the source being analysed
40
40
  #
41
41
  def description
42
- @description ||= @source.description
42
+ @description ||= source.description
43
43
  end
44
44
 
45
45
  #
46
46
  # @return [Array<SmellWarning>] the smells found in the source
47
47
  #
48
48
  def smells
49
- @smells ||= @collector.warnings
49
+ @smells ||= collector.warnings
50
50
  end
51
51
 
52
52
  #
@@ -65,13 +65,15 @@ module Reek
65
65
 
66
66
  private
67
67
 
68
+ private_attr_reader :configuration, :collector, :smell_types, :source
69
+
68
70
  def run
69
71
  smell_repository = Smells::SmellRepository.new(source_description: description,
70
- smell_types: @smell_types,
71
- configuration: @configuration)
72
- syntax_tree = @source.syntax_tree
72
+ smell_types: smell_types,
73
+ configuration: configuration)
74
+ syntax_tree = source.syntax_tree
73
75
  TreeWalker.new(smell_repository, syntax_tree).walk if syntax_tree
74
- smell_repository.report_on(@collector)
76
+ smell_repository.report_on(collector)
75
77
  end
76
78
 
77
79
  def eligible_smell_types(filter_by_smells = [])
@@ -39,17 +39,17 @@ module Reek
39
39
 
40
40
  # Path to reek's config file.
41
41
  # Setting the REEK_CFG environment variable overrides this.
42
- attr_writer :config_file
42
+ attr_accessor :config_file
43
43
 
44
44
  # Glob pattern to match source files.
45
45
  # Setting the REEK_SRC environment variable overrides this.
46
46
  # Defaults to 'lib/**/*.rb'.
47
- attr_writer :source_files
47
+ attr_accessor :source_files
48
48
 
49
49
  # String containing commandline options to be passed to Reek.
50
50
  # Setting the REEK_OPTS environment variable overrides this value.
51
51
  # Defaults to ''.
52
- attr_writer :reek_opts
52
+ attr_accessor :reek_opts
53
53
 
54
54
  # Whether or not to fail Rake when an error occurs (typically when smells are found).
55
55
  # Defaults to true.
@@ -60,10 +60,11 @@ module Reek
60
60
  attr_writer :verbose
61
61
 
62
62
  def initialize(name = :reek)
63
+ @config_file = ENV['REEK_CFG']
63
64
  @name = name
64
- @reek_opts = ''
65
+ @reek_opts = ENV['REEK_OPTS'] || ''
65
66
  @fail_on_error = true
66
- @source_files = 'lib/**/*.rb'
67
+ @source_files = FileList[ENV['REEK_SRC'] || 'lib/**/*.rb']
67
68
  @verbose = false
68
69
 
69
70
  yield self if block_given?
@@ -72,15 +73,17 @@ module Reek
72
73
 
73
74
  private
74
75
 
76
+ private_attr_reader :fail_on_error, :name, :verbose
77
+
75
78
  def define_task
76
79
  desc 'Check for code smells'
77
- task(@name) { run_task }
80
+ task(name) { run_task }
78
81
  end
79
82
 
80
83
  def run_task
81
- puts "\n\n!!! Running 'reek' rake command: #{command}\n\n" if @verbose
84
+ puts "\n\n!!! Running 'reek' rake command: #{command}\n\n" if verbose
82
85
  system(*command)
83
- abort("\n\n!!! `reek` has found smells - exiting!") if sys_call_failed? && @fail_on_error
86
+ abort("\n\n!!! `reek` has found smells - exiting!") if sys_call_failed? && fail_on_error
84
87
  end
85
88
 
86
89
  def command
@@ -89,25 +92,12 @@ module Reek
89
92
  reject(&:empty?)
90
93
  end
91
94
 
92
- def source_files
93
- FileList[ENV['REEK_SRC'] || @source_files]
94
- end
95
-
96
- def reek_opts
97
- ENV['REEK_OPTS'] || @reek_opts
98
- end
99
-
100
- def config_file
101
- ENV['REEK_CFG'] || @config_file
102
- end
103
-
104
95
  def sys_call_failed?
105
96
  !$CHILD_STATUS.success?
106
97
  end
107
98
 
108
99
  def config_file_as_argument
109
- return [] unless @config_file
110
- ['-c', @config_file]
100
+ config_file ? ['-c', config_file] : []
111
101
  end
112
102
 
113
103
  def reek_opts_as_arguments
@@ -1,3 +1,4 @@
1
+ require 'private_attr/everywhere'
1
2
  require_relative 'location_formatter'
2
3
 
3
4
  module Reek
@@ -35,7 +36,7 @@ module Reek
35
36
  end
36
37
 
37
38
  def format(warning)
38
- "#{@location_formatter.format(warning)}#{base_format(warning)}"
39
+ "#{location_formatter.format(warning)}#{base_format(warning)}"
39
40
  end
40
41
 
41
42
  private
@@ -43,6 +44,10 @@ module Reek
43
44
  def base_format(warning)
44
45
  "#{warning.context} #{warning.message} (#{warning.smell_type})"
45
46
  end
47
+
48
+ private
49
+
50
+ private_attr_reader :location_formatter
46
51
  end
47
52
 
48
53
  #
@@ -30,8 +30,8 @@ module Reek
30
30
  #
31
31
  # @param [Reek::Examiner] examiner object to report on
32
32
  def add_examiner(examiner)
33
- @total_smell_count += examiner.smells_count
34
- @examiners << examiner
33
+ self.total_smell_count += examiner.smells_count
34
+ examiners << examiner
35
35
  self
36
36
  end
37
37
 
@@ -42,13 +42,22 @@ module Reek
42
42
 
43
43
  # @api private
44
44
  def smells?
45
- @total_smell_count > 0
45
+ total_smell_count > 0
46
46
  end
47
47
 
48
48
  # @api private
49
49
  def smells
50
- @examiners.map(&:smells).flatten
50
+ examiners.map(&:smells).flatten
51
51
  end
52
+
53
+ protected
54
+
55
+ attr_accessor :total_smell_count
56
+
57
+ private
58
+
59
+ private_attr_reader :examiners, :options, :report_formatter,
60
+ :sort_by_issue_count, :warning_formatter
52
61
  end
53
62
 
54
63
  #
@@ -64,7 +73,7 @@ module Reek
64
73
  private
65
74
 
66
75
  def smell_summaries
67
- @examiners.map { |ex| summarize_single_examiner(ex) }.reject(&:empty?)
76
+ examiners.map { |ex| summarize_single_examiner(ex) }.reject(&:empty?)
68
77
  end
69
78
 
70
79
  def display_summary
@@ -72,33 +81,33 @@ module Reek
72
81
  end
73
82
 
74
83
  def display_total_smell_count
75
- return unless @examiners.size > 1
84
+ return unless examiners.size > 1
76
85
  print total_smell_count_message
77
86
  end
78
87
 
79
88
  def summarize_single_examiner(examiner)
80
89
  result = heading_formatter.header(examiner)
81
90
  if examiner.smelly?
82
- formatted_list = @report_formatter.format_list(examiner.smells,
83
- @warning_formatter)
91
+ formatted_list = report_formatter.format_list(examiner.smells,
92
+ warning_formatter)
84
93
  result += ":\n#{formatted_list}"
85
94
  end
86
95
  result
87
96
  end
88
97
 
89
98
  def sort_examiners
90
- @examiners.sort_by!(&:smells_count).reverse! if @sort_by_issue_count
99
+ examiners.sort_by!(&:smells_count).reverse! if sort_by_issue_count
91
100
  end
92
101
 
93
102
  def total_smell_count_message
94
103
  colour = smells? ? WARNINGS_COLOR : NO_WARNINGS_COLOR
95
- s = @total_smell_count == 1 ? '' : 's'
96
- Rainbow("#{@total_smell_count} total warning#{s}\n").color(colour)
104
+ s = total_smell_count == 1 ? '' : 's'
105
+ Rainbow("#{total_smell_count} total warning#{s}\n").color(colour)
97
106
  end
98
107
 
99
108
  def heading_formatter
100
109
  @heading_formatter ||=
101
- @options.fetch(:heading_formatter, HeadingFormatter::Quiet).new(@report_formatter)
110
+ options.fetch(:heading_formatter, HeadingFormatter::Quiet).new(report_formatter)
102
111
  end
103
112
  end
104
113
 
@@ -118,7 +127,7 @@ module Reek
118
127
  def show
119
128
  print ::JSON.generate(
120
129
  smells.map do |smell|
121
- smell.yaml_hash(@warning_formatter)
130
+ smell.yaml_hash(warning_formatter)
122
131
  end
123
132
  )
124
133
  end