reek 4.8.2 → 5.0.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (213) hide show
  1. checksums.yaml +5 -5
  2. data/{samples/configuration/more_than_one_configuration_file/regular.reek → .reek.yml} +0 -0
  3. data/.rubocop.yml +17 -3
  4. data/.simplecov +1 -0
  5. data/.travis.yml +0 -5
  6. data/.yardopts +1 -1
  7. data/CHANGELOG.md +28 -0
  8. data/Gemfile +1 -1
  9. data/README.md +113 -98
  10. data/Rakefile +16 -3
  11. data/bin/reek +1 -3
  12. data/docs/API.md +2 -9
  13. data/docs/Basic-Smell-Options.md +51 -11
  14. data/docs/Code-Smells.md +1 -1
  15. data/docs/Command-Line-Options.md +14 -4
  16. data/docs/Duplicate-Method-Call.md +49 -1
  17. data/docs/Feature-Envy.md +44 -0
  18. data/docs/How-To-Write-New-Detectors.md +2 -3
  19. data/docs/{Prima-Donna-Method.md → Missing-Safe-Method.md} +11 -9
  20. data/docs/Rake-Task.md +1 -1
  21. data/docs/Reek-4-to-Reek-5-migration.md +193 -0
  22. data/docs/Reek-Driven-Development.md +1 -1
  23. data/docs/Uncommunicative-Method-Name.md +43 -4
  24. data/docs/Uncommunicative-Module-Name.md +48 -6
  25. data/docs/Uncommunicative-Parameter-Name.md +42 -4
  26. data/docs/Uncommunicative-Variable-Name.md +73 -2
  27. data/docs/Unused-Private-Method.md +1 -1
  28. data/docs/defaults.reek.yml +129 -0
  29. data/docs/yard_plugin.rb +1 -0
  30. data/features/command_line_interface/options.feature +46 -4
  31. data/features/command_line_interface/stdin.feature +27 -5
  32. data/features/configuration_files/accept_setting.feature +39 -22
  33. data/features/configuration_files/directory_specific_directives.feature +58 -53
  34. data/features/configuration_files/exclude_directives.feature +8 -7
  35. data/features/configuration_files/masking_smells.feature +35 -6
  36. data/features/configuration_files/mix_accept_reject_setting.feature +24 -21
  37. data/features/configuration_files/reject_setting.feature +45 -34
  38. data/features/configuration_files/schema_validation.feature +59 -0
  39. data/features/configuration_files/unused_private_method.feature +14 -12
  40. data/features/configuration_loading.feature +50 -7
  41. data/features/rake_task/rake_task.feature +5 -5
  42. data/features/reports/json.feature +4 -1
  43. data/features/reports/reports.feature +12 -12
  44. data/features/reports/yaml.feature +3 -0
  45. data/features/rspec_matcher.feature +9 -1
  46. data/features/step_definitions/reek_steps.rb +4 -0
  47. data/features/step_definitions/sample_file_steps.rb +9 -4
  48. data/features/support/env.rb +2 -2
  49. data/features/todo_list.feature +16 -13
  50. data/lib/reek/ast/node.rb +3 -6
  51. data/lib/reek/ast/object_refs.rb +1 -1
  52. data/lib/reek/ast/sexp_extensions/if.rb +1 -1
  53. data/lib/reek/ast/sexp_extensions/methods.rb +1 -1
  54. data/lib/reek/cli/application.rb +4 -3
  55. data/lib/reek/cli/command/report_command.rb +1 -2
  56. data/lib/reek/cli/command/todo_list_command.rb +4 -2
  57. data/lib/reek/cli/options.rb +27 -13
  58. data/lib/reek/cli/silencer.rb +14 -3
  59. data/lib/reek/code_comment.rb +14 -16
  60. data/lib/reek/configuration/app_configuration.rb +32 -28
  61. data/lib/reek/configuration/configuration_converter.rb +110 -0
  62. data/lib/reek/configuration/configuration_file_finder.rb +15 -40
  63. data/lib/reek/configuration/configuration_validator.rb +12 -23
  64. data/lib/reek/configuration/default_directive.rb +17 -3
  65. data/lib/reek/configuration/directory_directives.rb +17 -11
  66. data/lib/reek/configuration/excluded_paths.rb +1 -1
  67. data/lib/reek/configuration/rake_task_converter.rb +29 -0
  68. data/lib/reek/configuration/schema.yml +210 -0
  69. data/lib/reek/configuration/schema_validator.rb +38 -0
  70. data/lib/reek/context/attribute_context.rb +1 -1
  71. data/lib/reek/context/code_context.rb +4 -4
  72. data/lib/reek/context/method_context.rb +2 -2
  73. data/lib/reek/context/module_context.rb +1 -1
  74. data/lib/reek/context_builder.rb +9 -9
  75. data/lib/reek/detector_repository.rb +6 -0
  76. data/lib/reek/documentation_link.rb +2 -2
  77. data/lib/reek/errors/bad_detector_configuration_key_in_comment_error.rb +1 -1
  78. data/lib/reek/errors/bad_detector_in_comment_error.rb +1 -1
  79. data/lib/reek/errors/config_file_error.rb +11 -0
  80. data/lib/reek/errors/encoding_error.rb +2 -2
  81. data/lib/reek/errors/garbage_detector_configuration_in_comment_error.rb +1 -1
  82. data/lib/reek/errors/incomprehensible_source_error.rb +2 -2
  83. data/lib/reek/errors/syntax_error.rb +41 -0
  84. data/lib/reek/examiner.rb +9 -19
  85. data/lib/reek/rake/task.rb +3 -3
  86. data/lib/reek/report.rb +15 -10
  87. data/lib/reek/report/base_report.rb +8 -12
  88. data/lib/reek/report/code_climate/code_climate_configuration.yml +5 -9
  89. data/lib/reek/report/documentation_link_warning_formatter.rb +17 -0
  90. data/lib/reek/report/heading_formatter.rb +54 -0
  91. data/lib/reek/report/json_report.rb +1 -1
  92. data/lib/reek/report/location_formatter.rb +40 -0
  93. data/lib/reek/report/progress_formatter.rb +79 -0
  94. data/lib/reek/report/simple_warning_formatter.rb +34 -0
  95. data/lib/reek/report/text_report.rb +1 -2
  96. data/lib/reek/report/xml_report.rb +3 -3
  97. data/lib/reek/report/yaml_report.rb +1 -1
  98. data/lib/reek/smell_configuration.rb +2 -2
  99. data/lib/reek/smell_detectors.rb +1 -2
  100. data/lib/reek/smell_detectors/attribute.rb +0 -1
  101. data/lib/reek/smell_detectors/base_detector.rb +8 -11
  102. data/lib/reek/smell_detectors/boolean_parameter.rb +0 -1
  103. data/lib/reek/smell_detectors/class_variable.rb +0 -1
  104. data/lib/reek/smell_detectors/control_parameter.rb +17 -32
  105. data/lib/reek/smell_detectors/data_clump.rb +3 -4
  106. data/lib/reek/smell_detectors/duplicate_method_call.rb +5 -6
  107. data/lib/reek/smell_detectors/feature_envy.rb +0 -1
  108. data/lib/reek/smell_detectors/instance_variable_assumption.rb +0 -1
  109. data/lib/reek/smell_detectors/irresponsible_module.rb +0 -1
  110. data/lib/reek/smell_detectors/long_parameter_list.rb +1 -2
  111. data/lib/reek/smell_detectors/long_yield_list.rb +2 -3
  112. data/lib/reek/smell_detectors/manual_dispatch.rb +2 -2
  113. data/lib/reek/smell_detectors/{prima_donna_method.rb → missing_safe_method.rb} +6 -7
  114. data/lib/reek/smell_detectors/module_initialize.rb +0 -1
  115. data/lib/reek/smell_detectors/nested_iterators.rb +4 -5
  116. data/lib/reek/smell_detectors/nil_check.rb +0 -1
  117. data/lib/reek/smell_detectors/repeated_conditional.rb +3 -4
  118. data/lib/reek/smell_detectors/subclassed_from_core_class.rb +0 -1
  119. data/lib/reek/smell_detectors/too_many_constants.rb +1 -2
  120. data/lib/reek/smell_detectors/too_many_instance_variables.rb +1 -2
  121. data/lib/reek/smell_detectors/too_many_methods.rb +1 -2
  122. data/lib/reek/smell_detectors/too_many_statements.rb +1 -2
  123. data/lib/reek/smell_detectors/uncommunicative_method_name.rb +2 -3
  124. data/lib/reek/smell_detectors/uncommunicative_module_name.rb +2 -3
  125. data/lib/reek/smell_detectors/uncommunicative_parameter_name.rb +2 -3
  126. data/lib/reek/smell_detectors/uncommunicative_variable_name.rb +4 -5
  127. data/lib/reek/smell_detectors/unused_parameters.rb +0 -1
  128. data/lib/reek/smell_detectors/unused_private_method.rb +0 -1
  129. data/lib/reek/smell_detectors/utility_function.rb +1 -2
  130. data/lib/reek/smell_warning.rb +10 -8
  131. data/lib/reek/source/source_code.rb +40 -55
  132. data/lib/reek/source/source_locator.rb +7 -7
  133. data/lib/reek/spec.rb +6 -6
  134. data/lib/reek/spec/should_reek.rb +2 -2
  135. data/lib/reek/spec/should_reek_of.rb +9 -16
  136. data/lib/reek/spec/should_reek_only_of.rb +4 -4
  137. data/lib/reek/tree_dresser.rb +5 -5
  138. data/lib/reek/version.rb +1 -1
  139. data/reek.gemspec +3 -3
  140. data/samples/checkstyle.xml +1 -1
  141. data/samples/{clean.rb → clean_source/clean.rb} +0 -0
  142. data/samples/configuration/accepts_rejects_and_excludes_for_detectors.reek.yml +29 -0
  143. data/samples/configuration/accepts_rejects_and_excludes_for_directory_directives.reek.yml +30 -0
  144. data/samples/configuration/full_configuration.reek +8 -4
  145. data/samples/configuration/full_mask.reek +5 -4
  146. data/samples/{exceptions.reek → configuration/home/home.reek.yml} +0 -0
  147. data/samples/configuration/partial_mask.reek +3 -2
  148. data/samples/configuration/regular_configuration/.reek.yml +4 -0
  149. data/samples/configuration/{more_than_one_configuration_file/todo.reek → regular_configuration/empty_sub_directory/.gitignore} +0 -0
  150. data/samples/{configuration/single_configuration_file/.reek → no_config_file/.keep} +0 -0
  151. data/samples/paths.rb +5 -4
  152. data/samples/{inline.rb → smelly_source/inline.rb} +0 -0
  153. data/samples/{optparse.rb → smelly_source/optparse.rb} +0 -0
  154. data/samples/{redcloth.rb → smelly_source/redcloth.rb} +0 -0
  155. data/samples/{smelly.rb → smelly_source/smelly.rb} +0 -0
  156. data/samples/source_with_hidden_directories/.hidden/hidden.rb +1 -0
  157. data/samples/source_with_hidden_directories/not_hidden.rb +1 -0
  158. data/samples/{source_with_hidden_directories/uncommunicative_parameter_name.rb → source_with_non_ruby_files/ruby.rb} +0 -0
  159. data/spec/reek/ast/node_spec.rb +5 -5
  160. data/spec/reek/cli/application_spec.rb +18 -4
  161. data/spec/reek/cli/command/todo_list_command_spec.rb +4 -2
  162. data/spec/reek/cli/silencer_spec.rb +28 -0
  163. data/spec/reek/code_comment_spec.rb +0 -7
  164. data/spec/reek/configuration/app_configuration_spec.rb +44 -31
  165. data/spec/reek/configuration/configuration_file_finder_spec.rb +133 -49
  166. data/spec/reek/configuration/default_directive_spec.rb +1 -1
  167. data/spec/reek/configuration/directory_directives_spec.rb +3 -4
  168. data/spec/reek/configuration/excluded_paths_spec.rb +5 -5
  169. data/spec/reek/configuration/rake_task_converter_spec.rb +33 -0
  170. data/spec/reek/configuration/schema_validator_spec.rb +165 -0
  171. data/spec/reek/context/code_context_spec.rb +1 -1
  172. data/spec/reek/examiner_spec.rb +28 -1
  173. data/spec/reek/report/json_report_spec.rb +13 -46
  174. data/spec/reek/report/{formatter/location_formatter_spec.rb → location_formatter_spec.rb} +5 -5
  175. data/spec/reek/report/{formatter/progress_formatter_spec.rb → progress_formatter_spec.rb} +4 -4
  176. data/spec/reek/report/text_report_spec.rb +4 -4
  177. data/spec/reek/report/xml_report_spec.rb +1 -1
  178. data/spec/reek/report/yaml_report_spec.rb +9 -38
  179. data/spec/reek/report_spec.rb +3 -3
  180. data/spec/reek/smell_detectors/feature_envy_spec.rb +2 -2
  181. data/spec/reek/smell_detectors/{prima_donna_method_spec.rb → missing_safe_method_spec.rb} +9 -9
  182. data/spec/reek/smell_detectors/too_many_constants_spec.rb +3 -3
  183. data/spec/reek/smell_detectors/too_many_instance_variables_spec.rb +1 -1
  184. data/spec/reek/smell_detectors/uncommunicative_method_name_spec.rb +6 -6
  185. data/spec/reek/smell_detectors/uncommunicative_module_name_spec.rb +6 -4
  186. data/spec/reek/smell_detectors/uncommunicative_parameter_name_spec.rb +6 -4
  187. data/spec/reek/smell_detectors/uncommunicative_variable_name_spec.rb +6 -6
  188. data/spec/reek/smell_detectors/unused_private_method_spec.rb +1 -1
  189. data/spec/reek/smell_warning_spec.rb +4 -0
  190. data/spec/reek/source/source_code_spec.rb +16 -22
  191. data/spec/reek/source/source_locator_spec.rb +11 -11
  192. data/spec/reek/spec/should_reek_of_spec.rb +0 -4
  193. data/spec/reek/spec/should_reek_only_of_spec.rb +2 -2
  194. data/spec/reek/spec/should_reek_spec.rb +1 -1
  195. data/spec/reek/tree_dresser_spec.rb +2 -6
  196. data/spec/spec_helper.rb +3 -5
  197. data/tasks/configuration.rake +8 -5
  198. metadata +56 -35
  199. data/defaults.reek +0 -131
  200. data/features/configuration_files/warn_about_multiple_configuration_files.feature +0 -44
  201. data/lib/reek/report/formatter.rb +0 -33
  202. data/lib/reek/report/formatter/heading_formatter.rb +0 -52
  203. data/lib/reek/report/formatter/location_formatter.rb +0 -42
  204. data/lib/reek/report/formatter/progress_formatter.rb +0 -81
  205. data/lib/reek/report/formatter/simple_warning_formatter.rb +0 -35
  206. data/lib/reek/report/formatter/wiki_link_warning_formatter.rb +0 -23
  207. data/lib/reek/smell_detectors/syntax.rb +0 -37
  208. data/samples/configuration/non_public_modifiers_mask.reek +0 -3
  209. data/samples/smelly_with_inline_mask.rb +0 -8
  210. data/samples/smelly_with_modifiers.rb +0 -12
  211. data/samples/source_with_hidden_directories/.hidden/uncommunicative_method_name.rb +0 -5
  212. data/samples/source_with_non_ruby_files/uncommunicative_parameter_name.rb +0 -6
  213. data/spec/reek/smell_detectors/syntax_spec.rb +0 -17
