reek 2.2.1 → 3.0.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (157) hide show
  1. checksums.yaml +4 -4
  2. data/.rubocop.yml +1 -1
  3. data/.travis.yml +9 -4
  4. data/CHANGELOG +8 -0
  5. data/Gemfile +6 -4
  6. data/README.md +6 -0
  7. data/docs/API.md +51 -22
  8. data/docs/Configuration-Files.md +12 -1
  9. data/docs/Feature-Envy.md +30 -10
  10. data/docs/How-reek-works-internally.md +109 -39
  11. data/docs/RSpec-matchers.md +26 -22
  12. data/docs/Reek-Driven-Development.md +0 -8
  13. data/docs/Utility-Function.md +8 -10
  14. data/features/{ruby_api/api.feature → command_line_interface/basic_usage.feature} +2 -2
  15. data/features/programmatic_access.feature +21 -2
  16. data/features/samples.feature +3 -1
  17. data/lib/reek.rb +2 -2
  18. data/lib/reek/{core → ast}/ast_node_class_map.rb +8 -8
  19. data/lib/reek/{sexp/sexp_node.rb → ast/node.rb} +47 -6
  20. data/lib/reek/{core → ast}/object_refs.rb +2 -1
  21. data/lib/reek/{core → ast}/reference_collector.rb +2 -1
  22. data/lib/reek/{sexp → ast}/sexp_extensions.rb +10 -5
  23. data/lib/reek/{sexp → ast}/sexp_formatter.rb +7 -5
  24. data/lib/reek/cli/application.rb +1 -0
  25. data/lib/reek/cli/command.rb +1 -0
  26. data/lib/reek/cli/input.rb +4 -1
  27. data/lib/reek/cli/option_interpreter.rb +6 -4
  28. data/lib/reek/cli/options.rb +2 -1
  29. data/lib/reek/cli/reek_command.rb +3 -2
  30. data/lib/reek/cli/silencer.rb +1 -0
  31. data/lib/reek/{core → cli}/warning_collector.rb +2 -1
  32. data/lib/reek/code_comment.rb +36 -0
  33. data/lib/reek/configuration/app_configuration.rb +17 -2
  34. data/lib/reek/configuration/configuration_file_finder.rb +1 -0
  35. data/lib/reek/{core → context}/code_context.rb +7 -5
  36. data/lib/reek/{core → context}/method_context.rb +5 -3
  37. data/lib/reek/{core → context}/module_context.rb +8 -3
  38. data/lib/reek/{core/stop_context.rb → context/root_context.rb} +4 -2
  39. data/lib/reek/{core → context}/singleton_method_context.rb +2 -1
  40. data/lib/reek/examiner.rb +82 -0
  41. data/lib/reek/report/formatter.rb +70 -0
  42. data/lib/reek/report/heading_formatter.rb +45 -0
  43. data/lib/reek/report/location_formatter.rb +35 -0
  44. data/lib/reek/report/report.rb +198 -0
  45. data/lib/reek/smells.rb +24 -13
  46. data/lib/reek/smells/attribute.rb +6 -4
  47. data/lib/reek/smells/boolean_parameter.rb +3 -1
  48. data/lib/reek/smells/class_variable.rb +3 -1
  49. data/lib/reek/smells/control_parameter.rb +3 -1
  50. data/lib/reek/smells/data_clump.rb +3 -1
  51. data/lib/reek/smells/duplicate_method_call.rb +3 -1
  52. data/lib/reek/smells/feature_envy.rb +3 -1
  53. data/lib/reek/smells/irresponsible_module.rb +12 -7
  54. data/lib/reek/smells/long_parameter_list.rb +5 -3
  55. data/lib/reek/smells/long_yield_list.rb +3 -1
  56. data/lib/reek/smells/module_initialize.rb +3 -1
  57. data/lib/reek/smells/nested_iterators.rb +3 -1
  58. data/lib/reek/smells/nil_check.rb +3 -1
  59. data/lib/reek/smells/prima_donna_method.rb +3 -1
  60. data/lib/reek/smells/repeated_conditional.rb +5 -3
  61. data/lib/reek/{core → smells}/smell_configuration.rb +3 -1
  62. data/lib/reek/smells/smell_detector.rb +9 -7
  63. data/lib/reek/{core → smells}/smell_repository.rb +3 -2
  64. data/lib/reek/smells/smell_warning.rb +6 -4
  65. data/lib/reek/smells/too_many_instance_variables.rb +3 -1
  66. data/lib/reek/smells/too_many_methods.rb +3 -1
  67. data/lib/reek/smells/too_many_statements.rb +3 -1
  68. data/lib/reek/smells/uncommunicative_method_name.rb +3 -1
  69. data/lib/reek/smells/uncommunicative_module_name.rb +3 -1
  70. data/lib/reek/smells/uncommunicative_parameter_name.rb +3 -1
  71. data/lib/reek/smells/uncommunicative_variable_name.rb +3 -1
  72. data/lib/reek/smells/unused_parameters.rb +3 -1
  73. data/lib/reek/smells/utility_function.rb +5 -2
  74. data/lib/reek/source/source_code.rb +40 -9
  75. data/lib/reek/source/source_locator.rb +30 -12
  76. data/lib/reek/spec/should_reek.rb +5 -4
  77. data/lib/reek/spec/should_reek_of.rb +3 -2
  78. data/lib/reek/spec/should_reek_only_of.rb +5 -4
  79. data/lib/reek/tree_dresser.rb +32 -0
  80. data/lib/reek/tree_walker.rb +182 -0
  81. data/lib/reek/version.rb +1 -1
  82. data/reek.gemspec +3 -3
  83. data/spec/factories/factories.rb +2 -0
  84. data/spec/reek/{sexp/sexp_node_spec.rb → ast/node_spec.rb} +2 -2
  85. data/spec/reek/{core → ast}/object_refs_spec.rb +3 -3
  86. data/spec/reek/{core → ast}/reference_collector_spec.rb +2 -2
  87. data/spec/reek/{sexp → ast}/sexp_extensions_spec.rb +6 -16
  88. data/spec/reek/{sexp → ast}/sexp_formatter_spec.rb +2 -2
  89. data/spec/reek/cli/option_interpreter_spec.rb +2 -1
  90. data/spec/reek/{core → cli}/warning_collector_spec.rb +3 -3
  91. data/spec/reek/{core/code_comment_spec.rb → code_comment_spec.rb} +3 -3
  92. data/spec/reek/configuration/app_configuration_spec.rb +31 -18
  93. data/spec/reek/{core → context}/code_context_spec.rb +14 -15
  94. data/spec/reek/{core → context}/method_context_spec.rb +8 -8
  95. data/spec/reek/{core → context}/module_context_spec.rb +4 -4
  96. data/spec/reek/context/root_context_spec.rb +14 -0
  97. data/spec/reek/{core → context}/singleton_method_context_spec.rb +4 -4
  98. data/spec/reek/{core/examiner_spec.rb → examiner_spec.rb} +3 -42
  99. data/spec/reek/{cli → report}/html_report_spec.rb +5 -5
  100. data/spec/reek/report/json_report_spec.rb +20 -0
  101. data/spec/reek/{cli → report}/text_report_spec.rb +14 -14
  102. data/spec/reek/{cli → report}/xml_report_spec.rb +7 -7
  103. data/spec/reek/report/yaml_report_spec.rb +20 -0
  104. data/spec/reek/smells/attribute_spec.rb +2 -1
  105. data/spec/reek/smells/boolean_parameter_spec.rb +1 -1
  106. data/spec/reek/smells/class_variable_spec.rb +5 -5
  107. data/spec/reek/smells/control_parameter_spec.rb +1 -1
  108. data/spec/reek/smells/data_clump_spec.rb +1 -1
  109. data/spec/reek/smells/duplicate_method_call_spec.rb +3 -3
  110. data/spec/reek/smells/feature_envy_spec.rb +1 -1
  111. data/spec/reek/smells/irresponsible_module_spec.rb +24 -28
  112. data/spec/reek/smells/long_parameter_list_spec.rb +2 -2
  113. data/spec/reek/smells/long_yield_list_spec.rb +2 -2
  114. data/spec/reek/smells/nested_iterators_spec.rb +1 -1
  115. data/spec/reek/smells/nil_check_spec.rb +2 -2
  116. data/spec/reek/smells/prima_donna_method_spec.rb +3 -3
  117. data/spec/reek/smells/repeated_conditional_spec.rb +6 -6
  118. data/spec/reek/{core → smells}/smell_configuration_spec.rb +4 -4
  119. data/spec/reek/smells/smell_detector_shared.rb +2 -2
  120. data/spec/reek/{core → smells}/smell_repository_spec.rb +5 -4
  121. data/spec/reek/smells/too_many_instance_variables_spec.rb +1 -1
  122. data/spec/reek/smells/too_many_methods_spec.rb +4 -4
  123. data/spec/reek/smells/too_many_statements_spec.rb +2 -2
  124. data/spec/reek/smells/uncommunicative_method_name_spec.rb +1 -1
  125. data/spec/reek/smells/uncommunicative_module_name_spec.rb +4 -4
  126. data/spec/reek/smells/uncommunicative_parameter_name_spec.rb +2 -2
  127. data/spec/reek/smells/uncommunicative_variable_name_spec.rb +3 -3
  128. data/spec/reek/smells/utility_function_spec.rb +23 -1
  129. data/spec/reek/source/source_code_spec.rb +1 -1
  130. data/spec/reek/source/source_locator_spec.rb +30 -0
  131. data/spec/reek/spec/should_reek_of_spec.rb +0 -17
  132. data/spec/reek/spec/should_reek_spec.rb +0 -25
  133. data/spec/reek/tree_dresser_spec.rb +16 -0
  134. data/spec/reek/{core/tree_walker_spec.rb → tree_walker_spec.rb} +5 -5
  135. data/spec/samples/{simple_configuration.reek → configuration/simple_configuration.reek} +0 -0
  136. data/spec/samples/configuration/with_excluded_paths.reek +4 -0
  137. data/spec/samples/source_with_exclude_paths/ignore_me/uncommunicative_method_name.rb +5 -0
  138. data/spec/samples/source_with_exclude_paths/nested/ignore_me_as_well/irresponsible_module.rb +2 -0
  139. data/spec/samples/source_with_exclude_paths/nested/uncommunicative_parameter_name.rb +6 -0
  140. data/spec/spec_helper.rb +6 -7
  141. data/tasks/develop.rake +2 -2
  142. metadata +71 -69
  143. data/lib/reek/cli/report/formatter.rb +0 -69
  144. data/lib/reek/cli/report/heading_formatter.rb +0 -45
  145. data/lib/reek/cli/report/location_formatter.rb +0 -34
  146. data/lib/reek/cli/report/report.rb +0 -191
  147. data/lib/reek/core/ast_node.rb +0 -38
  148. data/lib/reek/core/code_comment.rb +0 -37
  149. data/lib/reek/core/examiner.rb +0 -85
  150. data/lib/reek/core/tree_dresser.rb +0 -24
  151. data/lib/reek/core/tree_walker.rb +0 -180
  152. data/lib/reek/source/source_repository.rb +0 -43
  153. data/spec/reek/cli/json_report_spec.rb +0 -20
  154. data/spec/reek/cli/yaml_report_spec.rb +0 -20
  155. data/spec/reek/core/object_source_spec.rb +0 -18
  156. data/spec/reek/core/stop_context_spec.rb +0 -14
  157. data/spec/reek/core/tree_dresser_spec.rb +0 -16
