reek 6.0.2 → 6.2.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 (271) hide show
  1. checksums.yaml +4 -4
  2. data/.github/dependabot.yml +13 -0
  3. data/.github/workflows/ruby.yml +57 -0
  4. data/.rubocop.yml +6 -12
  5. data/.rubocop_todo.yml +6 -4
  6. data/CHANGELOG.md +95 -0
  7. data/CONTRIBUTING.md +10 -10
  8. data/Dockerfile +1 -1
  9. data/Gemfile +8 -7
  10. data/README.md +29 -29
  11. data/bin/code_climate_reek +56 -8
  12. data/lib/reek/ast/ast_node_class_map.rb +1 -1
  13. data/lib/reek/ast/node.rb +1 -1
  14. data/lib/reek/ast/sexp_extensions/arguments.rb +20 -0
  15. data/lib/reek/ast/sexp_extensions/case.rb +1 -1
  16. data/lib/reek/ast/sexp_extensions/if.rb +1 -1
  17. data/lib/reek/ast/sexp_extensions/send.rb +22 -7
  18. data/lib/reek/cli/command/todo_list_command.rb +3 -3
  19. data/lib/reek/cli/options.rb +6 -6
  20. data/lib/reek/{report/code_climate → code_climate}/code_climate_configuration.rb +1 -1
  21. data/lib/reek/{report/code_climate → code_climate}/code_climate_configuration.yml +41 -41
  22. data/lib/reek/{report/code_climate → code_climate}/code_climate_fingerprint.rb +2 -2
  23. data/lib/reek/{report/code_climate → code_climate}/code_climate_formatter.rb +2 -4
  24. data/lib/reek/{report/code_climate → code_climate}/code_climate_report.rb +3 -3
  25. data/lib/reek/code_comment.rb +25 -20
  26. data/lib/reek/configuration/app_configuration.rb +5 -5
  27. data/lib/reek/configuration/configuration_converter.rb +1 -1
  28. data/lib/reek/configuration/configuration_file_finder.rb +5 -4
  29. data/lib/reek/configuration/default_directive.rb +1 -1
  30. data/lib/reek/configuration/directory_directives.rb +1 -1
  31. data/lib/reek/configuration/excluded_paths.rb +3 -2
  32. data/lib/reek/configuration/schema.rb +177 -0
  33. data/lib/reek/configuration/schema_validator.rb +12 -13
  34. data/lib/reek/context/attribute_context.rb +1 -1
  35. data/lib/reek/context/code_context.rb +1 -1
  36. data/lib/reek/context/method_context.rb +1 -1
  37. data/lib/reek/context/module_context.rb +4 -0
  38. data/lib/reek/context/refinement_context.rb +16 -0
  39. data/lib/reek/context/send_context.rb +7 -1
  40. data/lib/reek/context_builder.rb +17 -3
  41. data/lib/reek/documentation_link.rb +3 -5
  42. data/lib/reek/errors/bad_detector_configuration_key_in_comment_error.rb +2 -2
  43. data/lib/reek/errors/bad_detector_in_comment_error.rb +2 -2
  44. data/lib/reek/errors/encoding_error.rb +1 -1
  45. data/lib/reek/errors/garbage_detector_configuration_in_comment_error.rb +2 -2
  46. data/lib/reek/errors/incomprehensible_source_error.rb +1 -1
  47. data/lib/reek/errors/legacy_comment_separator_error.rb +2 -2
  48. data/lib/reek/errors/syntax_error.rb +1 -1
  49. data/lib/reek/rake/task.rb +5 -5
  50. data/lib/reek/smell_detectors/base_detector.rb +1 -1
  51. data/lib/reek/smell_detectors/class_variable.rb +2 -2
  52. data/lib/reek/smell_detectors/control_parameter_helpers/candidate.rb +6 -6
  53. data/lib/reek/smell_detectors/control_parameter_helpers/control_parameter_finder.rb +1 -1
  54. data/lib/reek/smell_detectors/duplicate_method_call.rb +5 -5
  55. data/lib/reek/smell_detectors/instance_variable_assumption.rb +8 -8
  56. data/lib/reek/smell_detectors/nested_iterators.rb +4 -3
  57. data/lib/reek/smell_detectors/unused_private_method.rb +3 -2
  58. data/lib/reek/smell_warning.rb +1 -1
  59. data/lib/reek/source/source_locator.rb +1 -3
  60. data/lib/reek/spec/should_reek_of.rb +11 -9
  61. data/lib/reek/spec.rb +1 -1
  62. data/lib/reek/version.rb +2 -2
  63. data/reek.gemspec +29 -25
  64. metadata +37 -250
  65. data/.travis.yml +0 -40
  66. data/docs/API.md +0 -174
  67. data/docs/Attribute.md +0 -39
  68. data/docs/Basic-Smell-Options.md +0 -85
  69. data/docs/Boolean-Parameter.md +0 -54
  70. data/docs/Class-Variable.md +0 -40
  71. data/docs/Code-Smells.md +0 -39
  72. data/docs/Command-Line-Options.md +0 -119
  73. data/docs/Control-Couple.md +0 -26
  74. data/docs/Control-Parameter.md +0 -32
  75. data/docs/Data-Clump.md +0 -46
  76. data/docs/Duplicate-Method-Call.md +0 -264
  77. data/docs/Feature-Envy.md +0 -93
  78. data/docs/How-To-Write-New-Detectors.md +0 -132
  79. data/docs/How-reek-works-internally.md +0 -114
  80. data/docs/Instance-Variable-Assumption.md +0 -163
  81. data/docs/Irresponsible-Module.md +0 -47
  82. data/docs/Large-Class.md +0 -16
  83. data/docs/Long-Parameter-List.md +0 -39
  84. data/docs/Long-Yield-List.md +0 -37
  85. data/docs/Manual-Dispatch.md +0 -30
  86. data/docs/Missing-Safe-Method.md +0 -92
  87. data/docs/Module-Initialize.md +0 -62
  88. data/docs/Nested-Iterators.md +0 -59
  89. data/docs/Nil-Check.md +0 -47
  90. data/docs/RSpec-matchers.md +0 -129
  91. data/docs/Rake-Task.md +0 -66
  92. data/docs/Reek-4-to-Reek-5-migration.md +0 -188
  93. data/docs/Reek-Driven-Development.md +0 -46
  94. data/docs/Repeated-Conditional.md +0 -47
  95. data/docs/Simulated-Polymorphism.md +0 -16
  96. data/docs/Smell-Suppression.md +0 -96
  97. data/docs/Style-Guide.md +0 -19
  98. data/docs/Subclassed-From-Core-Class.md +0 -79
  99. data/docs/Too-Many-Constants.md +0 -37
  100. data/docs/Too-Many-Instance-Variables.md +0 -43
  101. data/docs/Too-Many-Methods.md +0 -56
  102. data/docs/Too-Many-Statements.md +0 -54
  103. data/docs/Uncommunicative-Method-Name.md +0 -94
  104. data/docs/Uncommunicative-Module-Name.md +0 -92
  105. data/docs/Uncommunicative-Name.md +0 -18
  106. data/docs/Uncommunicative-Parameter-Name.md +0 -90
  107. data/docs/Uncommunicative-Variable-Name.md +0 -96
  108. data/docs/Unused-Parameters.md +0 -28
  109. data/docs/Unused-Private-Method.md +0 -101
  110. data/docs/Utility-Function.md +0 -56
  111. data/docs/Versioning-Policy.md +0 -7
  112. data/docs/YAML-Reports.md +0 -93
  113. data/docs/defaults.reek.yml +0 -129
  114. data/docs/templates/default/docstring/html/public_api_marker.erb +0 -3
  115. data/docs/templates/default/docstring/setup.rb +0 -37
  116. data/docs/templates/default/fulldoc/html/css/common.css +0 -1
  117. data/docs/yard_plugin.rb +0 -17
  118. data/features/command_line_interface/basic_usage.feature +0 -15
  119. data/features/command_line_interface/options.feature +0 -123
  120. data/features/command_line_interface/show_progress.feature +0 -33
  121. data/features/command_line_interface/smell_selection.feature +0 -15
  122. data/features/command_line_interface/smells_count.feature +0 -38
  123. data/features/command_line_interface/stdin.feature +0 -65
  124. data/features/configuration_files/accept_setting.feature +0 -87
  125. data/features/configuration_files/directory_specific_directives.feature +0 -274
  126. data/features/configuration_files/exclude_directives.feature +0 -35
  127. data/features/configuration_files/exclude_paths_directives.feature +0 -42
  128. data/features/configuration_files/masking_smells.feature +0 -94
  129. data/features/configuration_files/mix_accept_reject_setting.feature +0 -84
  130. data/features/configuration_files/reject_setting.feature +0 -89
  131. data/features/configuration_files/schema_validation.feature +0 -59
  132. data/features/configuration_files/show_configuration_file.feature +0 -44
  133. data/features/configuration_files/unused_private_method.feature +0 -68
  134. data/features/configuration_loading.feature +0 -91
  135. data/features/configuration_via_source_comments/erroneous_source_comments.feature +0 -68
  136. data/features/configuration_via_source_comments/well_formed_source_comments.feature +0 -116
  137. data/features/locales.feature +0 -32
  138. data/features/programmatic_access.feature +0 -41
  139. data/features/rake_task/rake_task.feature +0 -138
  140. data/features/reports/codeclimate.feature +0 -59
  141. data/features/reports/json.feature +0 -59
  142. data/features/reports/reports.feature +0 -219
  143. data/features/reports/yaml.feature +0 -52
  144. data/features/rspec_matcher.feature +0 -41
  145. data/features/samples.feature +0 -305
  146. data/features/step_definitions/.rubocop.yml +0 -5
  147. data/features/step_definitions/reek_steps.rb +0 -102
  148. data/features/step_definitions/sample_file_steps.rb +0 -63
  149. data/features/support/env.rb +0 -33
  150. data/features/todo_list.feature +0 -108
  151. data/lib/reek/configuration/schema.yml +0 -210
  152. data/samples/checkstyle.xml +0 -7
  153. data/samples/clean_source/clean.rb +0 -6
  154. data/samples/configuration/accepts_rejects_and_excludes_for_detectors.reek.yml +0 -29
  155. data/samples/configuration/accepts_rejects_and_excludes_for_directory_directives.reek.yml +0 -30
  156. data/samples/configuration/corrupt.reek +0 -1
  157. data/samples/configuration/empty.reek +0 -0
  158. data/samples/configuration/full_configuration.reek +0 -13
  159. data/samples/configuration/full_mask.reek +0 -6
  160. data/samples/configuration/home/home.reek.yml +0 -4
  161. data/samples/configuration/partial_mask.reek +0 -4
  162. data/samples/configuration/regular_configuration/.reek.yml +0 -4
  163. data/samples/configuration/regular_configuration/empty_sub_directory/.gitignore +0 -0
  164. data/samples/configuration/with_excluded_paths.reek +0 -5
  165. data/samples/no_config_file/.keep +0 -0
  166. data/samples/paths.rb +0 -5
  167. data/samples/smelly_source/inline.rb +0 -704
  168. data/samples/smelly_source/optparse.rb +0 -1788
  169. data/samples/smelly_source/redcloth.rb +0 -1130
  170. data/samples/smelly_source/ruby.rb +0 -368
  171. data/samples/smelly_source/smelly.rb +0 -7
  172. data/samples/source_with_exclude_paths/ignore_me/uncommunicative_method_name.rb +0 -5
  173. data/samples/source_with_exclude_paths/nested/ignore_me_as_well/irresponsible_module.rb +0 -2
  174. data/samples/source_with_exclude_paths/nested/uncommunicative_parameter_name.rb +0 -6
  175. data/samples/source_with_exclude_paths/nested/uncommunicative_variable_name.rb +0 -6
  176. data/samples/source_with_hidden_directories/.hidden/hidden.rb +0 -1
  177. data/samples/source_with_hidden_directories/not_hidden.rb +0 -1
  178. data/samples/source_with_non_ruby_files/gibberish +0 -1
  179. data/samples/source_with_non_ruby_files/python_source.py +0 -1
  180. data/samples/source_with_non_ruby_files/ruby.rb +0 -6
  181. data/spec/performance/reek/smell_detectors/runtime_speed_spec.rb +0 -15
  182. data/spec/quality/documentation_spec.rb +0 -41
  183. data/spec/quality/reek_source_spec.rb +0 -11
  184. data/spec/reek/ast/node_spec.rb +0 -211
  185. data/spec/reek/ast/object_refs_spec.rb +0 -83
  186. data/spec/reek/ast/reference_collector_spec.rb +0 -47
  187. data/spec/reek/ast/sexp_extensions_spec.rb +0 -498
  188. data/spec/reek/cli/application_spec.rb +0 -168
  189. data/spec/reek/cli/command/report_command_spec.rb +0 -44
  190. data/spec/reek/cli/command/todo_list_command_spec.rb +0 -86
  191. data/spec/reek/cli/options_spec.rb +0 -51
  192. data/spec/reek/cli/silencer_spec.rb +0 -28
  193. data/spec/reek/code_comment_spec.rb +0 -184
  194. data/spec/reek/configuration/app_configuration_spec.rb +0 -195
  195. data/spec/reek/configuration/configuration_file_finder_spec.rb +0 -230
  196. data/spec/reek/configuration/default_directive_spec.rb +0 -13
  197. data/spec/reek/configuration/directory_directives_spec.rb +0 -122
  198. data/spec/reek/configuration/excluded_paths_spec.rb +0 -16
  199. data/spec/reek/configuration/rake_task_converter_spec.rb +0 -33
  200. data/spec/reek/configuration/schema_validator_spec.rb +0 -165
  201. data/spec/reek/context/code_context_spec.rb +0 -192
  202. data/spec/reek/context/ghost_context_spec.rb +0 -60
  203. data/spec/reek/context/method_context_spec.rb +0 -72
  204. data/spec/reek/context/module_context_spec.rb +0 -55
  205. data/spec/reek/context/root_context_spec.rb +0 -12
  206. data/spec/reek/context/statement_counter_spec.rb +0 -24
  207. data/spec/reek/context_builder_spec.rb +0 -457
  208. data/spec/reek/detector_repository_spec.rb +0 -22
  209. data/spec/reek/documentation_link_spec.rb +0 -20
  210. data/spec/reek/errors/base_error_spec.rb +0 -13
  211. data/spec/reek/examiner_spec.rb +0 -309
  212. data/spec/reek/logging_error_handler_spec.rb +0 -24
  213. data/spec/reek/rake/task_spec.rb +0 -56
  214. data/spec/reek/report/code_climate/code_climate_configuration_spec.rb +0 -22
  215. data/spec/reek/report/code_climate/code_climate_fingerprint_spec.rb +0 -126
  216. data/spec/reek/report/code_climate/code_climate_formatter_spec.rb +0 -51
  217. data/spec/reek/report/code_climate/code_climate_report_spec.rb +0 -56
  218. data/spec/reek/report/html_report_spec.rb +0 -19
  219. data/spec/reek/report/json_report_spec.rb +0 -58
  220. data/spec/reek/report/location_formatter_spec.rb +0 -32
  221. data/spec/reek/report/progress_formatter_spec.rb +0 -68
  222. data/spec/reek/report/text_report_spec.rb +0 -89
  223. data/spec/reek/report/xml_report_spec.rb +0 -24
  224. data/spec/reek/report/yaml_report_spec.rb +0 -55
  225. data/spec/reek/report_spec.rb +0 -28
  226. data/spec/reek/smell_configuration_spec.rb +0 -56
  227. data/spec/reek/smell_detectors/attribute_spec.rb +0 -197
  228. data/spec/reek/smell_detectors/base_detector_spec.rb +0 -50
  229. data/spec/reek/smell_detectors/boolean_parameter_spec.rb +0 -93
  230. data/spec/reek/smell_detectors/class_variable_spec.rb +0 -106
  231. data/spec/reek/smell_detectors/control_parameter_spec.rb +0 -300
  232. data/spec/reek/smell_detectors/data_clump_spec.rb +0 -134
  233. data/spec/reek/smell_detectors/duplicate_method_call_spec.rb +0 -211
  234. data/spec/reek/smell_detectors/feature_envy_spec.rb +0 -295
  235. data/spec/reek/smell_detectors/instance_variable_assumption_spec.rb +0 -96
  236. data/spec/reek/smell_detectors/irresponsible_module_spec.rb +0 -226
  237. data/spec/reek/smell_detectors/long_parameter_list_spec.rb +0 -61
  238. data/spec/reek/smell_detectors/long_yield_list_spec.rb +0 -49
  239. data/spec/reek/smell_detectors/manual_dispatch_spec.rb +0 -75
  240. data/spec/reek/smell_detectors/missing_safe_method_spec.rb +0 -68
  241. data/spec/reek/smell_detectors/module_initialize_spec.rb +0 -77
  242. data/spec/reek/smell_detectors/nested_iterators_spec.rb +0 -333
  243. data/spec/reek/smell_detectors/nil_check_spec.rb +0 -100
  244. data/spec/reek/smell_detectors/repeated_conditional_spec.rb +0 -100
  245. data/spec/reek/smell_detectors/subclassed_from_core_class_spec.rb +0 -77
  246. data/spec/reek/smell_detectors/too_many_constants_spec.rb +0 -144
  247. data/spec/reek/smell_detectors/too_many_instance_variables_spec.rb +0 -132
  248. data/spec/reek/smell_detectors/too_many_methods_spec.rb +0 -54
  249. data/spec/reek/smell_detectors/too_many_statements_spec.rb +0 -90
  250. data/spec/reek/smell_detectors/uncommunicative_method_name_spec.rb +0 -78
  251. data/spec/reek/smell_detectors/uncommunicative_module_name_spec.rb +0 -78
  252. data/spec/reek/smell_detectors/uncommunicative_parameter_name_spec.rb +0 -147
  253. data/spec/reek/smell_detectors/uncommunicative_variable_name_spec.rb +0 -201
  254. data/spec/reek/smell_detectors/unused_parameters_spec.rb +0 -114
  255. data/spec/reek/smell_detectors/unused_private_method_spec.rb +0 -205
  256. data/spec/reek/smell_detectors/utility_function_spec.rb +0 -293
  257. data/spec/reek/smell_warning_spec.rb +0 -137
  258. data/spec/reek/source/source_code_spec.rb +0 -79
  259. data/spec/reek/source/source_locator_spec.rb +0 -166
  260. data/spec/reek/spec/should_reek_of_spec.rb +0 -153
  261. data/spec/reek/spec/should_reek_only_of_spec.rb +0 -91
  262. data/spec/reek/spec/should_reek_spec.rb +0 -52
  263. data/spec/reek/spec/smell_matcher_spec.rb +0 -87
  264. data/spec/reek/tree_dresser_spec.rb +0 -46
  265. data/spec/spec_helper.rb +0 -110
  266. data/tasks/configuration.rake +0 -18
  267. data/tasks/console.rake +0 -5
  268. data/tasks/reek.rake +0 -6
  269. data/tasks/rubocop.rake +0 -11
  270. data/tasks/test.rake +0 -32
  271. /data/lib/reek/{report/code_climate.rb → code_climate.rb} +0 -0
