reek 6.0.2 → 6.5.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 (280) hide show
  1. checksums.yaml +4 -4
  2. data/.github/dependabot.yml +13 -0
  3. data/.github/workflows/ruby.yml +58 -0
  4. data/.gitignore +0 -1
  5. data/.rubocop.yml +7 -20
  6. data/.rubocop_todo.yml +6 -4
  7. data/.simplecov +2 -0
  8. data/CHANGELOG.md +114 -0
  9. data/CONTRIBUTING.md +10 -10
  10. data/Dockerfile +1 -1
  11. data/Gemfile +17 -24
  12. data/README.md +38 -40
  13. data/Rakefile +2 -0
  14. data/bin/code_climate_reek +56 -8
  15. data/docs/yard_plugin.rb +3 -1
  16. data/lib/reek/ast/ast_node_class_map.rb +1 -1
  17. data/lib/reek/ast/node.rb +16 -10
  18. data/lib/reek/ast/sexp_extensions/arguments.rb +20 -0
  19. data/lib/reek/ast/sexp_extensions/case.rb +1 -1
  20. data/lib/reek/ast/sexp_extensions/if.rb +1 -1
  21. data/lib/reek/ast/sexp_extensions/send.rb +22 -7
  22. data/lib/reek/cli/command/todo_list_command.rb +3 -3
  23. data/lib/reek/cli/options.rb +8 -8
  24. data/lib/reek/{report/code_climate → code_climate}/code_climate_configuration.rb +1 -1
  25. data/lib/reek/{report/code_climate → code_climate}/code_climate_configuration.yml +41 -41
  26. data/lib/reek/{report/code_climate → code_climate}/code_climate_fingerprint.rb +2 -2
  27. data/lib/reek/{report/code_climate → code_climate}/code_climate_formatter.rb +2 -4
  28. data/lib/reek/{report/code_climate → code_climate}/code_climate_report.rb +3 -3
  29. data/lib/reek/code_comment.rb +25 -20
  30. data/lib/reek/configuration/app_configuration.rb +5 -5
  31. data/lib/reek/configuration/configuration_converter.rb +1 -1
  32. data/lib/reek/configuration/configuration_file_finder.rb +5 -4
  33. data/lib/reek/configuration/default_directive.rb +1 -1
  34. data/lib/reek/configuration/directory_directives.rb +1 -1
  35. data/lib/reek/configuration/excluded_paths.rb +3 -2
  36. data/lib/reek/configuration/schema.rb +177 -0
  37. data/lib/reek/configuration/schema_validator.rb +12 -13
  38. data/lib/reek/context/attribute_context.rb +1 -1
  39. data/lib/reek/context/code_context.rb +3 -3
  40. data/lib/reek/context/method_context.rb +1 -1
  41. data/lib/reek/context/module_context.rb +4 -0
  42. data/lib/reek/context/refinement_context.rb +16 -0
  43. data/lib/reek/context/send_context.rb +7 -1
  44. data/lib/reek/context_builder.rb +17 -3
  45. data/lib/reek/documentation_link.rb +3 -5
  46. data/lib/reek/errors/bad_detector_configuration_key_in_comment_error.rb +2 -2
  47. data/lib/reek/errors/bad_detector_in_comment_error.rb +2 -2
  48. data/lib/reek/errors/encoding_error.rb +1 -1
  49. data/lib/reek/errors/garbage_detector_configuration_in_comment_error.rb +2 -2
  50. data/lib/reek/errors/incomprehensible_source_error.rb +1 -1
  51. data/lib/reek/errors/legacy_comment_separator_error.rb +2 -2
  52. data/lib/reek/errors/syntax_error.rb +1 -1
  53. data/lib/reek/rake/task.rb +5 -5
  54. data/lib/reek/report/github_report.rb +55 -0
  55. data/lib/reek/report/text_report.rb +1 -1
  56. data/lib/reek/report.rb +7 -5
  57. data/lib/reek/smell_detectors/base_detector.rb +1 -1
  58. data/lib/reek/smell_detectors/class_variable.rb +2 -2
  59. data/lib/reek/smell_detectors/control_parameter_helpers/candidate.rb +6 -6
  60. data/lib/reek/smell_detectors/control_parameter_helpers/control_parameter_finder.rb +1 -1
  61. data/lib/reek/smell_detectors/data_clump.rb +1 -1
  62. data/lib/reek/smell_detectors/duplicate_method_call.rb +5 -5
  63. data/lib/reek/smell_detectors/instance_variable_assumption.rb +8 -8
  64. data/lib/reek/smell_detectors/nested_iterators.rb +4 -3
  65. data/lib/reek/smell_detectors/uncommunicative_module_name.rb +1 -1
  66. data/lib/reek/smell_detectors/unused_private_method.rb +3 -2
  67. data/lib/reek/smell_warning.rb +1 -1
  68. data/lib/reek/source/source_code.rb +11 -5
  69. data/lib/reek/source/source_locator.rb +1 -3
  70. data/lib/reek/spec/should_reek_of.rb +11 -9
  71. data/lib/reek/spec.rb +1 -1
  72. data/lib/reek/version.rb +2 -2
  73. data/reek.gemspec +33 -25
  74. metadata +41 -238
  75. data/.travis.yml +0 -40
  76. data/docs/API.md +0 -174
  77. data/docs/Attribute.md +0 -39
  78. data/docs/Basic-Smell-Options.md +0 -85
  79. data/docs/Boolean-Parameter.md +0 -54
  80. data/docs/Class-Variable.md +0 -40
  81. data/docs/Code-Smells.md +0 -39
  82. data/docs/Command-Line-Options.md +0 -119
  83. data/docs/Control-Couple.md +0 -26
  84. data/docs/Control-Parameter.md +0 -32
  85. data/docs/Data-Clump.md +0 -46
  86. data/docs/Duplicate-Method-Call.md +0 -264
  87. data/docs/Feature-Envy.md +0 -93
  88. data/docs/How-To-Write-New-Detectors.md +0 -132
  89. data/docs/How-reek-works-internally.md +0 -114
  90. data/docs/Instance-Variable-Assumption.md +0 -163
  91. data/docs/Irresponsible-Module.md +0 -47
  92. data/docs/Large-Class.md +0 -16
  93. data/docs/Long-Parameter-List.md +0 -39
  94. data/docs/Long-Yield-List.md +0 -37
  95. data/docs/Manual-Dispatch.md +0 -30
  96. data/docs/Missing-Safe-Method.md +0 -92
  97. data/docs/Module-Initialize.md +0 -62
  98. data/docs/Nested-Iterators.md +0 -59
  99. data/docs/Nil-Check.md +0 -47
  100. data/docs/RSpec-matchers.md +0 -129
  101. data/docs/Rake-Task.md +0 -66
  102. data/docs/Reek-4-to-Reek-5-migration.md +0 -188
  103. data/docs/Reek-Driven-Development.md +0 -46
  104. data/docs/Repeated-Conditional.md +0 -47
  105. data/docs/Simulated-Polymorphism.md +0 -16
  106. data/docs/Smell-Suppression.md +0 -96
  107. data/docs/Style-Guide.md +0 -19
  108. data/docs/Subclassed-From-Core-Class.md +0 -79
  109. data/docs/Too-Many-Constants.md +0 -37
  110. data/docs/Too-Many-Instance-Variables.md +0 -43
  111. data/docs/Too-Many-Methods.md +0 -56
  112. data/docs/Too-Many-Statements.md +0 -54
  113. data/docs/Uncommunicative-Method-Name.md +0 -94
  114. data/docs/Uncommunicative-Module-Name.md +0 -92
  115. data/docs/Uncommunicative-Name.md +0 -18
  116. data/docs/Uncommunicative-Parameter-Name.md +0 -90
  117. data/docs/Uncommunicative-Variable-Name.md +0 -96
  118. data/docs/Unused-Parameters.md +0 -28
  119. data/docs/Unused-Private-Method.md +0 -101
  120. data/docs/Utility-Function.md +0 -56
  121. data/docs/Versioning-Policy.md +0 -7
  122. data/docs/YAML-Reports.md +0 -93
  123. data/docs/defaults.reek.yml +0 -129
  124. data/docs/templates/default/docstring/html/public_api_marker.erb +0 -3
  125. data/docs/templates/default/docstring/setup.rb +0 -37
  126. data/docs/templates/default/fulldoc/html/css/common.css +0 -1
  127. data/features/command_line_interface/basic_usage.feature +0 -15
  128. data/features/command_line_interface/options.feature +0 -123
  129. data/features/command_line_interface/show_progress.feature +0 -33
  130. data/features/command_line_interface/smell_selection.feature +0 -15
  131. data/features/command_line_interface/smells_count.feature +0 -38
  132. data/features/command_line_interface/stdin.feature +0 -65
  133. data/features/configuration_files/accept_setting.feature +0 -87
  134. data/features/configuration_files/directory_specific_directives.feature +0 -274
  135. data/features/configuration_files/exclude_directives.feature +0 -35
  136. data/features/configuration_files/exclude_paths_directives.feature +0 -42
  137. data/features/configuration_files/masking_smells.feature +0 -94
  138. data/features/configuration_files/mix_accept_reject_setting.feature +0 -84
  139. data/features/configuration_files/reject_setting.feature +0 -89
  140. data/features/configuration_files/schema_validation.feature +0 -59
  141. data/features/configuration_files/show_configuration_file.feature +0 -44
  142. data/features/configuration_files/unused_private_method.feature +0 -68
  143. data/features/configuration_loading.feature +0 -91
  144. data/features/configuration_via_source_comments/erroneous_source_comments.feature +0 -68
  145. data/features/configuration_via_source_comments/well_formed_source_comments.feature +0 -116
  146. data/features/locales.feature +0 -32
  147. data/features/programmatic_access.feature +0 -41
  148. data/features/rake_task/rake_task.feature +0 -138
  149. data/features/reports/codeclimate.feature +0 -59
  150. data/features/reports/json.feature +0 -59
  151. data/features/reports/reports.feature +0 -219
  152. data/features/reports/yaml.feature +0 -52
  153. data/features/rspec_matcher.feature +0 -41
  154. data/features/samples.feature +0 -305
  155. data/features/step_definitions/.rubocop.yml +0 -5
  156. data/features/step_definitions/reek_steps.rb +0 -102
  157. data/features/step_definitions/sample_file_steps.rb +0 -63
  158. data/features/support/env.rb +0 -33
  159. data/features/todo_list.feature +0 -108
  160. data/lib/reek/configuration/schema.yml +0 -210
  161. data/samples/checkstyle.xml +0 -7
  162. data/samples/clean_source/clean.rb +0 -6
  163. data/samples/configuration/accepts_rejects_and_excludes_for_detectors.reek.yml +0 -29
  164. data/samples/configuration/accepts_rejects_and_excludes_for_directory_directives.reek.yml +0 -30
  165. data/samples/configuration/corrupt.reek +0 -1
  166. data/samples/configuration/empty.reek +0 -0
  167. data/samples/configuration/full_configuration.reek +0 -13
  168. data/samples/configuration/full_mask.reek +0 -6
  169. data/samples/configuration/home/home.reek.yml +0 -4
  170. data/samples/configuration/partial_mask.reek +0 -4
  171. data/samples/configuration/regular_configuration/.reek.yml +0 -4
  172. data/samples/configuration/regular_configuration/empty_sub_directory/.gitignore +0 -0
  173. data/samples/configuration/with_excluded_paths.reek +0 -5
  174. data/samples/no_config_file/.keep +0 -0
  175. data/samples/paths.rb +0 -5
  176. data/samples/smelly_source/inline.rb +0 -704
  177. data/samples/smelly_source/optparse.rb +0 -1788
  178. data/samples/smelly_source/redcloth.rb +0 -1130
  179. data/samples/smelly_source/ruby.rb +0 -368
  180. data/samples/smelly_source/smelly.rb +0 -7
  181. data/samples/source_with_exclude_paths/ignore_me/uncommunicative_method_name.rb +0 -5
  182. data/samples/source_with_exclude_paths/nested/ignore_me_as_well/irresponsible_module.rb +0 -2
  183. data/samples/source_with_exclude_paths/nested/uncommunicative_parameter_name.rb +0 -6
  184. data/samples/source_with_exclude_paths/nested/uncommunicative_variable_name.rb +0 -6
  185. data/samples/source_with_hidden_directories/.hidden/hidden.rb +0 -1
  186. data/samples/source_with_hidden_directories/not_hidden.rb +0 -1
  187. data/samples/source_with_non_ruby_files/gibberish +0 -1
  188. data/samples/source_with_non_ruby_files/python_source.py +0 -1
  189. data/samples/source_with_non_ruby_files/ruby.rb +0 -6
  190. data/spec/performance/reek/smell_detectors/runtime_speed_spec.rb +0 -15
  191. data/spec/quality/documentation_spec.rb +0 -41
  192. data/spec/quality/reek_source_spec.rb +0 -11
  193. data/spec/reek/ast/node_spec.rb +0 -211
  194. data/spec/reek/ast/object_refs_spec.rb +0 -83
  195. data/spec/reek/ast/reference_collector_spec.rb +0 -47
  196. data/spec/reek/ast/sexp_extensions_spec.rb +0 -498
  197. data/spec/reek/cli/application_spec.rb +0 -168
  198. data/spec/reek/cli/command/report_command_spec.rb +0 -44
  199. data/spec/reek/cli/command/todo_list_command_spec.rb +0 -86
  200. data/spec/reek/cli/options_spec.rb +0 -51
  201. data/spec/reek/cli/silencer_spec.rb +0 -28
  202. data/spec/reek/code_comment_spec.rb +0 -184
  203. data/spec/reek/configuration/app_configuration_spec.rb +0 -195
  204. data/spec/reek/configuration/configuration_file_finder_spec.rb +0 -230
  205. data/spec/reek/configuration/default_directive_spec.rb +0 -13
  206. data/spec/reek/configuration/directory_directives_spec.rb +0 -122
  207. data/spec/reek/configuration/excluded_paths_spec.rb +0 -16
  208. data/spec/reek/configuration/rake_task_converter_spec.rb +0 -33
  209. data/spec/reek/configuration/schema_validator_spec.rb +0 -165
  210. data/spec/reek/context/code_context_spec.rb +0 -192
  211. data/spec/reek/context/ghost_context_spec.rb +0 -60
  212. data/spec/reek/context/method_context_spec.rb +0 -72
  213. data/spec/reek/context/module_context_spec.rb +0 -55
  214. data/spec/reek/context/root_context_spec.rb +0 -12
  215. data/spec/reek/context/statement_counter_spec.rb +0 -24
  216. data/spec/reek/context_builder_spec.rb +0 -457
  217. data/spec/reek/detector_repository_spec.rb +0 -22
  218. data/spec/reek/documentation_link_spec.rb +0 -20
  219. data/spec/reek/errors/base_error_spec.rb +0 -13
  220. data/spec/reek/examiner_spec.rb +0 -309
  221. data/spec/reek/logging_error_handler_spec.rb +0 -24
  222. data/spec/reek/rake/task_spec.rb +0 -56
  223. data/spec/reek/report/code_climate/code_climate_configuration_spec.rb +0 -22
  224. data/spec/reek/report/code_climate/code_climate_fingerprint_spec.rb +0 -126
  225. data/spec/reek/report/code_climate/code_climate_formatter_spec.rb +0 -51
  226. data/spec/reek/report/code_climate/code_climate_report_spec.rb +0 -56
  227. data/spec/reek/report/html_report_spec.rb +0 -19
  228. data/spec/reek/report/json_report_spec.rb +0 -58
  229. data/spec/reek/report/location_formatter_spec.rb +0 -32
  230. data/spec/reek/report/progress_formatter_spec.rb +0 -68
  231. data/spec/reek/report/text_report_spec.rb +0 -89
  232. data/spec/reek/report/xml_report_spec.rb +0 -24
  233. data/spec/reek/report/yaml_report_spec.rb +0 -55
  234. data/spec/reek/report_spec.rb +0 -28
  235. data/spec/reek/smell_configuration_spec.rb +0 -56
  236. data/spec/reek/smell_detectors/attribute_spec.rb +0 -197
  237. data/spec/reek/smell_detectors/base_detector_spec.rb +0 -50
  238. data/spec/reek/smell_detectors/boolean_parameter_spec.rb +0 -93
  239. data/spec/reek/smell_detectors/class_variable_spec.rb +0 -106
  240. data/spec/reek/smell_detectors/control_parameter_spec.rb +0 -300
  241. data/spec/reek/smell_detectors/data_clump_spec.rb +0 -134
  242. data/spec/reek/smell_detectors/duplicate_method_call_spec.rb +0 -211
  243. data/spec/reek/smell_detectors/feature_envy_spec.rb +0 -295
  244. data/spec/reek/smell_detectors/instance_variable_assumption_spec.rb +0 -96
  245. data/spec/reek/smell_detectors/irresponsible_module_spec.rb +0 -226
  246. data/spec/reek/smell_detectors/long_parameter_list_spec.rb +0 -61
  247. data/spec/reek/smell_detectors/long_yield_list_spec.rb +0 -49
  248. data/spec/reek/smell_detectors/manual_dispatch_spec.rb +0 -75
  249. data/spec/reek/smell_detectors/missing_safe_method_spec.rb +0 -68
  250. data/spec/reek/smell_detectors/module_initialize_spec.rb +0 -77
  251. data/spec/reek/smell_detectors/nested_iterators_spec.rb +0 -333
  252. data/spec/reek/smell_detectors/nil_check_spec.rb +0 -100
  253. data/spec/reek/smell_detectors/repeated_conditional_spec.rb +0 -100
  254. data/spec/reek/smell_detectors/subclassed_from_core_class_spec.rb +0 -77
  255. data/spec/reek/smell_detectors/too_many_constants_spec.rb +0 -144
  256. data/spec/reek/smell_detectors/too_many_instance_variables_spec.rb +0 -132
  257. data/spec/reek/smell_detectors/too_many_methods_spec.rb +0 -54
  258. data/spec/reek/smell_detectors/too_many_statements_spec.rb +0 -90
  259. data/spec/reek/smell_detectors/uncommunicative_method_name_spec.rb +0 -78
  260. data/spec/reek/smell_detectors/uncommunicative_module_name_spec.rb +0 -78
  261. data/spec/reek/smell_detectors/uncommunicative_parameter_name_spec.rb +0 -147
  262. data/spec/reek/smell_detectors/uncommunicative_variable_name_spec.rb +0 -201
  263. data/spec/reek/smell_detectors/unused_parameters_spec.rb +0 -114
  264. data/spec/reek/smell_detectors/unused_private_method_spec.rb +0 -205
  265. data/spec/reek/smell_detectors/utility_function_spec.rb +0 -293
  266. data/spec/reek/smell_warning_spec.rb +0 -137
  267. data/spec/reek/source/source_code_spec.rb +0 -79
  268. data/spec/reek/source/source_locator_spec.rb +0 -166
  269. data/spec/reek/spec/should_reek_of_spec.rb +0 -153
  270. data/spec/reek/spec/should_reek_only_of_spec.rb +0 -91
  271. data/spec/reek/spec/should_reek_spec.rb +0 -52
  272. data/spec/reek/spec/smell_matcher_spec.rb +0 -87
  273. data/spec/reek/tree_dresser_spec.rb +0 -46
  274. data/spec/spec_helper.rb +0 -110
  275. data/tasks/configuration.rake +0 -18
  276. data/tasks/console.rake +0 -5
  277. data/tasks/reek.rake +0 -6
  278. data/tasks/rubocop.rake +0 -11
  279. data/tasks/test.rake +0 -32
  280. /data/lib/reek/{report/code_climate.rb → code_climate.rb} +0 -0
