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,309 +0,0 @@
1
- require_relative '../../spec_helper'
2
- require_lib 'reek/smell_detectors/utility_function'
3
-
4
- RSpec.describe Reek::SmellDetectors::UtilityFunction do
5
- it 'reports the right values' do
6
- src = <<-RUBY
7
- def alfa(bravo)
8
- bravo.charlie.delta
9
- end
10
- RUBY
11
-
12
- expect(src).to reek_of(:UtilityFunction,
13
- lines: [1],
14
- context: 'alfa',
15
- message: "doesn't depend on instance state (maybe move it to another class?)",
16
- source: 'string')
17
- end
18
-
19
- it 'counts a local call in a param initializer' do
20
- src = 'def alfa(bravo = charlie) bravo.to_s end'
21
- expect(src).not_to reek_of(:UtilityFunction)
22
- end
23
-
24
- it 'counts usages of self' do
25
- src = 'def alfa(bravo); alfa.bravo(self); end'
26
- expect(src).not_to reek_of(:UtilityFunction)
27
- end
28
-
29
- it 'counts self reference within a dstr' do
30
- src = 'def alfa(bravo); "#{self} #{bravo}"; end'
31
- expect(src).not_to reek_of(:UtilityFunction)
32
- end
33
-
34
- it 'counts calls to self within a dstr' do
35
- src = 'def alfa(bravo); "#{self.gsub(/charlie/, /delta/)}"; end'
36
- expect(src).
37
- not_to reek_of(:UtilityFunction)
38
- end
39
-
40
- it 'does not report a method that calls super' do
41
- src = 'def alfa(bravo) super; bravo.to_s; end'
42
- expect(src).not_to reek_of(:UtilityFunction)
43
- end
44
-
45
- it 'does not report a method that calls super with arguments' do
46
- src = 'def alfa(bravo) super(bravo); bravo.to_s; end'
47
- expect(src).not_to reek_of(:UtilityFunction)
48
- end
49
-
50
- it 'recognises a deep call' do
51
- src = <<-RUBY
52
- class Alfa
53
- def bravo(charlie)
54
- charlie.each { |delta| foxtrot(delta) }
55
- end
56
-
57
- def foxtrot(golf)
58
- @india << golf
59
- end
60
- end
61
- RUBY
62
-
63
- expect(src).not_to reek_of(:UtilityFunction)
64
- end
65
-
66
- it 'does not report empty method' do
67
- src = 'def alfa(bravo); end'
68
- expect(src).not_to reek_of(:UtilityFunction)
69
- end
70
-
71
- it 'does not report literal' do
72
- src = 'def alfa; 3; end'
73
- expect(src).not_to reek_of(:UtilityFunction)
74
- end
75
-
76
- it 'does not report instance variable reference' do
77
- src = 'def alfa; @bravo; end'
78
- expect(src).not_to reek_of(:UtilityFunction)
79
- end
80
-
81
- it 'does not report vcall' do
82
- src = 'def alfa; bravo; end'
83
- expect(src).not_to reek_of(:UtilityFunction)
84
- end
85
-
86
- it 'does not report references to self' do
87
- src = 'def alfa; self; end'
88
- expect(src).not_to reek_of(:UtilityFunction)
89
- end
90
-
91
- it 'recognises an ivar reference within a block' do
92
- src = 'def alfa(bravo) bravo.each { @charlie = 3} end'
93
- expect(src).not_to reek_of(:UtilityFunction)
94
- end
95
-
96
- it 'reports a call to a constant' do
97
- src = 'def simple(arga) FIELDS[arga] end'
98
- expect(src).to reek_of(:UtilityFunction, context: 'simple')
99
- end
100
-
101
- context 'when examining singleton methods' do
102
- ['class', 'module'].each do |scope|
103
- it "does not report for #{scope} with `class << self` notation" do
104
- src = "#{scope} Alfa; class << self; def bravo(charlie) charlie.to_s; end; end; end"
105
- expect(src).not_to reek_of(:UtilityFunction)
106
- end
107
-
108
- it "does not report for #{scope} with `self.` notation" do
109
- src = "#{scope} Alfa; def self.bravo(charlie) charlie.to_s; end; end"
110
- expect(src).not_to reek_of(:UtilityFunction)
111
- end
112
- end
113
-
114
- context 'when defined by using `module_function`' do
115
- it 'does not report UtilityFunction also when using multiple arguments' do
116
- src = <<-RUBY
117
- class Alfa
118
- def bravo(charlie) charlie.to_s; end
119
- def delta(echo) echo.to_s; end
120
- module_function :bravo, :delta
121
- end
122
- RUBY
123
-
124
- expect(src).not_to reek_of(:UtilityFunction)
125
- end
126
-
127
- it 'does not report module functions defined by earlier modifier' do
128
- src = <<-RUBY
129
- module Alfa
130
- module_function
131
- def bravo(charlie) charlie.to_s; end
132
- end
133
- RUBY
134
-
135
- expect(src).not_to reek_of(:UtilityFunction)
136
- end
137
-
138
- it 'reports functions preceded by canceled modifier' do
139
- src = <<-RUBY
140
- module Alfa
141
- module_function
142
- public
143
- def bravo(charlie) charlie.to_s; end
144
- end
145
- RUBY
146
-
147
- expect(src).to reek_of(:UtilityFunction, context: 'Alfa#bravo')
148
- end
149
-
150
- it 'does not report when module_function is called in separate scope' do
151
- src = <<-RUBY
152
- class Alfa
153
- def bravo(charlie) charlie.to_s; end
154
- begin
155
- module_function :bravo
156
- end
157
- end
158
- RUBY
159
- expect(src).not_to reek_of(:UtilityFunction)
160
- end
161
- end
162
- end
163
-
164
- context 'when examining refinements' do
165
- it 'reports on the refined class' do
166
- src = <<-RUBY
167
- module Alfa
168
- refine Bravo do
169
- def bravo(charlie)
170
- charlie.delta.echo
171
- end
172
- end
173
- end
174
- RUBY
175
-
176
- expect(src).to reek_of(:UtilityFunction, context: 'Bravo#bravo')
177
- end
178
- end
179
-
180
- describe 'method visibility' do
181
- it 'reports private methods' do
182
- src = <<-RUBY
183
- class Alfa
184
- private
185
- def bravo(charlie)
186
- charlie.delta.echo
187
- end
188
- end
189
- RUBY
190
-
191
- expect(src).to reek_of(:UtilityFunction, context: 'Alfa#bravo')
192
- end
193
-
194
- it 'reports protected methods' do
195
- src = <<-RUBY
196
- class Alfa
197
- protected
198
- def bravo(charlie)
199
- charlie.delta.echo
200
- end
201
- end
202
- RUBY
203
-
204
- expect(src).to reek_of(:UtilityFunction, context: 'Alfa#bravo')
205
- end
206
- end
207
-
208
- describe 'disabling UtilityFunction via configuration for non-public methods' do
209
- let(:config) do
210
- { Reek::SmellDetectors::UtilityFunction::PUBLIC_METHODS_ONLY_KEY => true }
211
- end
212
-
213
- context 'when examining public methods' do
214
- it 'still reports UtilityFunction' do
215
- src = <<-RUBY
216
- class Alfa
217
- def bravo(charlie)
218
- charlie.delta.echo
219
- end
220
- end
221
- RUBY
222
-
223
- expect(src).to reek_of(:UtilityFunction, context: 'Alfa#bravo').with_config(config)
224
- end
225
- end
226
-
227
- context 'when examining private methods' do
228
- it 'does not report UtilityFunction' do
229
- src = <<-RUBY
230
- class Alfa
231
- private
232
- def bravo(charlie)
233
- charlie.delta.echo
234
- end
235
- end
236
- RUBY
237
-
238
- expect(src).not_to reek_of(:UtilityFunction).with_config(config)
239
- end
240
-
241
- it 'does not report UtilityFunction when private is used as a def modifier' do
242
- src = <<-RUBY
243
- class Alfa
244
- private def bravo(charlie)
245
- charlie.delta.echo
246
- end
247
- end
248
- RUBY
249
-
250
- expect(src).not_to reek_of(:UtilityFunction).with_config(config)
251
- end
252
- end
253
-
254
- context 'when examining protected methods' do
255
- it 'does not report UtilityFunction' do
256
- src = <<-RUBY
257
- class Alfa
258
- protected
259
- def bravo(charlie)
260
- charlie.delta.echo
261
- end
262
- end
263
- RUBY
264
-
265
- expect(src).not_to reek_of(:UtilityFunction).with_config(config)
266
- end
267
-
268
- it 'does not report UtilityFunction when protected is used as a def modifier' do
269
- src = <<-RUBY
270
- class Alfa
271
- protected def bravo(charlie)
272
- charlie.delta.echo
273
- end
274
- end
275
- RUBY
276
-
277
- expect(src).not_to reek_of(:UtilityFunction).with_config(config)
278
- end
279
- end
280
- end
281
-
282
- describe 'disabling with a comment' do
283
- it 'disables the method following the comment' do
284
- src = <<-RUBY
285
- class Alfa
286
- # :reek:UtilityFunction
287
- def bravo(charlie)
288
- charlie.delta.echo
289
- end
290
- end
291
- RUBY
292
-
293
- expect(src).not_to reek_of(:UtilityFunction)
294
- end
295
-
296
- it 'disables a method when it has a visibility modifier' do
297
- src = <<-RUBY
298
- class Alfa
299
- # :reek:UtilityFunction
300
- private def bravo(charlie)
301
- charlie.delta.echo
302
- end
303
- end
304
- RUBY
305
-
306
- expect(src).not_to reek_of(:UtilityFunction)
307
- end
308
- end
309
- end
@@ -1,137 +0,0 @@
1
- require_relative '../spec_helper'
2
- require_lib 'reek/smell_warning'
3
-
4
- RSpec.describe Reek::SmellWarning do
5
- let(:uncommunicative_name_detector) { build(:smell_detector, smell_type: 'UncommunicativeVariableName') }
6
-
7
- describe 'sort order' do
8
- shared_examples_for 'first sorts ahead of second' do
9
- it 'hash differently' do
10
- expect(first.hash).not_to eq(second.hash)
11
- end
12
-
13
- it 'are not equal' do
14
- expect(first).not_to eq(second)
15
- end
16
-
17
- it 'sort correctly' do
18
- expect(first <=> second).to be < 0
19
- end
20
-
21
- it 'does not match using eql?' do
22
- expect(first).not_to eql(second)
23
- end
24
- end
25
-
26
- context 'when smells differ only by detector' do
27
- let(:first) { build_smell_warning(smell_type: 'DuplicateMethodCall') }
28
- let(:second) { build_smell_warning(smell_type: 'FeatureEnvy') }
29
-
30
- it_behaves_like 'first sorts ahead of second'
31
- end
32
-
33
- context 'when smells differ only by lines' do
34
- let(:first) { build_smell_warning(smell_type: 'FeatureEnvy', lines: [2]) }
35
- let(:second) { build_smell_warning(smell_type: 'FeatureEnvy', lines: [3]) }
36
-
37
- it_behaves_like 'first sorts ahead of second'
38
- end
39
-
40
- context 'when smells differ only by context' do
41
- let(:first) { build_smell_warning(smell_type: 'DuplicateMethodCall', context: 'first') }
42
- let(:second) do
43
- build_smell_warning(smell_type: 'DuplicateMethodCall', context: 'second')
44
- end
45
-
46
- it_behaves_like 'first sorts ahead of second'
47
- end
48
-
49
- context 'when smells differ only by message' do
50
- let(:first) do
51
- build_smell_warning(smell_type: 'DuplicateMethodCall',
52
- context: 'ctx', message: 'first message')
53
- end
54
- let(:second) do
55
- build_smell_warning(smell_type: 'DuplicateMethodCall',
56
- context: 'ctx', message: 'second message')
57
- end
58
-
59
- it_behaves_like 'first sorts ahead of second'
60
- end
61
-
62
- context 'when smells differ by name and message' do
63
- let(:first) do
64
- build_smell_warning(smell_type: 'FeatureEnvy', message: 'second message')
65
- end
66
- let(:second) do
67
- build_smell_warning(smell_type: 'UtilityFunction', message: 'first message')
68
- end
69
-
70
- it_behaves_like 'first sorts ahead of second'
71
- end
72
-
73
- context 'when smells differ everywhere' do
74
- let(:first) do
75
- build_smell_warning(smell_type: 'DuplicateMethodCall',
76
- context: 'Dirty#a',
77
- message: 'calls @s.title twice')
78
- end
79
-
80
- let(:second) do
81
- build_smell_warning(smell_type: 'UncommunicativeVariableName',
82
- context: 'Dirty',
83
- message: "has the variable name '@s'")
84
- end
85
-
86
- it_behaves_like 'first sorts ahead of second'
87
- end
88
- end
89
-
90
- describe '#yaml_hash' do
91
- let(:context_name) { 'Module::Class#method/block' }
92
- let(:lines) { [24, 513] }
93
- let(:message) { 'test message' }
94
- let(:parameters) { { 'one' => 34, 'two' => 'second' } }
95
- let(:smell_type) { 'FeatureEnvy' }
96
- let(:source) { 'a/ruby/source/file.rb' }
97
-
98
- let(:yaml) do
99
- warning = described_class.new(smell_type, source: source,
100
- context: context_name,
101
- lines: lines,
102
- message: message,
103
- parameters: parameters)
104
- warning.yaml_hash
105
- end
106
-
107
- it 'includes the smell type' do
108
- expect(yaml['smell_type']).to eq 'FeatureEnvy'
109
- end
110
-
111
- it 'includes the context' do
112
- expect(yaml['context']).to eq context_name
113
- end
114
-
115
- it 'includes the message' do
116
- expect(yaml['message']).to eq message
117
- end
118
-
119
- it 'includes the line numbers' do
120
- expect(yaml['lines']).to match_array lines
121
- end
122
-
123
- it 'includes the source' do
124
- expect(yaml['source']).to eq source
125
- end
126
-
127
- it 'includes the documentation link' do
128
- expect(yaml['documentation_link']).to eq Reek::DocumentationLink.build('FeatureEnvy')
129
- end
130
-
131
- it 'includes the parameters' do
132
- parameters.each do |key, value|
133
- expect(yaml[key]).to eq value
134
- end
135
- end
136
- end
137
- end
@@ -1,79 +0,0 @@
1
- require_relative '../../spec_helper'
2
- require 'stringio'
3
- require_lib 'reek/source/source_code'
4
-
5
- RSpec.describe Reek::Source::SourceCode do
6
- describe '#syntax_tree' do
7
- it 'associates comments with the AST' do
8
- source = "# this is\n# a comment\ndef foo; end"
9
- source_code = described_class.new(source: source, origin: '(string)')
10
- result = source_code.syntax_tree
11
- expect(result.leading_comment).to eq "# this is\n# a comment"
12
- end
13
-
14
- it 'cleanly processes empty source' do
15
- source_code = described_class.new(source: '', origin: '(string)')
16
- result = source_code.syntax_tree
17
- expect(result.type).to eq :empty
18
- end
19
-
20
- it 'cleanly processes empty source with comments' do
21
- source = "# this is\n# a comment\n"
22
- source_code = described_class.new(source: source, origin: '(string)')
23
- result = source_code.syntax_tree
24
- expect(result.type).to eq :empty
25
- end
26
-
27
- it 'does not crash with sequences incompatible with UTF-8' do
28
- source = '"\xFF"'
29
- source_code = described_class.new(source: source, origin: '(string)')
30
- result = source_code.syntax_tree
31
- expect(result.children.first).to eq "\xFF"
32
- end
33
-
34
- it 'returns a :lambda node for lambda expressions' do
35
- source = '->() { }'
36
- source_code = described_class.new(source: source, origin: '(string)')
37
- result = source_code.syntax_tree
38
- expect(result.children.first.type).to eq :lambda
39
- end
40
-
41
- context 'when the parser fails with a Parser::SyntaxError' do
42
- let(:src) { described_class.new(source: code) }
43
- let(:code) { '== Invalid Syntax ==' }
44
-
45
- it 'raises the error' do
46
- expect { src.syntax_tree }.to raise_error Parser::SyntaxError
47
- end
48
- end
49
-
50
- context 'when the parser fails with a generic error' do
51
- let(:code) { '' }
52
- let(:parser) { instance_double('Parser::Ruby25') }
53
- let(:src) { described_class.new(source: code, parser: parser) }
54
- let(:error_class) { RuntimeError }
55
- let(:error_message) { 'An error' }
56
-
57
- before do
58
- allow(parser).to receive(:parse_with_comments).and_raise(error_class, error_message)
59
- end
60
-
61
- it 'raises the error' do
62
- expect { src.syntax_tree }.to raise_error error_class, error_message
63
- end
64
- end
65
-
66
- if RUBY_VERSION >= '2.7'
67
- context 'with ruby 2.7 syntax' do
68
- context 'with forward_args (`...`)' do
69
- let(:source_code) { described_class.new(source: 'def alpha(...) bravo(...); end') }
70
-
71
- it 'returns a :forward_args node' do
72
- result = source_code.syntax_tree
73
- expect(result.children[1].type).to eq(:forward_args)
74
- end
75
- end
76
- end
77
- end
78
- end
79
- end