@@ -31,7 +31,7 @@ module Reek
31
31
  MESSAGE
32
32
 
33
33
  def initialize(origin:)
34
- super format(TEMPLATE, source: origin)
34
+ super(format(TEMPLATE, source: origin))
35
35
  end
36
36
 
37
37
  def long_message
@@ -69,15 +69,15 @@ module Reek
69
69
 
70
70
  # @public
71
71
  def initialize(name = :reek)
72
- @config_file = ENV['REEK_CFG']
72
+ @config_file = ENV.fetch('REEK_CFG', nil)
73
73
  @name = name
74
- @reek_opts = ENV['REEK_OPTS'] || ''
74
+ @reek_opts = ENV.fetch('REEK_OPTS', '')
75
75
  @fail_on_error = true
76
76
  @verbose = false
77
77
 
78
78
  yield self if block_given?
79
79
 
80
- if (reek_src = ENV['REEK_SRC'])
80
+ if (reek_src = ENV.fetch('REEK_SRC', nil))
81
81
  @source_files = FileList[reek_src]
82
82
  end
83
83
  @source_files ||= FileList['lib/**/*.rb']
@@ -87,8 +87,8 @@ module Reek
87
87
  # @public
88
88
  def source_files=(files)
89
89
  unless files.is_a?(String) || files.is_a?(FileList)