@@ -10,7 +10,7 @@ module Reek
10
10
  module ExcludedPaths
11
11
  include ConfigurationValidator
12
12
 
13
- # :reek:NestedIterators: { max_allowed_nesting: 2 }
13
+ # @quality :reek:NestedIterators { max_allowed_nesting: 2 }
14
14
  def add(paths)
15
15
  paths.each do |path|
16
16
  with_valid_directory(path) { |directory| self << directory }
@@ -0,0 +1,29 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Reek
4
+ module Configuration
5
+ # Responsible for converting configuration values coming from the outside world
6
+ # to whatever we want to use internally.
7
+ module RakeTaskConverter
8
+ class << self
9
+ REGEXABLE_ATTRIBUTES = %w(accept reject exclude).freeze
10
+
11
+ # Converts marked strings like "/foobar/" into regexes.
12
+ #
13
+ # @param configuration [Hash] e.g.
14
+ # {"enabled"=>true, "exclude"=>[], "reject"=>[/^[a-z]$/, /[0-9]$/, /[A-Z]/], "accept"=>[]}
15
+ # @return [Hash]
16
+ #
17
+ # @quality :reek:NestedIterators { max_allowed_nesting: 2 }
18
+ def convert(configuration)
19
+ (configuration.keys & REGEXABLE_ATTRIBUTES).each do |attribute|
20
+ configuration[attribute] = configuration[attribute].map do |item|
21
+ item.is_a?(Regexp) ? item.inspect : item
22
+ end
23
+ end
24
+ configuration
25
+ end
26
+ end
27
+ end
28
+ end
29
+ end
@@ -0,0 +1,210 @@
1
+ ---
2
+ type: map
3
+ mapping:
4
+ "detectors":
5
+ type: map
6
+ mapping: &all_detectors
7
+ Attribute:
8
+ type: map
9
+ mapping: &detector_base
10
+ "enabled":
11
+ type: bool
12
+ "exclude":
13
+ type: seq
14
+ sequence:
15
+ - type: str
16
+ BooleanParameter:
17
+ type: map
18
+ mapping:
19
+ <<: *detector_base
20
+ ClassVariable:
21
+ type: map
22
+ mapping:
23
+ <<: *detector_base
24
+ ControlParameter:
25
+ type: map
26
+ mapping:
27
+ <<: *detector_base
28
+ DataClump:
29
+ type: map
30
+ mapping:
31
+ <<: *detector_base
32
+ max_copies:
33
+ type: number
34
+ min_clump_size:
35
+ type: number
36
+ DuplicateMethodCall:
37
+ type: map
38
+ mapping:
39
+ <<: *detector_base
40
+ max_calls:
41
+ type: number
42
+ allow_calls:
43
+ type: seq
44
+ sequence:
45
+ - type: str
46
+ FeatureEnvy:
47
+ type: map
48
+ mapping:
49
+ <<: *detector_base
50
+ InstanceVariableAssumption:
51
+ type: map
52
+ mapping:
53
+ <<: *detector_base
54
+ IrresponsibleModule:
55
+ type: map
56
+ mapping:
57
+ <<: *detector_base
58
+ LongParameterList:
59
+ type: map
60
+ mapping:
61
+ <<: *detector_base
62
+ max_params:
63
+ type: number
64
+ overrides:
65
+ type: map
66
+ mapping:
67
+ initialize:
68
+ type: map
69
+ mapping:
70
+ max_params:
71
+ type: number
72
+ LongYieldList:
73
+ type: map
74
+ mapping:
75
+ <<: *detector_base
76
+ max_params:
77
+ type: number
78
+ ManualDispatch:
79
+ type: map
80
+ mapping:
81
+ <<: *detector_base
82
+ MissingSafeMethod:
83
+ type: map
84
+ mapping:
85
+ <<: *detector_base
86
+ ModuleInitialize:
87
+ type: map
88
+ mapping:
89
+ <<: *detector_base
90
+ NestedIterators:
91
+ type: map
92
+ mapping:
93
+ <<: *detector_base
94
+ max_allowed_nesting:
95
+ type: number
96
+ ignore_iterators:
97
+ type: seq
98
+ sequence:
99
+ - type: str
100
+ NilCheck:
101
+ type: map
102
+ mapping:
103
+ <<: *detector_base
104
+ RepeatedConditional:
105
+ type: map
106
+ mapping:
107
+ <<: *detector_base
108
+ max_ifs:
109
+ type: number
110
+ SubclassedFromCoreClass:
111
+ type: map
112
+ mapping:
113
+ <<: *detector_base
114
+ Syntax:
115
+ type: map
116
+ mapping:
117
+ <<: *detector_base
118
+ TooManyConstants:
119
+ type: map
120
+ mapping:
121
+ <<: *detector_base
122
+ max_constants:
123
+ type: number
124
+ TooManyInstanceVariables:
125
+ type: map
126
+ mapping:
127
+ <<: *detector_base
128
+ max_instance_variables:
129
+ type: number
130
+ TooManyMethods:
131
+ type: map
132
+ mapping:
133
+ <<: *detector_base
134
+ max_methods:
135
+ type: number
136
+ TooManyStatements:
137
+ type: map
138
+ mapping:
139
+ <<: *detector_base
140
+ max_statements:
141
+ type: number
142
+ UncommunicativeMethodName:
143
+ type: map
144
+ mapping:
145
+ <<: *detector_base
146
+ reject: &reject_settings
147
+ type: seq
148
+ sequence:
149
+ - type: str
150
+ accept: &accept_settings
151
+ type: seq
152
+ sequence:
153
+ - type: str
154
+ UncommunicativeModuleName:
155
+ type: map
156
+ mapping:
157
+ <<: *detector_base
158
+ reject: *reject_settings
159
+ accept: *accept_settings
160
+ UncommunicativeParameterName:
161
+ type: map
162
+ mapping:
163
+ <<: *detector_base
164
+ reject: *reject_settings
165
+ accept: *accept_settings
166
+ UncommunicativeVariableName:
167
+ type: map
168
+ mapping:
169
+ <<: *detector_base
170
+ reject: *reject_settings
171
+ accept: *accept_settings
172
+ UnusedParameters:
173
+ type: map
174
+ mapping:
175
+ <<: *detector_base
176
+ UnusedPrivateMethod:
177
+ type: map
178
+ mapping:
179
+ <<: *detector_base
180
+ UtilityFunction:
181
+ type: map
182
+ mapping:
183
+ <<: *detector_base
184
+ public_methods_only:
185
+ type: bool
186
+
187
+ "directories":
188
+ type: map
189
+ mapping:
190
+ # For any given key that is not matched somewhere else we'll apply the schema below.
191
+ # So this will just slurp in every directory we throw at it and then validate everything under
192
+ # it against all detectors - for instance:
193
+ #
194
+ # directories:
195
+ # "web_app/app/controllers":
196
+ # NestedIterators:
197
+ # enabled: false
198
+ # "web_app/app/helpers":
199
+ # UtilityFunction:
200
+ # enabled: false
201
+ #
202
+ # For details check out: http://www.kuwata-lab.com/kwalify/ruby/users-guide.02.html#tips-default
203
+ =:
204
+ type: map
205
+ mapping: *all_detectors
206
+
207
+ "exclude_paths":
208
+ type: seq
209
+ sequence:
210
+ - type: str
@@ -0,0 +1,38 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'yaml'
4
+ require_relative '../cli/silencer'
5
+ Reek::CLI::Silencer.without_warnings { require 'kwalify' }
6
+ require_relative '../errors/config_file_error'
7
+
8
+ module Reek
9
+ module Configuration
10
+ #
11
+ # Schema validator module.
12
+ #
13
+ class SchemaValidator
14
+ SCHEMA_FILE_PATH = File.expand_path('./schema.yml', __dir__)
15
+
16
+ def initialize(configuration)
17
+ @configuration = configuration
18
+ @validator = CLI::Silencer.without_warnings do
19
+ schema_file = Kwalify::Yaml.load_file(SCHEMA_FILE_PATH)
20
+ Kwalify::Validator.new(schema_file)
21
+ end
22
+ end
23
+
24
+ def validate
25
+ errors = CLI::Silencer.without_warnings { @validator.validate @configuration }
26
+ return if !errors || errors.empty?
27
+ raise Errors::ConfigFileError, error_message(errors)
28
+ end
29
+
30
+ private
31
+
32
+ # :reek:UtilityFunction
33
+ def error_message(errors)
34
+ "We found some problems with your configuration file: #{CLI::Silencer.silently { errors.join(', ') }}"
35
+ end
36
+ end
37
+ end
38
+ end
@@ -7,7 +7,7 @@ module Reek
7
7
  #