@@ -0,0 +1,198 @@
1
+ require 'rainbow'
2
+ require 'json'
3
+ require_relative 'formatter'
4
+ require_relative 'heading_formatter'
5
+
6
+ module Reek
7
+ module Report
8
+ #
9
+ # A report that contains the smells and smell counts following source code analysis.
10
+ #
11
+ # @abstract Subclass and override {#show} to create a concrete report class.
12
+ class Base
13
+ # @api private
14
+ NO_WARNINGS_COLOR = :green
15
+ # @api private
16
+ WARNINGS_COLOR = :red
17
+
18
+ def initialize(options = {})
19
+ @examiners = []
20
+ @total_smell_count = 0
21
+ @options = options
22
+ @warning_formatter = options.fetch :warning_formatter, SimpleWarningFormatter.new
23
+ @report_formatter = options.fetch :report_formatter, Formatter
24
+ @sort_by_issue_count = options.fetch :sort_by_issue_count, false
25
+ end
26
+
27
+ # Add Examiner to report on. The report will output results for all
28
+ # added examiners.
29
+ #
30
+ # @param [Reek::Examiner] examiner object to report on
31
+ def add_examiner(examiner)
32
+ @total_smell_count += examiner.smells_count
33
+ @examiners << examiner
34
+ self
35
+ end
36
+
37
+ # Render the report results on STDOUT
38
+ def show
39
+ raise NotImplementedError
40
+ end
41
+
42
+ # @api private
43
+ def smells?
44
+ @total_smell_count > 0
45
+ end
46
+
47
+ # @api private
48
+ def smells
49
+ @examiners.map(&:smells).flatten
50
+ end
51
+ end
52
+
53
+ #
54
+ # Generates a sorted, text summary of smells in examiners
55
+ #
56
+ class TextReport < Base
57
+ def show
58
+ sort_examiners if smells?
59
+ display_summary
60
+ display_total_smell_count
61
+ end
62
+
63
+ private
64
+
65
+ def smell_summaries
66
+ @examiners.map { |ex| summarize_single_examiner(ex) }.reject(&:empty?)
67
+ end
68
+
69
+ def display_summary
70
+ smell_summaries.each { |smell| puts smell }
71
+ end
72
+
73
+ def display_total_smell_count
74
+ return unless @examiners.size > 1
75
+ print total_smell_count_message
76
+ end
77
+
78
+ def summarize_single_examiner(examiner)
79
+ result = heading_formatter.header(examiner)
80
+ if examiner.smelly?
81
+ formatted_list = @report_formatter.format_list(examiner.smells,
82
+ @warning_formatter)
83
+ result += ":\n#{formatted_list}"
84
+ end
85
+ result
86
+ end
87
+
88
+ def sort_examiners
89
+ @examiners.sort_by!(&:smells_count).reverse! if @sort_by_issue_count
90
+ end
91
+
92
+ def total_smell_count_message
93
+ colour = smells? ? WARNINGS_COLOR : NO_WARNINGS_COLOR
94
+ s = @total_smell_count == 1 ? '' : 's'
95
+ Rainbow("#{@total_smell_count} total warning#{s}\n").color(colour)
96
+ end
97
+
98
+ def heading_formatter
99
+ @heading_formatter ||=
100
+ @options.fetch(:heading_formatter, HeadingFormatter::Quiet).new(@report_formatter)
101
+ end
102
+ end
103
+
104
+ #
105
+ # Displays a list of smells in YAML format
106
+ # YAML with empty array for 0 smells
107
+ class YAMLReport < Base
108
+ def show
109
+ print smells.map(&:yaml_hash).to_yaml
110
+ end
111
+ end
112
+
113
+ #
114
+ # Displays a list of smells in JSON format
115
+ # JSON with empty array for 0 smells
116
+ class JSONReport < Base
117
+ def show
118
+ print ::JSON.generate(
119
+ smells.map do |smell|
120
+ smell.yaml_hash(@warning_formatter)
121
+ end
122
+ )
123
+ end
124
+ end
125
+
126
+ #
127
+ # Saves the report as a HTML file
128
+ #
129
+ class HTMLReport < Base
130
+ require 'erb'
131
+
132
+ def show
133
+ path = File.expand_path('../../../../assets/html_output.html.erb',
134
+ __FILE__)
135
+ File.open('reek.html', 'w+') do |file|
136
+ file.puts ERB.new(File.read(path)).result(binding)
137
+ end
138
+ print("Html file saved\n")
139
+ end
140
+ end
141
+
142
+ #
143
+ # Generates a list of smells in XML format
144
+ #
145
+ class XMLReport < Base
146
+ require 'rexml/document'
147
+
148
+ def show
149
+ checkstyle = REXML::Element.new('checkstyle', document)
150
+
151
+ smells.group_by(&:source).each do |file, file_smells|
152
+ file_to_xml(file, file_smells, checkstyle)
153
+ end
154
+
155
+ print_xml(checkstyle.parent)
156
+ end
157
+
158
+ private
159
+
160
+ def document
161
+ REXML::Document.new.tap do |doc|
162
+ doc << REXML::XMLDecl.new
163
+ end
164
+ end
165
+
166
+ def file_to_xml(file, file_smells, parent)
167
+ REXML::Element.new('file', parent).tap do |element|
168
+ element.attributes['name'] = File.realpath(file)
169
+ smells_to_xml(file_smells, element)
170
+ end
171
+ end
172
+
173
+ def smells_to_xml(smells, parent)
174
+ smells.each do |smell|
175
+ smell_to_xml(smell, parent)
176
+ end
177
+ end
178
+
179
+ def smell_to_xml(smell, parent)
180
+ REXML::Element.new('error', parent).tap do |element|
181
+ attributes = [
182
+ ['line', smell.lines.first],
183
+ ['column', 0],
184
+ ['severity', 'warning'],
185
+ ['message', smell.message],
186
+ ['source', smell.smell_type]
187
+ ]
188
+ element.add_attributes(attributes)
189
+ end
190
+ end
191
+
192
+ def print_xml(document)
193
+ formatter = REXML::Formatters::Default.new
194
+ puts formatter.write(document, '')
195
+ end
196
+ end
197
+ end
198
+ end
@@ -1,13 +1,24 @@
1
- require 'pathname'
2
-
3
- (Pathname.new(__FILE__).dirname + 'smells').children.each do |path|
4
- require_relative "smells/#{path.basename('.rb')}"
5
- end
6
-
7
- module Reek
8
- #
9
- # This module contains the various smell detectors.
10
- #
11
- module Smells
12
- end
13
- end
1
+ require_relative 'smells/attribute'
2
+ require_relative 'smells/boolean_parameter'
3
+ require_relative 'smells/class_variable'
4
+ require_relative 'smells/control_parameter'
5
+ require_relative 'smells/data_clump'
6
+ require_relative 'smells/duplicate_method_call'
7
+ require_relative 'smells/feature_envy'
8
+ require_relative 'smells/irresponsible_module'
9
+ require_relative 'smells/long_parameter_list'
10
+ require_relative 'smells/long_yield_list'
11
+ require_relative 'smells/module_initialize'
12
+ require_relative 'smells/nested_iterators'
13
+ require_relative 'smells/nil_check'
14
+ require_relative 'smells/prima_donna_method'
15
+ require_relative 'smells/repeated_conditional'
16
+ require_relative 'smells/too_many_instance_variables'
17
+ require_relative 'smells/too_many_methods'
18
+ require_relative 'smells/too_many_statements'
19
+ require_relative 'smells/uncommunicative_method_name'
20
+ require_relative 'smells/uncommunicative_module_name'
21
+ require_relative 'smells/uncommunicative_parameter_name'
22
+ require_relative 'smells/uncommunicative_variable_name'
23
+ require_relative 'smells/unused_parameters'
24
+ require_relative 'smells/utility_function'
@@ -1,5 +1,6 @@
1
+ require_relative 'smell_configuration'
1
2
  require_relative 'smell_detector'