90
- raise ArgumentError, 'File list should be a FileList or a String that can contain'\
91
- " a glob pattern, e.g. '{app,lib,spec}/**/*.rb'"
90
+ raise ArgumentError, 'File list should be a FileList or a String that can contain ' \
91
+ "a glob pattern, e.g. '{app,lib,spec}/**/*.rb'"
92
92
  end
93
93
  @source_files = FileList[files]
94
94
  end
@@ -90,7 +90,7 @@ module Reek
90
90
 
91
91
  class << self
92
92
  def smell_type
93
- @smell_type ||= name.split(/::/).last
93
+ @smell_type ||= name.split('::').last
94
94
  end
95
95
 
96
96
  def contexts
@@ -25,8 +25,8 @@ module Reek
25
25
  # @return [Array<SmellWarning>]
26
26
  #
27
27
  def sniff
28
- class_variables_in_context.map do |variable, occurences|
29
- lines = occurences.map(&:line)
28
+ class_variables_in_context.map do |variable, occurrences|
29
+ lines = occurrences.map(&:line)
30
30
  smell_warning(
31
31
  lines: lines,
32
32
  message: "declares the class variable '#{variable}'",
@@ -9,20 +9,20 @@ module Reek
9
9
  class Candidate
10
10
  #
11
11
  # @param parameter [Symbol] the parameter name
12
- # @param occurences [Array<Reek::AST::Node>] the occurences of the ControlParameter smell
12
+ # @param occurrences [Array<Reek::AST::Node>] the occurrences of the ControlParameter smell
13
13
  # e.g. [s(:lvar, :bravo), s(:lvar, :bravo)]
14
14
  #
15
- def initialize(parameter, occurences)
15
+ def initialize(parameter, occurrences)
16
16
  @parameter = parameter
17
- @occurences = occurences
17
+ @occurrences = occurrences
18
18
  end
19
19
 
20
20
  def smells?
21
- occurences.any?
21
+ occurrences.any?
22
22
  end
23
23
 
24
24
  def lines
25
- occurences.map(&:line)
25
+ occurrences.map(&:line)
26
26
  end
27
27
 
28
28
  def name
@@ -31,7 +31,7 @@ module Reek
31
31
 
32
32
  private
33
33
 
34
- attr_reader :occurences, :parameter
34
+ attr_reader :occurrences, :parameter
35
35
  end
36
36
  end
37
37
  end
@@ -1,6 +1,6 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- require_relative './call_in_condition_finder'
3
+ require_relative 'call_in_condition_finder'
4
4
  require_relative '../../ast/node'
5
5
 
6
6
  module Reek
@@ -67,11 +67,11 @@ module Reek
67
67
  class FoundCall
68
68
  def initialize(call_node)
69
69
  @call_node = call_node
70
- @occurences = []
70
+ @occurrences = []
71
71
  end
72
72
 
73
73
  def record(occurence)
74
- occurences.push occurence
74
+ occurrences.push occurence
75
75
  end
76
76
 
77
77
  def call
@@ -79,16 +79,16 @@ module Reek
79
79
  end
80
80
 
81
81
  def occurs
82
- occurences.length
82
+ occurrences.length
83
83
  end
84
84
 
85
85
  def lines
86
- occurences.map(&:line)
86
+ occurrences.map(&:line)
87
87
  end
88
88
 
89
89
  private
90
90
 
91
- attr_reader :call_node, :occurences
91
+ attr_reader :call_node, :occurrences
92
92
  end
93
93
 
94
94
  private_constant :FoundCall
@@ -20,7 +20,7 @@ module Reek
20
20
  # @return [Array<SmellWarning>]
21
21
  #
22
22
  def sniff
23
- assumptions = (variables_from_context - variables_from_initialize).uniq
23
+ assumptions = (variables_from_context - variables_from_initializers).uniq
24
24
 
25
25
  assumptions.map do |assumption|
26
26
  build_smell_warning(assumption)
@@ -42,14 +42,14 @@ module Reek
42
42
  parameters: { assumption: assumption.to_s })