8
8
  # A context wrapper for attribute definitions found in a syntax tree.
9
9
  #
10
- # :reek:Attribute
10
+ # @quality :reek:Attribute
11
11
  class AttributeContext < CodeContext
12
12
  attr_accessor :visibility
13
13
 
@@ -14,8 +14,8 @@ module Reek
14
14
  # code element. CodeContexts form a tree in the same way the code does,
15
15
  # with each context holding a reference to a unique outer context.
16
16
  #
17
- # :reek:TooManyMethods: { max_methods: 19 }
18
- # :reek:TooManyInstanceVariables: { max_instance_variables: 8 }
17
+ # @quality :reek:TooManyMethods { max_methods: 19 }
18
+ # @quality :reek:TooManyInstanceVariables { max_instance_variables: 8 }
19
19
  class CodeContext
20
20
  include Enumerable
21
21
  extend Forwardable
@@ -110,8 +110,8 @@ module Reek
110
110
  self
111
111
  end
112
112
 
113
- # :reek:TooManyStatements: { max_statements: 6 }
114
- # :reek:FeatureEnvy
113
+ # @quality :reek:TooManyStatements { max_statements: 6 }
114
+ # @quality :reek:FeatureEnvy
115
115
  def record_call_to(exp)
116
116
  receiver = exp.receiver