2
- require_relative '../core/smell_configuration'
3
+ require_relative 'smell_warning'
3
4
 
4
5
  module Reek
5
6
  module Smells
@@ -12,9 +13,10 @@ module Reek
12
13
  # +attr_reader+, +attr_writer+ and +attr_accessor+ -- including those
13
14
  # that are private.
14
15
  #
15
- # TODO: Catch attributes declared "by hand"
16
- # See docs/Attribute for details.
16
+ # See {file:docs/Attribute.md} for details.
17
+ # @api private
17
18
  #
19
+ # TODO: Catch attributes declared "by hand"
18
20
  class Attribute < SmellDetector
19
21
  ATTR_DEFN_METHODS = [:attr, :attr_reader, :attr_writer, :attr_accessor]
20
22
  VISIBILITY_MODIFIERS = [:private, :public, :protected]
@@ -31,7 +33,7 @@ module Reek
31
33
  end
32
34
 
33
35
  def self.default_config
34
- super.merge(Core::SmellConfiguration::ENABLED_KEY => false)
36
+ super.merge(SmellConfiguration::ENABLED_KEY => false)
35
37
  end
36
38
 
37
39
  #
@@ -1,4 +1,5 @@
1
1
  require_relative 'smell_detector'
2
+ require_relative 'smell_warning'
2
3
 