43
43
  end
44
44
 
45
- def variables_from_initialize
46
- initialize_exp = method_expressions.detect do |method|
47
- method.name == :initialize
48
- end
49
-
50
- return [] unless initialize_exp
45
+ def variables_from_initializers
46
+ variables_from_initialize.map do |method|
47
+ method.each_node(:ivasgn).map(&:name)
48
+ end.flatten
49
+ end
51
50
 
52
- initialize_exp.each_node(:ivasgn).map(&:name)
51
+ def variables_from_initialize
52
+ method_expressions.select { |method| method.name == :initialize }
53
53
  end
54
54
 
55
55
  def variables_from_context
@@ -26,7 +26,7 @@ module Reek
26
26
  # The name of the config field that sets the names of any
27
27
  # methods for which nesting should not be considered
28
28
  IGNORE_ITERATORS_KEY = 'ignore_iterators'
29
- DEFAULT_IGNORE_ITERATORS = ['tap'].freeze
29
+ DEFAULT_IGNORE_ITERATORS = ['tap', 'Tempfile.create'].freeze
30
30
 
31
31
  def self.default_config
32
32
  super.merge(
@@ -128,8 +128,9 @@ module Reek
128
128
 
129
129
  # @quality :reek:FeatureEnvy
130
130
  def ignored_iterator?(exp)
131
- ignore_iterators.any? { |pattern| /#{pattern}/ =~ exp.call.name } ||
132
- exp.without_block_arguments?
131
+ ignore_iterators.any? do |pattern|
132
+ /#{pattern}/ =~ exp.call.format_to_ruby
133
+ end || exp.without_block_arguments?
133
134
  end
134
135
  end
135
136
  end
@@ -50,9 +50,9 @@ module Reek
50
50
  # @return [Array<Hit>]
51
51
  #
52
52
  def hits
53
- unused_private_methods.map do |defined_method|
53
+ unused_private_methods.filter_map do |defined_method|
54
54
  Hit.new(defined_method) unless ignore_method?(defined_method)
55
- end.compact
55
+ end
56
56
  end
57
57
 
58
58
  #
@@ -61,6 +61,7 @@ module Reek
61
61
  def unused_private_methods
62
62
  defined_private_methods = context.defined_instance_methods(visibility: :private)
63
63
  called_method_names = context.instance_method_calls.map(&:name)
64
+ called_method_names.concat(context.instance_method_names_via_to_call)
64
65
 
65
66
  defined_private_methods.reject do |defined_method|
66
67
  called_method_names.include?(defined_method.name)
@@ -59,7 +59,7 @@ module Reek
59
59
 
60
60
  # @public
61
61
  def to_hash
62
- stringified_params = Hash[parameters.map { |key, val| [key.to_s, val] }]
62
+ stringified_params = parameters.transform_keys(&:to_s)
63
63
  base_hash.merge(stringified_params)
64
64
  end
65
65
 
@@ -62,10 +62,8 @@ module Reek
62
62
 
63
63
  false
64
64
  end
65
- elsif path_excluded?(path)
66
- true
67
65
  else
68
- false
66
+ path_excluded?(path)
69
67
  end
70
68
  end
71
69
 
@@ -69,19 +69,21 @@ module Reek
69
69
  end
70
70
 
71
71
  def set_failure_messages_for_smell_type
72
- self.failure_message = "Expected #{origin} to reek of #{smell_type}, "\
73
- 'but it didn\'t'
74
- self.failure_message_when_negated = "Expected #{origin} not to reek "\
75
- "of #{smell_type}, but it did"
72
+ self.failure_message = "Expected #{origin} to reek of #{smell_type}, " \
73
+ 'but it didn\'t'
74
+ self.failure_message_when_negated = "Expected #{origin} not to reek " \
75
+ "of #{smell_type}, but it did"
76
76
  end
77
77
 
78
78
  def set_failure_messages_for_smell_details
79
- self.failure_message = "Expected #{origin} to reek of #{smell_type} "\
80
- "(which it did) with smell details #{smell_details}, which it didn't.\n"\
81
- "The number of smell details I had to compare with the given one was #{matching_smell_types.count} "\
82
- "and here they are:\n"\
79
+ self.failure_message =
80
+ "Expected #{origin} to reek of #{smell_type} " \
81
+ "(which it did) with smell details #{smell_details}, which it didn't.\n" \
82
+ "The number of smell details I had to compare with the given one was #{matching_smell_types.count} " \
83
+ "and here they are:\n" \
83
84
  "#{all_relevant_smell_details_formatted}"
84
- self.failure_message_when_negated = "Expected #{origin} not to reek of "\
85
+ self.failure_message_when_negated =
86
+ "Expected #{origin} not to reek of " \
85
87
  "#{smell_type} with smell details #{smell_details}, but it did"
86
88
  end
87
89
 
data/lib/reek/spec.rb CHANGED
@@ -92,7 +92,7 @@ module Reek
92
92
  end
93
93
 
94
94
  #
95
- # See the documentaton for "reek_of".
95
+ # See the documentation for "reek_of".
96
96
  #
97
97
  # Notable differences to reek_of:
98
98
  # 1.) "reek_of" doesn't mind if there are other smells of a different type.
data/lib/reek/version.rb CHANGED
@@ -3,11 +3,11 @@
3
3
  # @public
4
4
  module Reek
5
5
  #
6
- # This module holds the Reek version informations
6
+ # This module holds the Reek version information
7
7
  #
8
8
  # @public
9
9
  module Version
10
10
  # @public
11
- STRING = '6.0.2'
11
+ STRING = '6.2.0'
12
12
  end
13
13
  end
data/reek.gemspec CHANGED
@@ -1,34 +1,38 @@
1
- require File.join(File.dirname(__FILE__), 'lib/reek/version')
1
+ require_relative 'lib/reek/version'
2
2
 
3
- Gem::Specification.new do |s|
4
- s.name = 'reek'
5
- s.version = Reek::Version::STRING
3
+ Gem::Specification.new do |spec|
4
+ spec.name = 'reek'
5
+ spec.version = Reek::Version::STRING
6
+ spec.authors = ['Kevin Rutherford', 'Timo Roessner', 'Matijs van Zuijlen', 'Piotr Szotkowski']
7
+ spec.email = ['timo.roessner@googlemail.com']
6
8
 
7
- s.authors = ['Kevin Rutherford', 'Timo Roessner', 'Matijs van Zuijlen', 'Piotr Szotkowski']
8
- s.description =
9
+ spec.summary = 'Code smell detector for Ruby'
10
+ spec.description =
9
11
  'Reek is a tool that examines Ruby classes, modules and methods and reports ' \
10
12
  'any code smells it finds.'
13
+ spec.homepage = 'https://github.com/troessner/reek'
14
+ spec.license = 'MIT'
11
15
 
12
- s.license = 'MIT'
13
- s.email = ['timo.roessner@googlemail.com']
14
- s.extra_rdoc_files = ['CHANGELOG.md', 'License.txt']
15
- s.files = `git ls-files -z`.split("\0")
16
- s.executables = s.files.grep(%r{^bin/}).map { |path| File.basename(path) }
17
- s.homepage = 'https://github.com/troessner/reek'
18
- s.rdoc_options = %w(--main README.md -x assets/|bin/|config/|features/|spec/|tasks/)
19
- s.required_ruby_version = '>= 2.4.0'
20
- s.summary = 'Code smell detector for Ruby'
16
+ spec.extra_rdoc_files = ['CHANGELOG.md', 'License.txt']
17
+ spec.files = Dir.chdir(File.expand_path(__dir__)) do
18
+ `git ls-files -z`.split("\x0").reject { |f| f.match(%r{^(test|spec|features|samples|docs|tasks)/}) }
19
+ end
21
20
 
22
- s.metadata = {
23
- 'homepage_uri' => 'https://github.com/troessner/reek',
24
- 'source_code_uri' => 'https://github.com/troessner/reek',
25
- 'bug_tracker_uri' => 'https://github.com/troessner/reek/issues',
26
- 'changelog_uri' => 'https://github.com/troessner/reek/CHANGELOG.md',
27
- 'documentation_uri' => 'https://www.rubydoc.info/gems/reek'
21
+ spec.executables = spec.files.grep(%r{^bin/}).map { |path| File.basename(path) }
22
+ spec.rdoc_options = %w(--main README.md -x assets/|bin/|config/|features/|spec/|tasks/)
23
+ spec.required_ruby_version = '>= 3.0.0'
24
+
25
+ spec.metadata = {
26
+ 'homepage_uri' => 'https://github.com/troessner/reek',
27
+ 'source_code_uri' => 'https://github.com/troessner/reek',
28
+ 'bug_tracker_uri' => 'https://github.com/troessner/reek/issues',
29
+ 'changelog_uri' => 'https://github.com/troessner/reek/CHANGELOG.md',
30
+ 'documentation_uri' => 'https://www.rubydoc.info/gems/reek',
31
+ 'rubygems_mfa_required' => 'true'
28
32
  }
29
33
 
30
- s.add_runtime_dependency 'kwalify', '~> 0.7.0'
31
- s.add_runtime_dependency 'parser', '< 2.8', '>= 2.5.0.0', '!= 2.5.1.1'
32
- s.add_runtime_dependency 'psych', '~> 3.1'
33
- s.add_runtime_dependency 'rainbow', '>= 2.0', '< 4.0'
34
+ spec.add_runtime_dependency 'dry-schema', '~> 1.13.0'
35
+ spec.add_runtime_dependency 'parser', '~> 3.2.0'
36
+ spec.add_runtime_dependency 'rainbow', '>= 2.0', '< 4.0'
37
+ spec.add_runtime_dependency 'rexml', '~> 3.1'
34
38
  end