117
117
  type = receiver ? receiver.type : :self
@@ -7,7 +7,7 @@ module Reek
7
7
  #
8
8
  # A context wrapper for any method definition found in a syntax tree.
9
9
  #
10
- # :reek:Attribute
10
+ # @quality :reek:Attribute
11
11
  class MethodContext < CodeContext
12
12
  attr_accessor :visibility
13
13
  attr_reader :refs
@@ -35,7 +35,7 @@ module Reek
35
35
  local_nodes([:lvar, :lvasgn]).find { |node| node.var_name == param.name }
36
36
  end
37
37
 
38
- # :reek:FeatureEnvy
38
+ # @quality :reek:FeatureEnvy
39
39
  def unused_params
40
40
  exp.arguments.reject do |param|
41
41
  param.anonymous_splat? ||
@@ -73,7 +73,7 @@ module Reek
73
73
  #
74
74
  # @return true if the module is a namespace module
75
75
  #
76
- # :reek:FeatureEnvy
76
+ # @quality :reek:FeatureEnvy
77
77
  def namespace_module?
78
78
  return false if exp.type == :casgn
79
79
  children = exp.direct_children
@@ -20,9 +20,9 @@ module Reek
20
20
  # counting. Ideally `ContextBuilder` would only build up the context tree and leave the
