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,68 +0,0 @@
1
- require_relative '../../spec_helper'
2
- require_lib 'reek/smell_detectors/missing_safe_method'
3
-
4
- RSpec.describe Reek::SmellDetectors::MissingSafeMethod do
5
- it 'reports the right values' do
6
- src = <<-RUBY
7
- class Alfa
8
- def bravo!
9
- end
10
- end
11
- RUBY
12
-
13
- expect(src).to reek_of(:MissingSafeMethod,
14
- lines: [2],
15
- context: 'Alfa',
16
- message: "has missing safe method 'bravo!'",
17
- source: 'string',
18
- name: 'bravo!')
19
- end
20
-
21
- it 'does count all occurences' do
22
- src = <<-RUBY
23
- class Alfa
24
- def bravo!
25
- end
26
-
27
- def charlie!
28
- end
29
- end
30
- RUBY
31
-
32
- expect(src).
33
- to reek_of(:MissingSafeMethod, lines: [2], name: 'bravo!').
34
- and reek_of(:MissingSafeMethod, lines: [5], name: 'charlie!')
35
- end
36
-
37
- it 'reports nothing when method and bang counterpart exist' do
38
- src = <<-RUBY
39
- class Alfa
40
- def bravo
41
- end
42
-
43
- def bravo!
44
- end
45
- end
46
- RUBY
47
-
48
- expect(src).not_to reek_of(:MissingSafeMethod)
49
- end
50
-
51
- it 'does not report methods we excluded via comment' do
52
- source = <<-RUBY
53
- # :reek:MissingSafeMethod { exclude: [ bravo! ] }
54
- class Alfa
55
- def bravo!
56
- end
57
-
58
- def charlie!
59
- end
60
- end
61
- RUBY
62
-
63
- aggregate_failures do
64
- expect(source).not_to reek_of(:MissingSafeMethod, name: 'bravo!')
65
- expect(source).to reek_of(:MissingSafeMethod, name: 'charlie!')
66
- end
67
- end
68
- end
@@ -1,77 +0,0 @@
1
- require_relative '../../spec_helper'
2
- require_lib 'reek/smell_detectors/module_initialize'
3
-
4
- RSpec.describe Reek::SmellDetectors::ModuleInitialize do
5
- it 'reports the right values' do
6
- src = <<-RUBY
7
- module Alfa
8
- def initialize; end
9
- end
10
- RUBY
11
-
12
- expect(src).to reek_of(:ModuleInitialize,
13
- lines: [1],
14
- context: 'Alfa',
15
- message: 'has initialize method',
16
- source: 'string')
17
- end
18
-
19
- it 'reports nothing for a method with a different name' do
20
- src = <<-RUBY
21
- module Alfa
22
- def bravo; end
23
- end
24
- RUBY
25
-
26
- expect(src).not_to reek_of(:ModuleInitialize)
27
- end
28
-
29
- it 'reports nothing for a method named initialize in a nested class' do
30
- src = <<-RUBY
31
- module Alfa
32
- class Bravo
33
- def initialize; end
34
- end
35
- end
36
- RUBY
37
-
38
- expect(src).not_to reek_of(:ModuleInitialize)
39
- end
40
-
41
- it 'reports nothing for a method named initialize in a nested struct' do
42
- src = <<-RUBY
43
- module Alfa
44
- Bravo = Struct.new(:charlie) do
45
- def initialize; end
46
- end
47
- end
48
- RUBY
49
-
50
- expect(src).not_to reek_of(:ModuleInitialize)
51
- end
52
-
53
- it 'reports nothing for a method named initialize in a nested dynamic class' do
54
- src = <<-RUBY
55
- module Alfa
56
- def self.bravo
57
- Class.new do
58
- def initialize; end
59
- end
60
- end
61
- end
62
- RUBY
63
-
64
- expect(src).not_to reek_of(:ModuleInitialize)
65
- end
66
-
67
- it 'can be disabled via comment' do
68
- src = <<-RUBY
69
- # :reek:ModuleInitialize
70
- module Alfa
71
- def initialize; end
72
- end
73
- RUBY
74
-
75
- expect(src).not_to reek_of(:ModuleInitialize)
76
- end
77
- end
@@ -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