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
@@ -1,211 +0,0 @@
1
- require_relative '../../spec_helper'
2
- require_lib 'reek/smell_detectors/duplicate_method_call'
3
-
4
- RSpec.describe Reek::SmellDetectors::DuplicateMethodCall do
5
- it 'reports the right values' do
6
- src = <<-RUBY
7
- class Alfa
8
- def bravo(charlie)
9
- charlie.delta
10
- charlie.delta
11
- end
12
- end
13
- RUBY
14
-
15
- expect(src).to reek_of(:DuplicateMethodCall,
16
- lines: [3, 4],
17
- context: 'Alfa#bravo',
18
- message: "calls 'charlie.delta' 2 times",
19
- source: 'string',
20
- name: 'charlie.delta',
21
- count: 2)
22
- end
23
-
24
- it 'does count all occurences' do
25
- src = <<-RUBY
26
- class Alfa
27
- def bravo(charlie)
28
- charlie.delta
29
- charlie.delta
30
- end
31
-
32
- def echo(foxtrot)
33
- foxtrot.golf
34
- foxtrot.golf
35
- end
36
- end
37
- RUBY
38
-
39
- expect(src).
40
- to reek_of(:DuplicateMethodCall, lines: [3, 4], name: 'charlie.delta', count: 2).
41
- and reek_of(:DuplicateMethodCall, lines: [8, 9], name: 'foxtrot.golf', count: 2)
42
- end
43
-
44
- context 'with repeated method calls' do
45
- it 'reports repeated call to lvar' do
46
- src = 'def alfa(bravo); bravo.charlie + bravo.charlie; end'
47
- expect(src).to reek_of(:DuplicateMethodCall, name: 'bravo.charlie')
48
- end
49
-
50
- it 'reports call parameters' do
51
- src = 'def alfa; @bravo.charlie(2, 3) + @bravo.charlie(2, 3); end'
52
- expect(src).to reek_of(:DuplicateMethodCall, name: '@bravo.charlie(2, 3)')
53
- end
54
-
55
- it 'reports nested calls' do
56
- src = 'def alfa; @bravo.charlie.delta + @bravo.charlie.delta; end'
57
- expect(src).
58
- to reek_of(:DuplicateMethodCall, name: '@bravo.charlie').
59
- and reek_of(:DuplicateMethodCall, name: '@bravo.charlie.delta')
60
- end
61
-
62
- it 'ignores calls to new' do
63
- src = 'def alfa; @bravo.new + @bravo.new; end'
64
- expect(src).not_to reek_of(:DuplicateMethodCall)
65
- end
66
- end
67
-
68
- context 'with repeated simple method calls' do
69
- it 'reports no smell' do
70
- src = <<-RUBY
71
- def alfa
72
- bravo
73
- bravo
74
- end
75
- RUBY
76
-
77
- expect(src).not_to reek_of(:DuplicateMethodCall)
78
- end
79
- end
80
-
81
- context 'with repeated simple method calls with blocks' do
82
- it 'reports a smell if the blocks are identical' do
83
- src = <<-RUBY
84
- def alfa
85
- bravo { charlie }
86
- bravo { charlie }
87
- end
88
- RUBY
89
-
90
- expect(src).to reek_of(:DuplicateMethodCall)
91
- end
92
-
93
- it 'reports no smell if the blocks are different' do
94
- src = <<-RUBY
95
- def alfa
96
- bravo { charlie }
97
- bravo { delta }
98
- end
99
- RUBY
100
-
101
- expect(src).not_to reek_of(:DuplicateMethodCall)
102
- end
103
- end
104
-
105
- context 'with repeated method calls with receivers with blocks' do
106
- it 'reports a smell if the blocks are identical' do
107
- src = <<-RUBY
108
- def alfa
109
- bravo.charlie { delta }
110
- bravo.charlie { delta }
111
- end
112
- RUBY
113
-
114
- expect(src).to reek_of(:DuplicateMethodCall)
115
- end
116
-
117
- it 'reports a smell if the blocks are different' do
118
- src = <<-RUBY
119
- def alfa
120
- bravo.charlie { delta }
121
- bravo.charlie { echo }
122
- end
123
- RUBY
124
-
125
- expect(src).to reek_of(:DuplicateMethodCall)
126
- end
127
- end
128
-
129
- context 'with repeated attribute assignment' do
130
- it 'reports repeated assignment' do
131
- src = <<-RUBY
132
- def alfa(bravo)
133
- @charlie[bravo] = true
134
- @charlie[bravo] = true
135
- end
136
- RUBY
137
-
138
- expect(src).to reek_of(:DuplicateMethodCall)
139
- end
140
-
141
- it 'does not report multi-assignments' do
142
- src = <<-RUBY
143
- def alfa
144
- bravo, charlie = delta, echo
145
- charlie, bravo = delta, echo
146
- end
147
- RUBY
148
-
149
- expect(src).not_to reek_of(:DuplicateMethodCall)
150
- end
151
- end
152
-
153
- context 'with non-repeated method calls' do
154
- it 'does not report similar calls' do
155
- src = 'def alfa(bravo) bravo.charlie == self.charlie end'
156
- expect(src).not_to reek_of(:DuplicateMethodCall)
157
- end
158
-
159
- it 'respects call parameters' do
160
- src = 'def alfa; @bravo.charlie(3) + @bravo.charlie(2) end'
161
- expect(src).not_to reek_of(:DuplicateMethodCall)
162
- end
163
- end
164
-
165
- context 'when allowing up to 3 calls' do
166
- let(:config) do
167
- { Reek::SmellDetectors::DuplicateMethodCall::MAX_ALLOWED_CALLS_KEY => 3 }
168
- end
169
-
170
- it 'does not report double calls' do
171
- src = 'def alfa(bravo); bravo.charlie + bravo.charlie; end'
172
- expect(src).not_to reek_of(:DuplicateMethodCall).with_config(config)
173
- end
174
-
175
- it 'does not report triple calls' do
176
- src = 'def alfa(bravo); bravo.charlie + bravo.charlie + bravo.charlie; end'
177
- expect(src).not_to reek_of(:DuplicateMethodCall).with_config(config)
178
- end
179
-
180
- it 'reports quadruple calls' do
181
- src = <<-RUBY
182
- def alfa
183
- bravo.charlie + bravo.charlie + bravo.charlie + bravo.charlie
184
- end
185
- RUBY
186
-
187
- expect(src).to reek_of(:DuplicateMethodCall,
188
- count: 4).with_config(config)
189
- end
190
- end
191
-
192
- context 'when allowing calls to some methods' do
193
- it 'does not report calls to some methods' do
194
- config = { Reek::SmellDetectors::DuplicateMethodCall::ALLOW_CALLS_KEY => ['@bravo.charlie'] }
195
- src = 'def alfa; @bravo.charlie + @bravo.charlie; end'
196
- expect(src).not_to reek_of(:DuplicateMethodCall).with_config(config)
197
- end
198
-
199
- it 'reports calls to other methods' do
200
- config = { Reek::SmellDetectors::DuplicateMethodCall::ALLOW_CALLS_KEY => ['@delta.charlie'] }
201
- src = 'def alfa; @bravo.charlie + @bravo.charlie; end'
202
- expect(src).to reek_of(:DuplicateMethodCall, name: '@bravo.charlie').with_config(config)
203
- end
204
-
205
- it 'does not report calls to methods specifed with a regular expression' do
206
- config = { Reek::SmellDetectors::DuplicateMethodCall::ALLOW_CALLS_KEY => [/charlie/] }
207
- src = 'def alfa; puts @bravo.charlie; puts @bravo.charlie; end'
208
- expect(src).not_to reek_of(:DuplicateMethodCall, name: '@bravo.charlie').with_config(config)
209
- end
210
- end
211
- end
@@ -1,295 +0,0 @@
1
- require_relative '../../spec_helper'
2
- require_lib 'reek/smell_detectors/feature_envy'
3
-
4
- RSpec.describe Reek::SmellDetectors::FeatureEnvy do
5
- it 'reports the right values' do
6
- src = <<-RUBY
7
- class Alfa
8
- def bravo(charlie)
9
- (charlie.delta - charlie.echo) * foxtrot
10
- end
11
- end
12
- RUBY
13
-
14
- expect(src).to reek_of(:FeatureEnvy,
15
- lines: [3, 3],
16
- context: 'Alfa#bravo',
17
- message: "refers to 'charlie' more than self (maybe move it to another class?)",
18
- source: 'string',
19
- name: 'charlie')
20
- end
21
-
22
- it 'does count all occurences' do
23
- src = <<-RUBY
24
- class Alfa
25
- def bravo(charlie)
26
- (charlie.delta - charlie.echo) * foxtrot
27
- end
28
-
29
- def golf(hotel)
30
- (hotel.india + hotel.juliett) * kilo
31
- end
32
- end
33
- RUBY
34
-
35
- expect(src).
36
- to reek_of(:FeatureEnvy, lines: [3, 3], name: 'charlie').
37
- and reek_of(:FeatureEnvy, lines: [7, 7], name: 'hotel')
38
- end
39
-
40
- it 'does not report use of self' do
41
- src = 'def alfa; self.to_s + self.to_i; end'
42
- expect(src).not_to reek_of(:FeatureEnvy)
43
- end
44
-
45
- it 'does not report vcall with no argument' do
46
- src = 'def alfa; bravo; end'
47
- expect(src).not_to reek_of(:FeatureEnvy)
48
- end
49
-
50
- it 'does not report single use' do
51
- src = 'def alfa(bravo); bravo.charlie(@delta); end'
52
- expect(src).not_to reek_of(:FeatureEnvy)
53
- end
54
-
55
- it 'does not report return value' do
56
- src = 'def alfa(bravo); bravo.charlie(@delta); bravo; end'
57
- expect(src).not_to reek_of(:FeatureEnvy)
58
- end
59
-
60
- it 'does ignore global variables' do
61
- src = 'def alfa; $bravo.to_a; $bravo[@charlie]; end'
62
- expect(src).not_to reek_of(:FeatureEnvy)
63
- end
64
-
65
- it 'does not report class methods' do
66
- src = 'def alfa; self.class.bravo(self); end'
67
- expect(src).not_to reek_of(:FeatureEnvy)
68
- end
69
-
70
- it 'does not report single use of an ivar' do
71
- src = 'def alfa; @bravo.to_a; end'
72
- expect(src).not_to reek_of(:FeatureEnvy)
73
- end
74
-
75
- it 'does not report returning an ivar' do
76
- src = 'def alfa; @bravo.to_a; @bravo; end'
77
- expect(src).not_to reek_of(:FeatureEnvy)
78
- end
79
-
80
- it 'does not report ivar usage in a parameter' do
81
- src = 'def alfa; @bravo.charlie + delta(@bravo) - echo(@bravo) end'
82
- expect(src).not_to reek_of(:FeatureEnvy)
83
- end
84
-
85
- it 'does not report single use of an lvar' do
86
- src = 'def alfa; bravo = @charlie; bravo.to_a; end'
87
- expect(src).not_to reek_of(:FeatureEnvy)
88
- end
89
-
90
- it 'does not report returning an lvar' do
91
- src = 'def alfa; bravo = @charlie; bravo.to_a; lv end'
92
- expect(src).not_to reek_of(:FeatureEnvy)
93
- end
94
-
95
- it 'ignores lvar usage in a parameter' do
96
- src = 'def alfa; bravo = @item; bravo.charlie + delta(bravo) - echo(bravo); end'
97
- expect(src).not_to reek_of(:FeatureEnvy)
98
- end
99
-
100
- it 'does not report parameter method called with super' do
101
- src = 'def alfa(bravo) super(bravo.to_s); end'
102
- expect(src).not_to reek_of(:FeatureEnvy)
103
- end
104
-
105
- it 'reports parameter method called with super and elsewhere' do
106
- src = 'def alfa(bravo) bravo.charley; super(bravo.to_s); end'
107
- expect(src).to reek_of(:FeatureEnvy)
108
- end
109
-
110
- it 'ignores multiple ivars' do
111
- src = <<-RUBY
112
- def func
113
- @alfa.charlie
114
- @alfa.delta
115
-
116
- @bravo.echo
117
- @bravo.foxtrot
118
- end
119
- RUBY
120
-
121
- expect(src).not_to reek_of(:FeatureEnvy)
122
- end
123
-
124
- it 'report highest affinity' do
125
- src = <<-RUBY
126
- def alfa
127
- bravo = @charlie
128
- delta = 0
129
- delta += bravo.echo
130
- delta += bravo.foxtrot
131
- delta *= 1.15
132
- end
133
- RUBY
134
-
135
- expect(src).
136
- to reek_of(:FeatureEnvy, name: 'delta').
137
- and not_reek_of(:FeatureEnvy, name: 'bravo')
138
- end
139
-
140
- it 'reports multiple affinities' do
141
- src = <<-RUBY
142
- def alfa
143
- bravo = @charlie
144
- delta = 0
145
- delta += bravo.echo
146
- delta += bravo.foxtrot
147
- end
148
- RUBY
149
-
150
- expect(src).
151
- to reek_of(:FeatureEnvy, name: 'delta').
152
- and reek_of(:FeatureEnvy, name: 'bravo')
153
- end
154
-
155
- it 'is not fooled by duplication' do
156
- src = <<-RUBY
157
- def alfa(bravo)
158
- @charlie.delta(bravo.echo)
159
- @foxtrot.delta(bravo.echo)
160
- end
161
- RUBY
162
-
163
- expect(src).to reek_only_of(:DuplicateMethodCall, name: 'bravo.echo')
164
- end
165
-
166
- it 'counts local calls' do
167
- src = <<-RUBY
168
- def alfa(bravo)
169
- charlie.delta(bravo.echo)
170
- foxtrot.delta(bravo.echo)
171
- end
172
- RUBY
173
-
174
- expect(src).to reek_only_of(:DuplicateMethodCall, name: 'bravo.echo')
175
- end
176
-
177
- it 'reports many calls to lvar' do
178
- src = <<-RUBY
179
- def alfa
180
- bravo = @charlie
181
- bravo.delta + bravo.echo
182
- end
183
- RUBY
184
-
185
- expect(src).to reek_only_of(:FeatureEnvy)
186
- end
187
-
188
- it 'counts =~ as a call' do
189
- src = <<-RUBY
190
- def alfa(bravo)
191
- charlie(bravo.delta)
192
- bravo =~ /charlie/
193
- end
194
- RUBY
195
-
196
- expect(src).to reek_of :FeatureEnvy
197
- end
198
-
199
- it 'counts += as a call' do
200
- src = <<-RUBY
201
- def alfa(bravo)
202
- charlie(bravo.delta)
203
- bravo += 1
204
- end
205
- RUBY
206
-
207
- expect(src).to reek_of :FeatureEnvy
208
- end
209
-
210
- it 'counts ivar assignment as call to self' do
211
- src = <<-RUBY
212
- def foo
213
- bravo = charlie(1, 2)
214
-
215
- @delta = bravo.echo
216
- @foxtrot = bravo.golf
217
- end
218
- RUBY
219
-
220
- expect(src).not_to reek_of :FeatureEnvy
221
- end
222
-
223
- it 'counts self references correctly' do
224
- src = <<-RUBY
225
- def alfa(bravo)
226
- bravo.keys.each do |charlie|
227
- self[charlie] += 3
228
- self[charlie] = 4
229
- end
230
- self
231
- end
232
- RUBY
233
-
234
- expect(src).not_to reek_of(:FeatureEnvy)
235
- end
236
-
237
- it 'interprets << correctly' do
238
- src = <<-RUBY
239
- def alfa(bravo)
240
- if @charlie
241
- bravo.delta(self)
242
- else
243
- bravo << self
244
- end
245
- end
246
- RUBY
247
-
248
- expect(src).not_to reek_of(:FeatureEnvy)
249
- end
250
-
251
- it 'does not report on class methods defined by opening the metaclass' do
252
- src = <<-RUBY
253
- class Alfa
254
- class << self
255
- def bravo(charlie)
256
- delta = new(charlie)
257
- delta.echo
258
- delta.echo
259
- end
260
- end
261
- end
262
- RUBY
263
-
264
- expect(src).not_to reek_of(:FeatureEnvy)
265
- end
266
-
267
- it 'does not report on class methods defined with an explicit receiver' do
268
- src = <<-RUBY
269
- class Alfa
270
- def self.bravo(charlie)
271
- delta = new(charlie)
272
- delta.echo
273
- delta.echo
274
- end
275
- end
276
- RUBY
277
-
278
- expect(src).not_to reek_of(:FeatureEnvy)
279
- end
280
-
281
- it 'does not report module functions' do
282
- src = <<-RUBY
283
- module Alfa
284
- module_function
285
- def bravo(charlie)
286
- echo = delta(charlie)
287
- echo.foxtrot
288
- echo.foxtrot
289
- end
290
- end
291
- RUBY
292
-
293
- expect(src).not_to reek_of(:FeatureEnvy)
294
- end
295
- end
@@ -1,96 +0,0 @@
1
- require_relative '../../spec_helper'
2
-
3
- require_lib 'reek/smell_detectors/instance_variable_assumption'
4
-
5
- RSpec.describe Reek::SmellDetectors::InstanceVariableAssumption do
6
- it 'reports the right values' do
7
- src = <<-RUBY
8
- class Alfa
9
- def bravo
10
- @charlie
11
- end
12
- end
13
- RUBY
14
-
15
- expect(src).to reek_of(:InstanceVariableAssumption,
16
- lines: [1],
17
- context: 'Alfa',
18
- message: "assumes too much for instance variable '@charlie'",
19
- source: 'string',
20
- assumption: '@charlie')
21
- end
22
-
23
- it 'does count all occurences' do
24
- src = <<-RUBY
25
- class Alfa
26
- def bravo
27
- @charlie
28
- end
29
-
30
- def delta
31
- @echo
32
- end
33
- end
34
-
35
- RUBY
36
-
37
- expect(src).
38
- to reek_of(:InstanceVariableAssumption, lines: [1], assumption: '@charlie').
39
- and reek_of(:InstanceVariableAssumption, lines: [1], assumption: '@echo')
40
- end
41
-
42
- it 'does not report an empty class' do
43
- src = <<-RUBY
44
- class Alfa
45
- end
46
- RUBY
47
-
48
- expect(src).not_to reek_of(:InstanceVariableAssumption)
49
- end
50
-
51
- it 'does not report when lazy initializing' do
52
- src = <<-RUBY
53
- class Alfa
54
- def bravo
55
- @charlie ||= 1
56
- end
57
- end
58
- RUBY
59
-
60
- expect(src).not_to reek_of(:InstanceVariableAssumption)
61
- end
62
-
63
- it 'reports variable even if others are initialized' do
64
- src = <<-RUBY
65
- class Alfa
66
- def initialize
67
- @bravo = 1
68
- end
69
-
70
- def charlie
71
- [@bravo, @delta]
72
- end
73
- end
74
- RUBY
75
-
76
- expect(src).to reek_of(:InstanceVariableAssumption, assumption: '@delta')
77
- end
78
-
79
- it 'reports inner class even if outer class initializes the variable' do
80
- src = <<-RUBY
81
- class Alfa
82
- def initialize
83
- @bravo = 1
84
- end
85
-
86
- class Charlie
87
- def delta
88
- @bravo
89
- end
90
- end
91
- end
92
- RUBY
93
-
94
- expect(src).to reek_of(:InstanceVariableAssumption, context: 'Alfa::Charlie')
95
- end
96
- end