21
21
  # statement and reference counting to the contexts.
22
22
  #
23
- # :reek:TooManyMethods: { max_methods: 31 }
24
- # :reek:UnusedPrivateMethod: { exclude: [ !ruby/regexp /process_/ ] }
25
- # :reek:DataClump
23
+ # @quality :reek:TooManyMethods { max_methods: 31 }
24
+ # @quality :reek:UnusedPrivateMethod { exclude: [ !ruby/regexp /process_/ ] }
25
+ # @quality :reek:DataClump
26
26
  class ContextBuilder
27
27
  attr_reader :context_tree
28
28
 
@@ -470,7 +470,7 @@ module Reek
470
470
  self.class.private_method_defined?(name)
471
471
  end
472
472
 
473
- # :reek:ControlParameter
473
+ # @quality :reek:ControlParameter
474
474
  def increase_statement_count_by(sexp)
475
475
  current_context.statement_counter.increase_by sexp
476
476
  end
@@ -482,8 +482,8 @@ module Reek
482
482
  # Stores a reference to the current context, creates a nested new one,
483
483
  # yields to the given block and then restores the previous context.
484
484
  #
485
- # @param klass [Context::*Context] - context class
486
- # @param args - arguments for the class initializer
485
+ # @param klass [Context::*Context] context class
486
+ # @param args arguments for the class initializer
487
487
  # @yield block