@@ -1,333 +0,0 @@
1
- require_relative '../../spec_helper'
2
- require_lib 'reek/smell_detectors/nested_iterators'
3
-
4
- RSpec.describe Reek::SmellDetectors::NestedIterators do
5
- it 'reports the right values' do
6
- src = <<-RUBY
7
- def alfa(bravo)
8
- bravo.each do |charlie|
9
- charlie.each { |delta| delta }
10
- end
11
- end
12
- RUBY
13
-
14
- expect(src).to reek_of(:NestedIterators,
15
- lines: [3],
16
- context: 'alfa',
17
- message: 'contains iterators nested 2 deep',
18
- source: 'string',
19
- depth: 2)
20
- end
21
-
22
- it 'does count all occurences' do
23
- src = <<-RUBY
24
- def alfa
25
- bravo.each do |charlie|
26
- charlie.each { |delta| delta }
27
- end
28
-
29
- echo.each do |foxtrot|
30
- foxtrot.each do |golf|
31
- golf.each { |hotel| hotel }
32
- end
33
- end
34
- end
35
- RUBY
36
-
37
- expect(src).
38
- to reek_of(:NestedIterators, lines: [3], depth: 2).
39
- and reek_of(:NestedIterators, lines: [8], depth: 3)
40
- end
41
-
42
- it 'reports no smells with no iterators' do
43
- src = 'def alfa; end'
44
- expect(src).not_to reek_of(:NestedIterators)
45
- end
46
-
47
- it 'reports no smells with one iterator' do
48
- src = <<-RUBY
49
- def alfa(bravo)
50
- bravo.each { |charlie| charlie }
51
- end
52
- RUBY
53
-
54
- expect(src).not_to reek_of(:NestedIterators)
55
- end
56
-
57
- it 'does not report nested iterators for Object#tap' do
58
- src = <<-RUBY
59
- def alfa(bravo)
60
- bravo.tap do |charlie|
61
- charlie.each { |delta| delta }
62
- end
63
- end
64
- RUBY
65
-
66
- expect(src).not_to reek_of(:NestedIterators)
67
- end
68
-
69
- it 'does not report method with successive iterators' do
70
- src = <<-RUBY
71
- def alfa
72
- @bravo.each { |charlie| charlie }
73
- @charlie.each { |delta| delta }
74
- end
75
- RUBY
76
-
77
- expect(src).not_to reek_of(:NestedIterators)
78
- end
79
-
80
- it 'does not report method with chained iterators' do
81
- src = <<-RUBY
82
- def alfa
83
- bravo.sort_by { |charlie| charlie }.each { |delta| delta }
84
- end
85
- RUBY
86
-
87
- expect(src).not_to reek_of(:NestedIterators)
88
- end
89
-
90
- it 'detects an iterator with an empty block' do
91
- src = <<-RUBY
92
- def alfa
93
- bravo do |charlie|
94
- charlie { |delta| }
95
- end
96
- end
97
- RUBY
98
-
99
- expect(src).to reek_of(:NestedIterators)
100
- end
101
-
102
- it 'reports nesting inside iterator arguments' do
103
- src = <<-RUBY
104
- def alfa(bravo)
105
- bravo(
106
- charlie.each do |delta|
107
- delta.each { |echo| echo }
108
- end
109
- )
110
- end
111
- RUBY
112
-
113
- expect(src).to reek_of(:NestedIterators, depth: 2)
114
- end
115
-
116
- it 'reports the deepest level of nesting only' do
117
- src = <<-RUBY
118
- def alfa(bravo)
119
- bravo.each do |charlie|
120
- charlie.each do |delta|
121
- delta.each { |echo| echo }
122
- end
123
- end
124
- end
125
- RUBY
126
-
127
- expect(src).
128
- to not_reek_of(:NestedIterators, depth: 2).
129
- and reek_of(:NestedIterators, depth: 3, lines: [4])
130
- end
131
-
132
- it 'reports all lines on which nested iterators occur' do
133
- source = <<-RUBY
134
- def alfa
135
- @bravo.each { |charlie| charlie.each { |delta| @echo.send } }
136
- @foxtrot.each { |golf| golf.each { |hotel| @india.send } }
137
- end
138
- RUBY
139
-
140
- expect(source).to reek_of(:NestedIterators, lines: [2, 3])
141
- end
142
-
143
- it 'handles the case where super receives a block' do
144
- src = <<-RUBY
145
- def alfa
146
- super do |bravo|
147
- bravo.each { |charlie| charlie }
148
- end
149
- end
150
- RUBY
151
-
152
- expect(src).to reek_of(:NestedIterators)
153
- end
154
-
155
- it 'handles the case where super receives a block and arguments' do
156
- src = <<-RUBY
157
- def alfa
158
- super(delta) do |bravo|
159
- bravo.each { |charlie| charlie }
160
- end
161
- end
162
- RUBY
163
-
164
- expect(src).to reek_of(:NestedIterators)
165
- end
166
-
167
- it 'does not count iterators without block arguments' do
168
- src = <<-RUBY
169
- def alfa
170
- bravo do
171
- charlie.each { |delta| delta }
172
- end
173
- end
174
- RUBY
175
-
176
- expect(src).not_to reek_of(:NestedIterators)
177
- end
178
-
179
- context 'when blocks are specified as lambdas' do
180
- it 'does not report blocks that are not nested' do
181
- src = <<-RUBY
182
- def alfa
183
- bravo ->(charlie) { delta }
184
- end
185
- RUBY
186
-
187
- expect(src).not_to reek_of(:NestedIterators)
188
- end
189
-
190
- it 'reports blocks that are nested' do
191
- src = <<-RUBY
192
- def alfa
193
- bravo ->(charlie) do
194
- delta ->(echo) { echo }
195
- end
196
- end
197
- RUBY
198
-
199
- expect(src).to reek_of(:NestedIterators)
200
- end
201
- end
202
-
203
- it 'reports nested iterators called via safe navigation' do
204
- src = <<-RUBY
205
- def alfa(bravo)
206
- bravo&.each do |charlie|
207
- charlie&.each { |delta| delta }
208
- end
209
- end
210
- RUBY
211
-
212
- expect(src).to reek_of(:NestedIterators)
213
- end
214
-
215
- it 'does not report unnested iterators called via safe navigation' do
216
- src = <<-RUBY
217
- def alfa(bravo)
218
- bravo&.each { |charlie| charlie }
219
- delta&.each { |echo| echo }
220
- end
221
- RUBY
222
-
223
- expect(src).not_to reek_of(:NestedIterators)
224
- end
225
-
226
- context 'when setting the allowed nesting depth to 3' do
227
- let(:config) do
228
- { Reek::SmellDetectors::NestedIterators::MAX_ALLOWED_NESTING_KEY => 3 }
229
- end
230
-
231
- it 'does not report nested iterators 3 levels deep' do
232
- src = <<-RUBY
233
- def alfa(bravo)
234
- bravo.each do |charlie|
235
- charlie.each do |delta|
236
- delta.each { |echo| echo }
237
- end
238
- end
239
- end
240
- RUBY
241
-
242
- expect(src).not_to reek_of(:NestedIterators).with_config(config)
243
- end
244
-
245
- it 'reports nested iterators 4 levels deep' do
246
- src = <<-RUBY
247
- def alfa(bravo)
248
- bravo.each do |charlie|
249
- charlie.each do |delta|
250
- delta.each do |echo|
251
- echo.each { |foxtrot| foxtrot }
252
- end
253
- end
254
- end
255
- end
256
- RUBY
257
-
258
- expect(src).to reek_of(:NestedIterators).with_config(config)
259
- end
260
- end
261
-
262
- context 'when ignoring iterators' do
263
- let(:config) do
264
- { Reek::SmellDetectors::NestedIterators::IGNORE_ITERATORS_KEY => ['ignore_me'] }
265
- end
266
-
267
- it 'does not report when nesting the ignored iterator inside another' do
268
- src = <<-RUBY
269
- def alfa(bravo)
270
- bravo.each do |charlie|
271
- charlie.ignore_me { |delta| delta }
272
- end
273
- end
274
- RUBY
275
-
276
- expect(src).not_to reek_of(:NestedIterators).with_config(config)
277
- end
278
-
279
- it 'does not report a nested iterator inside the ignored iterator' do
280
- src = <<-RUBY
281
- def alfa(bravo)
282
- bravo.ignore_me do |charlie|
283
- charlie.each { |delta| delta }
284
- end
285
- end
286
- RUBY
287
-
288
- expect(src).not_to reek_of(:NestedIterators).with_config(config)
289
- end
290
-
291
- it 'reports nested iterators inside the ignored iterator' do
292
- src = <<-RUBY
293
- def alfa(bravo)
294
- bravo.ignore_me do |charlie|
295
- charlie.each do |delta|
296
- delta.each { |echo| echo }
297
- end
298
- end
299
- end
300
- RUBY
301
-
302
- expect(src).to reek_of(:NestedIterators, depth: 2).with_config(config)
303
- end
304
-
305
- it 'reports nested iterators outside the ignored iterator' do
306
- src = <<-RUBY
307
- def alfa(bravo)
308
- bravo.each do |charlie|
309
- charlie.each do |delta|
310
- delta.ignore_me { |echo| echo }
311
- end
312
- end
313
- end
314
- RUBY
315
-
316
- expect(src).to reek_of(:NestedIterators, depth: 2).with_config(config)
317
- end
318
-
319
- it 'reports nested iterators with the ignored iterator between them' do
320
- src = <<-RUBY
321
- def alfa(bravo)
322
- bravo.each do |charlie|
323
- charlie.ignore_me do |delta|
324
- delta.each { |echo| echo }
325
- end
326
- end
327
- end
328
- RUBY
329
-
330
- expect(src).to reek_of(:NestedIterators, depth: 2).with_config(config)
331
- end
332
- end
333
- end
@@ -1,100 +0,0 @@
1
- require_relative '../../spec_helper'
2
- require_lib 'reek/smell_detectors/nil_check'
3
-
4
- RSpec.describe Reek::SmellDetectors::NilCheck do
5
- it 'reports the right values' do
6
- src = <<-RUBY
7
- def alfa(bravo)
8
- bravo.nil?
9
- end
10
- RUBY
11
-
12
- expect(src).to reek_of(:NilCheck,
13
- lines: [2],
14
- context: 'alfa',
15
- message: 'performs a nil-check',
16
- source: 'string')
17
- end
18
-
19
- it 'does count all occurences' do
20
- src = <<-RUBY
21
- def alfa(bravo, charlie)
22
- bravo.nil?
23
- charlie.nil?
24
- end
25
- RUBY
26
-
27
- expect(src).to reek_of(:NilCheck,
28
- lines: [2, 3],
29
- context: 'alfa')
30
- end
31
-
32
- it 'reports nothing when scope includes no nil checks' do
33
- src = 'def alfa; end'
34
- expect(src).not_to reek_of(:NilCheck)
35
- end
36
-
37
- it 'reports when scope uses == nil' do
38
- src = <<-RUBY
39
- def alfa(bravo)
40
- bravo == nil
41
- end
42
- RUBY
43
-
44
- expect(src).to reek_of(:NilCheck)
45
- end
46
-
47
- it 'reports when scope uses === nil' do
48
- src = <<-RUBY
49
- def alfa(bravo)
50
- bravo === nil
51
- end
52
- RUBY
53
-
54
- expect(src).to reek_of(:NilCheck)
55
- end
56
-
57
- it 'reports when scope uses nil ==' do
58
- src = <<-RUBY
59
- def alfa(bravo)
60
- nil == bravo
61
- end
62
- RUBY
63
-
64
- expect(src).to reek_of(:NilCheck)
65
- end
66
-
67
- it 'reports when scope uses a case-clause checking nil' do
68
- src = <<-RUBY
69
- def alfa(bravo)
70
- case bravo
71
- when nil then puts "Nil"
72
- end
73
- end
74
- RUBY
75
-
76
- expect(src).to reek_of(:NilCheck)
77
- end
78
-
79
- it 'does not report when scope uses &.' do
80
- src = <<-RUBY
81
- def alfa(bravo)
82
- bravo&.charlie
83
- end
84
- RUBY
85
-
86
- expect(src).not_to reek_of(:NilCheck)
87
- end
88
-
89
- it 'reports all lines when scope uses multiple nilchecks' do
90
- src = <<-RUBY
91
- def alfa(bravo)
92
- bravo.nil?
93
- @charlie === nil
94
- delta&.echo
95
- end
96
- RUBY
97
-
98
- expect(src).to reek_of(:NilCheck, lines: [2, 3])
99
- end
100
- end
@@ -1,100 +0,0 @@
1
- require_relative '../../spec_helper'
2
- require_lib 'reek/smell_detectors/repeated_conditional'
3
-
4
- RSpec.describe Reek::SmellDetectors::RepeatedConditional do
5
- it 'reports the right values' do
6
- src = <<-RUBY
7
- class Alfa
8
- attr_accessor :bravo
9
-
10
- def charlie
11
- puts "Repeat 1!" if bravo
12
- end
13
-
14
- def delta
15
- puts "Repeat 2!" if bravo
16
- end
17
-
18
- def echo
19
- puts "Repeat 3!" if bravo
20
- end
21
- end
22
- RUBY
23
-
24
- expect(src).to reek_of(:RepeatedConditional,
25
- lines: [5, 9, 13],
26
- context: 'Alfa',
27
- message: "tests 'bravo' at least 3 times",
28
- source: 'string',
29
- name: 'bravo',
30
- count: 3)
31
- end
32
-
33
- it 'does count all occurences' do
34
- src = <<-RUBY
35
- class Alfa
36
- attr_accessor :bravo
37
-
38
- def charlie
39
- puts "Repeat 1!" if bravo
40
- puts "And again!" if bravo
41
- end
42
-
43
- def delta
44
- puts "Repeat 2!" if bravo
45
- end
46
-
47
- def echo
48
- puts "Repeat 3!" if bravo
49
- end
50
- end
51
- RUBY
52
-
53
- expect(src).to reek_of(:RepeatedConditional,
54
- lines: [5, 6, 10, 14],
55
- count: 4)
56
- end
57
-
58
- it 'does not report two repeated conditionals' do
59
- src = <<-RUBY
60
- class Alfa
61
- attr_accessor :bravo
62
-
63
- def charlie
64
- puts "Repeat 1!" if bravo
65
- end
66
-
67
- def delta
68
- puts "Repeat 2!" if bravo
69
- end
70
- end
71
- RUBY
72
-
73
- expect(src).not_to reek_of(:RepeatedConditional)
74
- end
75
-
76
- it 'reports repeated conditionals regardless of `if` or `case` statements' do
77
- src = <<-RUBY
78
- class Alfa
79
- attr_accessor :bravo
80
-
81
- def charlie
82
- puts "Repeat 1!" if bravo
83
- end
84
-
85
- def delta
86
- case bravo
87
- when 1 then puts "Repeat 2!"
88
- else 'nothing'
89
- end
90
- end
91
-
92
- def echo
93
- puts "Repeat 3!" if bravo
94
- end
95
- end
96
- RUBY
97
-
98
- expect(src).to reek_of(:RepeatedConditional)
99
- end
100
- end
@@ -1,77 +0,0 @@
1
- require_relative '../../spec_helper'
2
- require_lib 'reek/smell_detectors/subclassed_from_core_class'
3
-
4
- RSpec.describe Reek::SmellDetectors::SubclassedFromCoreClass do
5
- it 'reports the right values' do
6
- src = <<-RUBY
7
- class Alfa < Hash
8
- end
9
- RUBY
10
-
11
- expect(src).to reek_of(:SubclassedFromCoreClass,
12
- lines: [1],
13
- context: 'Alfa',
14
- message: "inherits from core class 'Hash'",
15
- source: 'string',
16
- ancestor: 'Hash')
17
- end
18
-
19
- it 'reports when inheriting from a core class inside a module' do
20
- src = <<-RUBY
21
- module Alfa
22
- class Bravo < Hash
23
- end
24
- end
25
- RUBY
26
-
27
- expect(src).to reek_of(:SubclassedFromCoreClass, context: 'Alfa::Bravo')
28
- end
29
-
30
- it 'does not report when not inheriting from a core class' do
31
- src = <<-RUBY
32
- class Alfa
33
- end
34
- RUBY
35
-
36
- expect(src).not_to reek_of(:SubclassedFromCoreClass)
37
- end
38
-
39
- it 'does not report on coincidental core class names in other namespaces' do
40
- src = <<-RUBY
41
- class Alfa < Bravo::Array
42
- end
43
- RUBY
44
-
45
- expect(src).not_to reek_of(:SubclassedFromCoreClass)
46
- end
47
-
48
- it 'reports if inner class inherit from a core class' do
49
- src = <<-RUBY
50
- class Alfa
51
- Bravo = Class.new(Array)
52
- end
53
- RUBY
54
-
55
- expect(src).to reek_of(:SubclassedFromCoreClass, context: 'Alfa::Bravo')
56
- end
57
-
58
- it 'reports class which inherits from core class via Class.new' do
59
- src = 'Alfa = Class.new(Array)'
60
- expect(src).to reek_of(:SubclassedFromCoreClass)
61
- end
62
-
63
- it 'does not report class which inherits from allowed class via Class.new' do
64
- src = 'Alfa = Class.new(StandardError)'
65
- expect(src).not_to reek_of(:SubclassedFromCoreClass)
66
- end
67
-
68
- it 'does not report classes created with Struct.new' do
69
- src = "Alfa = Struct.new('Array')"
70
- expect(src).not_to reek_of(:SubclassedFromCoreClass)
71
- end
72
-
73
- it 'does not report class created by another class constructor taking a core class as argument' do
74
- src = 'Charlie = Delta.new(Array)'
75
- expect(src).not_to reek_of(:SubclassedFromCoreClass)
76
- end
77
- end