3
4
  module Reek
4
5
  module Smells
@@ -10,7 +11,8 @@ module Reek
10
11
  # Currently Reek can only detect a Boolean parameter when it has a
11
12
  # default initializer.
12
13
  #
13
- # See docs/Boolean-Parameter for details.
14
+ # See {file:docs/Boolean-Parameter.md} for details.
15
+ # @api private
14
16
  class BooleanParameter < SmellDetector
15
17
  def self.smell_category
16
18
  'ControlCouple'
@@ -1,5 +1,6 @@
1
1
  require 'set'
2
2
  require_relative 'smell_detector'
3
+ require_relative 'smell_warning'
3
4
 
4
5
  module Reek
5
6
  module Smells
@@ -11,7 +12,8 @@ module Reek
11
12
  # In particular, class variables can make it hard to set up tests (because
12
13
  # the context of the test includes all global state).
13
14
  #
14
- # See docs/Class-Variable for details.
15
+ # See {file:docs/Class-Variable.md} for details.
16
+ # @api private
15
17
  class ClassVariable < SmellDetector
16
18
  def self.contexts # :nodoc:
17
19
  [:class, :module]
@@ -1,4 +1,5 @@
1
1
  require_relative 'smell_detector'
2
+ require_relative 'smell_warning'
2
3
 