488
488
  #
489
489
  def inside_new_context(klass, *args)
@@ -497,10 +497,10 @@ module Reek
497
497
  # Appends a new child context to the current context but does not change
498
498
  # the current context.
499
499
  #
500
- # @param klass [Context::*Context] - context class
501
- # @param args - arguments for the class initializer
500
+ # @param klass [Context::*Context] context class
501
+ # @param args arguments for the class initializer
502
502
  #
503
- # @return [Context::*Context] - the context that was appended
503
+ # @return [Context::*Context] the context that was appended
504
504
  #
505
505
  def append_new_context(klass, *args)
506
506
  klass.new(*args).tap do |new_context|
@@ -44,6 +44,12 @@ module Reek
44
44
  end
45
45
  end
46
46
 
47
+ # @return [Array<String>] The names of all known SmellDetectors
48
+ # e.g. ["BooleanParameter", "ClassVariable"].
49
+ def self.available_detector_names
50
+ smell_types.map(&:smell_type)
51
+ end
52
+
47
53
  private
48
54
 
49
55
  attr_reader :configuration, :smell_types
@@ -3,7 +3,7 @@
3
3
  module Reek
4
4
  # Generate versioned links to our documentation
5
5
  module DocumentationLink
6
- HELP_LINK_TEMPLATE = 'https://github.com/troessner/reek/blob/v%<version>s/docs/%<item>s.md'.freeze
6
+ HELP_LINK_TEMPLATE = 'https://github.com/troessner/reek/blob/v%<version>s/docs/%<item>s.md'
7
7
 
