reek 6.0.3 → 6.0.4

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 (217) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +6 -1
  3. data/CONTRIBUTING.md +3 -0
  4. data/Dockerfile +1 -1
  5. data/Gemfile +6 -6
  6. data/lib/reek/ast/ast_node_class_map.rb +1 -1
  7. data/lib/reek/report/code_climate/code_climate_formatter.rb +1 -3
  8. data/lib/reek/smell_detectors/base_detector.rb +1 -1
  9. data/lib/reek/smell_warning.rb +1 -1
  10. data/lib/reek/source/source_locator.rb +1 -3
  11. data/lib/reek/version.rb +1 -1
  12. data/reek.gemspec +4 -1
  13. metadata +3 -208
  14. data/docs/API.md +0 -174
  15. data/docs/Attribute.md +0 -39
  16. data/docs/Basic-Smell-Options.md +0 -85
  17. data/docs/Boolean-Parameter.md +0 -54
  18. data/docs/Class-Variable.md +0 -40
  19. data/docs/Code-Smells.md +0 -39
  20. data/docs/Command-Line-Options.md +0 -119
  21. data/docs/Control-Couple.md +0 -26
  22. data/docs/Control-Parameter.md +0 -32
  23. data/docs/Data-Clump.md +0 -46
  24. data/docs/Duplicate-Method-Call.md +0 -264
  25. data/docs/Feature-Envy.md +0 -93
  26. data/docs/How-To-Write-New-Detectors.md +0 -132
  27. data/docs/How-reek-works-internally.md +0 -114
  28. data/docs/Instance-Variable-Assumption.md +0 -163
  29. data/docs/Irresponsible-Module.md +0 -47
  30. data/docs/Large-Class.md +0 -16
  31. data/docs/Long-Parameter-List.md +0 -39
  32. data/docs/Long-Yield-List.md +0 -37
  33. data/docs/Manual-Dispatch.md +0 -30
  34. data/docs/Missing-Safe-Method.md +0 -92
  35. data/docs/Module-Initialize.md +0 -62
  36. data/docs/Nested-Iterators.md +0 -59
  37. data/docs/Nil-Check.md +0 -47
  38. data/docs/RSpec-matchers.md +0 -129
  39. data/docs/Rake-Task.md +0 -66
  40. data/docs/Reek-4-to-Reek-5-migration.md +0 -188
  41. data/docs/Reek-Driven-Development.md +0 -46
  42. data/docs/Repeated-Conditional.md +0 -47
  43. data/docs/Simulated-Polymorphism.md +0 -16
  44. data/docs/Smell-Suppression.md +0 -96
  45. data/docs/Style-Guide.md +0 -19
  46. data/docs/Subclassed-From-Core-Class.md +0 -79
  47. data/docs/Too-Many-Constants.md +0 -37
  48. data/docs/Too-Many-Instance-Variables.md +0 -43
  49. data/docs/Too-Many-Methods.md +0 -56
  50. data/docs/Too-Many-Statements.md +0 -54
  51. data/docs/Uncommunicative-Method-Name.md +0 -94
  52. data/docs/Uncommunicative-Module-Name.md +0 -92
  53. data/docs/Uncommunicative-Name.md +0 -18
  54. data/docs/Uncommunicative-Parameter-Name.md +0 -90
  55. data/docs/Uncommunicative-Variable-Name.md +0 -96
  56. data/docs/Unused-Parameters.md +0 -28
  57. data/docs/Unused-Private-Method.md +0 -101
  58. data/docs/Utility-Function.md +0 -56
  59. data/docs/Versioning-Policy.md +0 -7
  60. data/docs/YAML-Reports.md +0 -93
  61. data/docs/defaults.reek.yml +0 -129
  62. data/docs/templates/default/docstring/html/public_api_marker.erb +0 -3
  63. data/docs/templates/default/docstring/setup.rb +0 -35
  64. data/docs/templates/default/fulldoc/html/css/common.css +0 -1
  65. data/docs/yard_plugin.rb +0 -17
  66. data/features/command_line_interface/basic_usage.feature +0 -15
  67. data/features/command_line_interface/options.feature +0 -123
  68. data/features/command_line_interface/show_progress.feature +0 -33
  69. data/features/command_line_interface/smell_selection.feature +0 -15
  70. data/features/command_line_interface/smells_count.feature +0 -38
  71. data/features/command_line_interface/stdin.feature +0 -65
  72. data/features/configuration_files/accept_setting.feature +0 -87
  73. data/features/configuration_files/directory_specific_directives.feature +0 -274
  74. data/features/configuration_files/exclude_directives.feature +0 -35
  75. data/features/configuration_files/exclude_paths_directives.feature +0 -42
  76. data/features/configuration_files/masking_smells.feature +0 -94
  77. data/features/configuration_files/mix_accept_reject_setting.feature +0 -84
  78. data/features/configuration_files/reject_setting.feature +0 -89
  79. data/features/configuration_files/schema_validation.feature +0 -59
  80. data/features/configuration_files/show_configuration_file.feature +0 -44
  81. data/features/configuration_files/unused_private_method.feature +0 -68
  82. data/features/configuration_loading.feature +0 -91
  83. data/features/configuration_via_source_comments/erroneous_source_comments.feature +0 -68
  84. data/features/configuration_via_source_comments/well_formed_source_comments.feature +0 -116
  85. data/features/locales.feature +0 -32
  86. data/features/programmatic_access.feature +0 -41
  87. data/features/rake_task/rake_task.feature +0 -138
  88. data/features/reports/codeclimate.feature +0 -59
  89. data/features/reports/json.feature +0 -59
  90. data/features/reports/reports.feature +0 -219
  91. data/features/reports/yaml.feature +0 -52
  92. data/features/rspec_matcher.feature +0 -41
  93. data/features/samples.feature +0 -305
  94. data/features/step_definitions/.rubocop.yml +0 -5
  95. data/features/step_definitions/reek_steps.rb +0 -102
  96. data/features/step_definitions/sample_file_steps.rb +0 -63
  97. data/features/support/env.rb +0 -33
  98. data/features/todo_list.feature +0 -108
  99. data/samples/checkstyle.xml +0 -7
  100. data/samples/clean_source/clean.rb +0 -6
  101. data/samples/configuration/accepts_rejects_and_excludes_for_detectors.reek.yml +0 -29
  102. data/samples/configuration/accepts_rejects_and_excludes_for_directory_directives.reek.yml +0 -30
  103. data/samples/configuration/corrupt.reek +0 -1
  104. data/samples/configuration/empty.reek +0 -0
  105. data/samples/configuration/full_configuration.reek +0 -13
  106. data/samples/configuration/full_mask.reek +0 -6
  107. data/samples/configuration/home/home.reek.yml +0 -4
  108. data/samples/configuration/partial_mask.reek +0 -4
  109. data/samples/configuration/regular_configuration/.reek.yml +0 -4
  110. data/samples/configuration/regular_configuration/empty_sub_directory/.gitignore +0 -0
  111. data/samples/configuration/with_excluded_paths.reek +0 -5
  112. data/samples/no_config_file/.keep +0 -0
  113. data/samples/paths.rb +0 -5
  114. data/samples/smelly_source/inline.rb +0 -704
  115. data/samples/smelly_source/optparse.rb +0 -1788
  116. data/samples/smelly_source/redcloth.rb +0 -1130
  117. data/samples/smelly_source/ruby.rb +0 -368
  118. data/samples/smelly_source/smelly.rb +0 -7
  119. data/samples/source_with_exclude_paths/ignore_me/uncommunicative_method_name.rb +0 -5
  120. data/samples/source_with_exclude_paths/nested/ignore_me_as_well/irresponsible_module.rb +0 -2
  121. data/samples/source_with_exclude_paths/nested/uncommunicative_parameter_name.rb +0 -6
  122. data/samples/source_with_exclude_paths/nested/uncommunicative_variable_name.rb +0 -6
  123. data/samples/source_with_hidden_directories/.hidden/hidden.rb +0 -1
  124. data/samples/source_with_hidden_directories/not_hidden.rb +0 -1
  125. data/samples/source_with_non_ruby_files/gibberish +0 -1
  126. data/samples/source_with_non_ruby_files/python_source.py +0 -1
  127. data/samples/source_with_non_ruby_files/ruby.rb +0 -6
  128. data/spec/performance/reek/smell_detectors/runtime_speed_spec.rb +0 -15
  129. data/spec/quality/documentation_spec.rb +0 -41
  130. data/spec/quality/reek_source_spec.rb +0 -11
  131. data/spec/reek/ast/node_spec.rb +0 -211
  132. data/spec/reek/ast/object_refs_spec.rb +0 -83
  133. data/spec/reek/ast/reference_collector_spec.rb +0 -47
  134. data/spec/reek/ast/sexp_extensions_spec.rb +0 -498
  135. data/spec/reek/cli/application_spec.rb +0 -168
  136. data/spec/reek/cli/command/report_command_spec.rb +0 -44
  137. data/spec/reek/cli/command/todo_list_command_spec.rb +0 -86
  138. data/spec/reek/cli/options_spec.rb +0 -51
  139. data/spec/reek/cli/silencer_spec.rb +0 -28
  140. data/spec/reek/code_comment_spec.rb +0 -184
  141. data/spec/reek/configuration/app_configuration_spec.rb +0 -195
  142. data/spec/reek/configuration/configuration_file_finder_spec.rb +0 -230
  143. data/spec/reek/configuration/default_directive_spec.rb +0 -13
  144. data/spec/reek/configuration/directory_directives_spec.rb +0 -122
  145. data/spec/reek/configuration/excluded_paths_spec.rb +0 -25
  146. data/spec/reek/configuration/rake_task_converter_spec.rb +0 -33
  147. data/spec/reek/configuration/schema_validator_spec.rb +0 -165
  148. data/spec/reek/context/code_context_spec.rb +0 -192
  149. data/spec/reek/context/ghost_context_spec.rb +0 -60
  150. data/spec/reek/context/method_context_spec.rb +0 -72
  151. data/spec/reek/context/module_context_spec.rb +0 -55
  152. data/spec/reek/context/root_context_spec.rb +0 -12
  153. data/spec/reek/context/statement_counter_spec.rb +0 -24
  154. data/spec/reek/context_builder_spec.rb +0 -457
  155. data/spec/reek/detector_repository_spec.rb +0 -22
  156. data/spec/reek/documentation_link_spec.rb +0 -20
  157. data/spec/reek/errors/base_error_spec.rb +0 -13
  158. data/spec/reek/examiner_spec.rb +0 -309
  159. data/spec/reek/logging_error_handler_spec.rb +0 -24
  160. data/spec/reek/rake/task_spec.rb +0 -56
  161. data/spec/reek/report/code_climate/code_climate_configuration_spec.rb +0 -22
  162. data/spec/reek/report/code_climate/code_climate_fingerprint_spec.rb +0 -126
  163. data/spec/reek/report/code_climate/code_climate_formatter_spec.rb +0 -51
  164. data/spec/reek/report/code_climate/code_climate_report_spec.rb +0 -56
  165. data/spec/reek/report/html_report_spec.rb +0 -19
  166. data/spec/reek/report/json_report_spec.rb +0 -58
  167. data/spec/reek/report/location_formatter_spec.rb +0 -32
  168. data/spec/reek/report/progress_formatter_spec.rb +0 -68
  169. data/spec/reek/report/text_report_spec.rb +0 -89
  170. data/spec/reek/report/xml_report_spec.rb +0 -24
  171. data/spec/reek/report/yaml_report_spec.rb +0 -55
  172. data/spec/reek/report_spec.rb +0 -28
  173. data/spec/reek/smell_configuration_spec.rb +0 -56
  174. data/spec/reek/smell_detectors/attribute_spec.rb +0 -197
  175. data/spec/reek/smell_detectors/base_detector_spec.rb +0 -50
  176. data/spec/reek/smell_detectors/boolean_parameter_spec.rb +0 -93
  177. data/spec/reek/smell_detectors/class_variable_spec.rb +0 -106
  178. data/spec/reek/smell_detectors/control_parameter_spec.rb +0 -300
  179. data/spec/reek/smell_detectors/data_clump_spec.rb +0 -134
  180. data/spec/reek/smell_detectors/duplicate_method_call_spec.rb +0 -211
  181. data/spec/reek/smell_detectors/feature_envy_spec.rb +0 -295
  182. data/spec/reek/smell_detectors/instance_variable_assumption_spec.rb +0 -96
  183. data/spec/reek/smell_detectors/irresponsible_module_spec.rb +0 -226
  184. data/spec/reek/smell_detectors/long_parameter_list_spec.rb +0 -61
  185. data/spec/reek/smell_detectors/long_yield_list_spec.rb +0 -49
  186. data/spec/reek/smell_detectors/manual_dispatch_spec.rb +0 -75
  187. data/spec/reek/smell_detectors/missing_safe_method_spec.rb +0 -68
  188. data/spec/reek/smell_detectors/module_initialize_spec.rb +0 -77
  189. data/spec/reek/smell_detectors/nested_iterators_spec.rb +0 -333
  190. data/spec/reek/smell_detectors/nil_check_spec.rb +0 -100
  191. data/spec/reek/smell_detectors/repeated_conditional_spec.rb +0 -100
  192. data/spec/reek/smell_detectors/subclassed_from_core_class_spec.rb +0 -77
  193. data/spec/reek/smell_detectors/too_many_constants_spec.rb +0 -144
  194. data/spec/reek/smell_detectors/too_many_instance_variables_spec.rb +0 -132
  195. data/spec/reek/smell_detectors/too_many_methods_spec.rb +0 -54
  196. data/spec/reek/smell_detectors/too_many_statements_spec.rb +0 -90
  197. data/spec/reek/smell_detectors/uncommunicative_method_name_spec.rb +0 -78
  198. data/spec/reek/smell_detectors/uncommunicative_module_name_spec.rb +0 -78
  199. data/spec/reek/smell_detectors/uncommunicative_parameter_name_spec.rb +0 -147
  200. data/spec/reek/smell_detectors/uncommunicative_variable_name_spec.rb +0 -201
  201. data/spec/reek/smell_detectors/unused_parameters_spec.rb +0 -114
  202. data/spec/reek/smell_detectors/unused_private_method_spec.rb +0 -205
  203. data/spec/reek/smell_detectors/utility_function_spec.rb +0 -309
  204. data/spec/reek/smell_warning_spec.rb +0 -137
  205. data/spec/reek/source/source_code_spec.rb +0 -79
  206. data/spec/reek/source/source_locator_spec.rb +0 -166
  207. data/spec/reek/spec/should_reek_of_spec.rb +0 -153
  208. data/spec/reek/spec/should_reek_only_of_spec.rb +0 -91
  209. data/spec/reek/spec/should_reek_spec.rb +0 -52
  210. data/spec/reek/spec/smell_matcher_spec.rb +0 -87
  211. data/spec/reek/tree_dresser_spec.rb +0 -46
  212. data/spec/spec_helper.rb +0 -110
  213. data/tasks/configuration.rake +0 -18
  214. data/tasks/console.rake +0 -5
  215. data/tasks/reek.rake +0 -6
  216. data/tasks/rubocop.rake +0 -11
  217. data/tasks/test.rake +0 -32
@@ -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