3
4
  module Reek
4
5
  module Smells
@@ -39,7 +40,8 @@ module Reek
39
40
  # that remains next to where the caller invokes it in
40
41
  # the source code.
41
42
  #
42
- # See docs/Control-Parameter for details.
43
+ # See {file:docs/Control-Parameter.md} for details.
44
+ # @api private
43
45
  class ControlParameter < SmellDetector
44
46
  def self.smell_category
45
47
  'ControlCouple'
@@ -1,4 +1,5 @@
1
1
  require_relative 'smell_detector'
2
+ require_relative 'smell_warning'
2
3
 
3
4
  module Reek
4
5
  module Smells
@@ -14,7 +15,8 @@ module Reek
14
15
  # Currently Reek looks for a group of two or more parameters with
15
16
  # the same names that are expected by three or more methods of a class.
16
17
  #
17
- # See docs/Data-Clump for details.
18
+ # See {file:docs/Data-Clump.md} for details.
19
+ # @api private
18
20
  class DataClump < SmellDetector
19
21
  #
20
22
  # The name of the config field that sets the maximum allowed
@@ -1,4 +1,5 @@
1
1
  require_relative 'smell_detector'
2
+ require_relative 'smell_warning'
2
3
 
3
4
  module Reek
4
5
  module Smells
