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.
- checksums.yaml +4 -4
- data/CHANGELOG.md +6 -1
- data/CONTRIBUTING.md +3 -0
- data/Dockerfile +1 -1
- data/Gemfile +6 -6
- data/lib/reek/ast/ast_node_class_map.rb +1 -1
- data/lib/reek/report/code_climate/code_climate_formatter.rb +1 -3
- data/lib/reek/smell_detectors/base_detector.rb +1 -1
- data/lib/reek/smell_warning.rb +1 -1
- data/lib/reek/source/source_locator.rb +1 -3
- data/lib/reek/version.rb +1 -1
- data/reek.gemspec +4 -1
- metadata +3 -208
- data/docs/API.md +0 -174
- data/docs/Attribute.md +0 -39
- data/docs/Basic-Smell-Options.md +0 -85
- data/docs/Boolean-Parameter.md +0 -54
- data/docs/Class-Variable.md +0 -40
- data/docs/Code-Smells.md +0 -39
- data/docs/Command-Line-Options.md +0 -119
- data/docs/Control-Couple.md +0 -26
- data/docs/Control-Parameter.md +0 -32
- data/docs/Data-Clump.md +0 -46
- data/docs/Duplicate-Method-Call.md +0 -264
- data/docs/Feature-Envy.md +0 -93
- data/docs/How-To-Write-New-Detectors.md +0 -132
- data/docs/How-reek-works-internally.md +0 -114
- data/docs/Instance-Variable-Assumption.md +0 -163
- data/docs/Irresponsible-Module.md +0 -47
- data/docs/Large-Class.md +0 -16
- data/docs/Long-Parameter-List.md +0 -39
- data/docs/Long-Yield-List.md +0 -37
- data/docs/Manual-Dispatch.md +0 -30
- data/docs/Missing-Safe-Method.md +0 -92
- data/docs/Module-Initialize.md +0 -62
- data/docs/Nested-Iterators.md +0 -59
- data/docs/Nil-Check.md +0 -47
- data/docs/RSpec-matchers.md +0 -129
- data/docs/Rake-Task.md +0 -66
- data/docs/Reek-4-to-Reek-5-migration.md +0 -188
- data/docs/Reek-Driven-Development.md +0 -46
- data/docs/Repeated-Conditional.md +0 -47
- data/docs/Simulated-Polymorphism.md +0 -16
- data/docs/Smell-Suppression.md +0 -96
- data/docs/Style-Guide.md +0 -19
- data/docs/Subclassed-From-Core-Class.md +0 -79
- data/docs/Too-Many-Constants.md +0 -37
- data/docs/Too-Many-Instance-Variables.md +0 -43
- data/docs/Too-Many-Methods.md +0 -56
- data/docs/Too-Many-Statements.md +0 -54
- data/docs/Uncommunicative-Method-Name.md +0 -94
- data/docs/Uncommunicative-Module-Name.md +0 -92
- data/docs/Uncommunicative-Name.md +0 -18
- data/docs/Uncommunicative-Parameter-Name.md +0 -90
- data/docs/Uncommunicative-Variable-Name.md +0 -96
- data/docs/Unused-Parameters.md +0 -28
- data/docs/Unused-Private-Method.md +0 -101
- data/docs/Utility-Function.md +0 -56
- data/docs/Versioning-Policy.md +0 -7
- data/docs/YAML-Reports.md +0 -93
- data/docs/defaults.reek.yml +0 -129
- data/docs/templates/default/docstring/html/public_api_marker.erb +0 -3
- data/docs/templates/default/docstring/setup.rb +0 -35
- data/docs/templates/default/fulldoc/html/css/common.css +0 -1
- data/docs/yard_plugin.rb +0 -17
- data/features/command_line_interface/basic_usage.feature +0 -15
- data/features/command_line_interface/options.feature +0 -123
- data/features/command_line_interface/show_progress.feature +0 -33
- data/features/command_line_interface/smell_selection.feature +0 -15
- data/features/command_line_interface/smells_count.feature +0 -38
- data/features/command_line_interface/stdin.feature +0 -65
- data/features/configuration_files/accept_setting.feature +0 -87
- data/features/configuration_files/directory_specific_directives.feature +0 -274
- data/features/configuration_files/exclude_directives.feature +0 -35
- data/features/configuration_files/exclude_paths_directives.feature +0 -42
- data/features/configuration_files/masking_smells.feature +0 -94
- data/features/configuration_files/mix_accept_reject_setting.feature +0 -84
- data/features/configuration_files/reject_setting.feature +0 -89
- data/features/configuration_files/schema_validation.feature +0 -59
- data/features/configuration_files/show_configuration_file.feature +0 -44
- data/features/configuration_files/unused_private_method.feature +0 -68
- data/features/configuration_loading.feature +0 -91
- data/features/configuration_via_source_comments/erroneous_source_comments.feature +0 -68
- data/features/configuration_via_source_comments/well_formed_source_comments.feature +0 -116
- data/features/locales.feature +0 -32
- data/features/programmatic_access.feature +0 -41
- data/features/rake_task/rake_task.feature +0 -138
- data/features/reports/codeclimate.feature +0 -59
- data/features/reports/json.feature +0 -59
- data/features/reports/reports.feature +0 -219
- data/features/reports/yaml.feature +0 -52
- data/features/rspec_matcher.feature +0 -41
- data/features/samples.feature +0 -305
- data/features/step_definitions/.rubocop.yml +0 -5
- data/features/step_definitions/reek_steps.rb +0 -102
- data/features/step_definitions/sample_file_steps.rb +0 -63
- data/features/support/env.rb +0 -33
- data/features/todo_list.feature +0 -108
- data/samples/checkstyle.xml +0 -7
- data/samples/clean_source/clean.rb +0 -6
- data/samples/configuration/accepts_rejects_and_excludes_for_detectors.reek.yml +0 -29
- data/samples/configuration/accepts_rejects_and_excludes_for_directory_directives.reek.yml +0 -30
- data/samples/configuration/corrupt.reek +0 -1
- data/samples/configuration/empty.reek +0 -0
- data/samples/configuration/full_configuration.reek +0 -13
- data/samples/configuration/full_mask.reek +0 -6
- data/samples/configuration/home/home.reek.yml +0 -4
- data/samples/configuration/partial_mask.reek +0 -4
- data/samples/configuration/regular_configuration/.reek.yml +0 -4
- data/samples/configuration/regular_configuration/empty_sub_directory/.gitignore +0 -0
- data/samples/configuration/with_excluded_paths.reek +0 -5
- data/samples/no_config_file/.keep +0 -0
- data/samples/paths.rb +0 -5
- data/samples/smelly_source/inline.rb +0 -704
- data/samples/smelly_source/optparse.rb +0 -1788
- data/samples/smelly_source/redcloth.rb +0 -1130
- data/samples/smelly_source/ruby.rb +0 -368
- data/samples/smelly_source/smelly.rb +0 -7
- data/samples/source_with_exclude_paths/ignore_me/uncommunicative_method_name.rb +0 -5
- data/samples/source_with_exclude_paths/nested/ignore_me_as_well/irresponsible_module.rb +0 -2
- data/samples/source_with_exclude_paths/nested/uncommunicative_parameter_name.rb +0 -6
- data/samples/source_with_exclude_paths/nested/uncommunicative_variable_name.rb +0 -6
- data/samples/source_with_hidden_directories/.hidden/hidden.rb +0 -1
- data/samples/source_with_hidden_directories/not_hidden.rb +0 -1
- data/samples/source_with_non_ruby_files/gibberish +0 -1
- data/samples/source_with_non_ruby_files/python_source.py +0 -1
- data/samples/source_with_non_ruby_files/ruby.rb +0 -6
- data/spec/performance/reek/smell_detectors/runtime_speed_spec.rb +0 -15
- data/spec/quality/documentation_spec.rb +0 -41
- data/spec/quality/reek_source_spec.rb +0 -11
- data/spec/reek/ast/node_spec.rb +0 -211
- data/spec/reek/ast/object_refs_spec.rb +0 -83
- data/spec/reek/ast/reference_collector_spec.rb +0 -47
- data/spec/reek/ast/sexp_extensions_spec.rb +0 -498
- data/spec/reek/cli/application_spec.rb +0 -168
- data/spec/reek/cli/command/report_command_spec.rb +0 -44
- data/spec/reek/cli/command/todo_list_command_spec.rb +0 -86
- data/spec/reek/cli/options_spec.rb +0 -51
- data/spec/reek/cli/silencer_spec.rb +0 -28
- data/spec/reek/code_comment_spec.rb +0 -184
- data/spec/reek/configuration/app_configuration_spec.rb +0 -195
- data/spec/reek/configuration/configuration_file_finder_spec.rb +0 -230
- data/spec/reek/configuration/default_directive_spec.rb +0 -13
- data/spec/reek/configuration/directory_directives_spec.rb +0 -122
- data/spec/reek/configuration/excluded_paths_spec.rb +0 -25
- data/spec/reek/configuration/rake_task_converter_spec.rb +0 -33
- data/spec/reek/configuration/schema_validator_spec.rb +0 -165
- data/spec/reek/context/code_context_spec.rb +0 -192
- data/spec/reek/context/ghost_context_spec.rb +0 -60
- data/spec/reek/context/method_context_spec.rb +0 -72
- data/spec/reek/context/module_context_spec.rb +0 -55
- data/spec/reek/context/root_context_spec.rb +0 -12
- data/spec/reek/context/statement_counter_spec.rb +0 -24
- data/spec/reek/context_builder_spec.rb +0 -457
- data/spec/reek/detector_repository_spec.rb +0 -22
- data/spec/reek/documentation_link_spec.rb +0 -20
- data/spec/reek/errors/base_error_spec.rb +0 -13
- data/spec/reek/examiner_spec.rb +0 -309
- data/spec/reek/logging_error_handler_spec.rb +0 -24
- data/spec/reek/rake/task_spec.rb +0 -56
- data/spec/reek/report/code_climate/code_climate_configuration_spec.rb +0 -22
- data/spec/reek/report/code_climate/code_climate_fingerprint_spec.rb +0 -126
- data/spec/reek/report/code_climate/code_climate_formatter_spec.rb +0 -51
- data/spec/reek/report/code_climate/code_climate_report_spec.rb +0 -56
- data/spec/reek/report/html_report_spec.rb +0 -19
- data/spec/reek/report/json_report_spec.rb +0 -58
- data/spec/reek/report/location_formatter_spec.rb +0 -32
- data/spec/reek/report/progress_formatter_spec.rb +0 -68
- data/spec/reek/report/text_report_spec.rb +0 -89
- data/spec/reek/report/xml_report_spec.rb +0 -24
- data/spec/reek/report/yaml_report_spec.rb +0 -55
- data/spec/reek/report_spec.rb +0 -28
- data/spec/reek/smell_configuration_spec.rb +0 -56
- data/spec/reek/smell_detectors/attribute_spec.rb +0 -197
- data/spec/reek/smell_detectors/base_detector_spec.rb +0 -50
- data/spec/reek/smell_detectors/boolean_parameter_spec.rb +0 -93
- data/spec/reek/smell_detectors/class_variable_spec.rb +0 -106
- data/spec/reek/smell_detectors/control_parameter_spec.rb +0 -300
- data/spec/reek/smell_detectors/data_clump_spec.rb +0 -134
- data/spec/reek/smell_detectors/duplicate_method_call_spec.rb +0 -211
- data/spec/reek/smell_detectors/feature_envy_spec.rb +0 -295
- data/spec/reek/smell_detectors/instance_variable_assumption_spec.rb +0 -96
- data/spec/reek/smell_detectors/irresponsible_module_spec.rb +0 -226
- data/spec/reek/smell_detectors/long_parameter_list_spec.rb +0 -61
- data/spec/reek/smell_detectors/long_yield_list_spec.rb +0 -49
- data/spec/reek/smell_detectors/manual_dispatch_spec.rb +0 -75
- data/spec/reek/smell_detectors/missing_safe_method_spec.rb +0 -68
- data/spec/reek/smell_detectors/module_initialize_spec.rb +0 -77
- data/spec/reek/smell_detectors/nested_iterators_spec.rb +0 -333
- data/spec/reek/smell_detectors/nil_check_spec.rb +0 -100
- data/spec/reek/smell_detectors/repeated_conditional_spec.rb +0 -100
- data/spec/reek/smell_detectors/subclassed_from_core_class_spec.rb +0 -77
- data/spec/reek/smell_detectors/too_many_constants_spec.rb +0 -144
- data/spec/reek/smell_detectors/too_many_instance_variables_spec.rb +0 -132
- data/spec/reek/smell_detectors/too_many_methods_spec.rb +0 -54
- data/spec/reek/smell_detectors/too_many_statements_spec.rb +0 -90
- data/spec/reek/smell_detectors/uncommunicative_method_name_spec.rb +0 -78
- data/spec/reek/smell_detectors/uncommunicative_module_name_spec.rb +0 -78
- data/spec/reek/smell_detectors/uncommunicative_parameter_name_spec.rb +0 -147
- data/spec/reek/smell_detectors/uncommunicative_variable_name_spec.rb +0 -201
- data/spec/reek/smell_detectors/unused_parameters_spec.rb +0 -114
- data/spec/reek/smell_detectors/unused_private_method_spec.rb +0 -205
- data/spec/reek/smell_detectors/utility_function_spec.rb +0 -309
- data/spec/reek/smell_warning_spec.rb +0 -137
- data/spec/reek/source/source_code_spec.rb +0 -79
- data/spec/reek/source/source_locator_spec.rb +0 -166
- data/spec/reek/spec/should_reek_of_spec.rb +0 -153
- data/spec/reek/spec/should_reek_only_of_spec.rb +0 -91
- data/spec/reek/spec/should_reek_spec.rb +0 -52
- data/spec/reek/spec/smell_matcher_spec.rb +0 -87
- data/spec/reek/tree_dresser_spec.rb +0 -46
- data/spec/spec_helper.rb +0 -110
- data/tasks/configuration.rake +0 -18
- data/tasks/console.rake +0 -5
- data/tasks/reek.rake +0 -6
- data/tasks/rubocop.rake +0 -11
- 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
|