8
8
  module_function
9
9
 
@@ -12,7 +12,7 @@ module Reek
12
12
  # 'FeatureEnvy' or a general subject like 'Rake Task'.
13
13
  #
14
14
  # @param subject [String]
15
- # @return [String] - the full URL for the relevant documentation
15
+ # @return [String] the full URL for the relevant documentation
16
16
  def build(subject)
17
17
  Kernel.format(HELP_LINK_TEMPLATE, version: Version::STRING, item: name_to_param(subject))
18
18
  end
@@ -8,7 +8,7 @@ module Reek
8
8
  # Gets raised when trying to configure a detector with an option
9
9
  # which is unknown to it.
10
10
  class BadDetectorConfigurationKeyInCommentError < BaseError
11
- UNKNOWN_SMELL_DETECTOR_MESSAGE = <<-MESSAGE.freeze
11
+ UNKNOWN_SMELL_DETECTOR_MESSAGE = <<-MESSAGE
12
12
 
13
13
  Error: You are trying to configure the smell detector '%<detector>s'
14
14
  in one of your source code comments with the unknown option %<option>s.
@@ -9,7 +9,7 @@ module Reek
9
9
  # This might happen for multiple reasons. The users might have a typo in
10
10
  # his comment or he might use a detector that does not exist anymore.
11
11
  class BadDetectorInCommentError < BaseError
12
- UNKNOWN_SMELL_DETECTOR_MESSAGE = <<-MESSAGE.freeze
12
+ UNKNOWN_SMELL_DETECTOR_MESSAGE = <<-MESSAGE
13
13
 
14
14
  Error: You are trying to configure an unknown smell detector '%<detector>s' in one
15
15
  of your source code comments.