@@ -15,7 +16,8 @@ module Reek
15
16
  # @other.thing + @other.thing
16
17
  # end
17
18
  #
18
- # See docs/Duplicate-Method-Call for details.
19
+ # See {file:docs/Duplicate-Method-Call.md} for details.
20
+ # @api private
19
21
  class DuplicateMethodCall < SmellDetector
20
22
  # The name of the config field that sets the maximum number of
21
23
  # identical calls to be permitted within any single method.
@@ -1,4 +1,5 @@
1
1
  require_relative 'smell_detector'
2
+ require_relative 'smell_warning'
2
3
 
3
4
  module Reek
4
5
  module Smells
@@ -32,7 +33,8 @@ module Reek
32
33
  # If the method doesn't reference self at all, +UtilityFunction+ is
33
34
  # reported instead.
34
35
  #
35
- # See docs/Feature-Envy for details.
36
+ # See {file:docs/Feature-Envy.md} for details.
37
+ # @api private
36
38
  class FeatureEnvy < SmellDetector
37
39
  def self.smell_category
38
40
  'LowCohesion'
@@ -1,5 +1,5 @@
1
1
  require_relative 'smell_detector'
2
- require_relative '../core/code_comment'
2
+ require_relative 'smell_warning'
3
3
 
4
4
  module Reek
