reek 2.2.1 → 3.0.0

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.
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.