5
5
  module Smells
@@ -7,13 +7,14 @@ module Reek
7
7
  # It is considered good practice to annotate every class and module
8
8
  # with a brief comment outlining its responsibilities.
9
9
  #
10
- # See docs/Irresponsible-Module for details.
10
+ # See {file:docs/Irresponsible-Module.md} for details.
11
+ # @api private
11
12
  class IrresponsibleModule < SmellDetector
12
13
  def self.contexts # :nodoc:
13
14
  [:class]
14
15
  end
15
16
 
16
- def self.descriptive # :nodoc:
17
+ def descriptive # :nodoc:
17
18
  @descriptive ||= {}
18
19
  end
19
20
 
@@ -23,13 +24,17 @@ module Reek
23
24
  # @return [Array<SmellWarning>]
24
25
  #
25
26
  def examine_context(ctx)
26
- comment = Core::CodeComment.new(ctx.exp.comments)
27
- return [] if self.class.descriptive[ctx.full_name] ||= comment.descriptive?
27
+ return [] if descriptive?(ctx)
28
+ expression = ctx.exp
28
29
  [SmellWarning.new(self,
29
30
  context: ctx.full_name,
30
- lines: [ctx.exp.line],
31
+ lines: [expression.line],
31
32
  message: 'has no descriptive comment',
32
- parameters: { name: ctx.exp.text_name })]
33
+ parameters: { name: expression.text_name })]
34
+ end
35
+
36
+ def descriptive?(ctx)
37
+ descriptive[ctx.full_name] ||= ctx.descriptively_commented?
33
38
  end
34
39
  end
35
40
  end
@@ -1,5 +1,6 @@
1
+ require_relative 'smell_configuration'
1
2
  require_relative 'smell_detector'
2
- require_relative '../core/smell_configuration'
3
+ require_relative 'smell_warning'
3
4
 
4
5
  module Reek
5
6
  module Smells
@@ -11,7 +12,8 @@ module Reek
11
12
  # Currently +LongParameterList+ reports any method or block with too
12
13
  # many parameters.
13
14
  #
14
- # See docs/Long-Parameter-List for details.
15
+ # See {file:docs/Long-Parameter-List.md} for details.
16
+ # @api private
15
17
  class LongParameterList < SmellDetector
16
18
  # The name of the config field that sets the maximum number of
17
19
  # parameters permitted in any method or block.
@@ -21,7 +23,7 @@ module Reek
21
23
  def self.default_config
22
24
  super.merge(
23
25
  MAX_ALLOWED_PARAMS_KEY => DEFAULT_MAX_ALLOWED_PARAMS,
24
- Core::SmellConfiguration::OVERRIDES_KEY => {
26
+ SmellConfiguration::OVERRIDES_KEY => {
25
27
  'initialize' => { MAX_ALLOWED_PARAMS_KEY => 5 }
26
28
  }
27
29
  )
@@ -1,4 +1,5 @@
1
1
  require_relative 'smell_detector'
2
+ require_relative 'smell_warning'
2
3
 
3
4
  module Reek
4
5
  module Smells
@@ -6,7 +7,8 @@ module Reek
6
7
  # A variant on LongParameterList that checks the number of items
7
8
  # passed to a block by a +yield+ call.
8
9
  #
9
- # See docs/Long-Yield-List for details.
10
+ # See {file:docs/Long-Yield-List.md} for details.
11
+ # @api private
10
12
  class LongYieldList < SmellDetector
11
13
  # The name of the config field that sets the maximum number of
12
14
  # parameters permitted in any method or block.