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.
- checksums.yaml +4 -4
- data/.github/dependabot.yml +13 -0
- data/.github/workflows/ruby.yml +58 -0
- data/.gitignore +0 -1
- data/.rubocop.yml +7 -20
- data/.rubocop_todo.yml +6 -4
- data/.simplecov +2 -0
- data/CHANGELOG.md +114 -0
- data/CONTRIBUTING.md +10 -10
- data/Dockerfile +1 -1
- data/Gemfile +17 -24
- data/README.md +38 -40
- data/Rakefile +2 -0
- data/bin/code_climate_reek +56 -8
- data/docs/yard_plugin.rb +3 -1
- data/lib/reek/ast/ast_node_class_map.rb +1 -1
- data/lib/reek/ast/node.rb +16 -10
- data/lib/reek/ast/sexp_extensions/arguments.rb +20 -0
- data/lib/reek/ast/sexp_extensions/case.rb +1 -1
- data/lib/reek/ast/sexp_extensions/if.rb +1 -1
- data/lib/reek/ast/sexp_extensions/send.rb +22 -7
- data/lib/reek/cli/command/todo_list_command.rb +3 -3
- data/lib/reek/cli/options.rb +8 -8
- data/lib/reek/{report/code_climate → code_climate}/code_climate_configuration.rb +1 -1
- data/lib/reek/{report/code_climate → code_climate}/code_climate_configuration.yml +41 -41
- data/lib/reek/{report/code_climate → code_climate}/code_climate_fingerprint.rb +2 -2
- data/lib/reek/{report/code_climate → code_climate}/code_climate_formatter.rb +2 -4
- data/lib/reek/{report/code_climate → code_climate}/code_climate_report.rb +3 -3
- data/lib/reek/code_comment.rb +25 -20
- data/lib/reek/configuration/app_configuration.rb +5 -5
- data/lib/reek/configuration/configuration_converter.rb +1 -1
- data/lib/reek/configuration/configuration_file_finder.rb +5 -4
- data/lib/reek/configuration/default_directive.rb +1 -1
- data/lib/reek/configuration/directory_directives.rb +1 -1
- data/lib/reek/configuration/excluded_paths.rb +3 -2
- data/lib/reek/configuration/schema.rb +177 -0
- data/lib/reek/configuration/schema_validator.rb +12 -13
- data/lib/reek/context/attribute_context.rb +1 -1
- data/lib/reek/context/code_context.rb +3 -3
- data/lib/reek/context/method_context.rb +1 -1
- data/lib/reek/context/module_context.rb +4 -0
- data/lib/reek/context/refinement_context.rb +16 -0
- data/lib/reek/context/send_context.rb +7 -1
- data/lib/reek/context_builder.rb +17 -3
- data/lib/reek/documentation_link.rb +3 -5
- data/lib/reek/errors/bad_detector_configuration_key_in_comment_error.rb +2 -2
- data/lib/reek/errors/bad_detector_in_comment_error.rb +2 -2
- data/lib/reek/errors/encoding_error.rb +1 -1
- data/lib/reek/errors/garbage_detector_configuration_in_comment_error.rb +2 -2
- data/lib/reek/errors/incomprehensible_source_error.rb +1 -1
- data/lib/reek/errors/legacy_comment_separator_error.rb +2 -2
- data/lib/reek/errors/syntax_error.rb +1 -1
- data/lib/reek/rake/task.rb +5 -5
- data/lib/reek/report/github_report.rb +55 -0
- data/lib/reek/report/text_report.rb +1 -1
- data/lib/reek/report.rb +7 -5
- data/lib/reek/smell_detectors/base_detector.rb +1 -1
- data/lib/reek/smell_detectors/class_variable.rb +2 -2
- data/lib/reek/smell_detectors/control_parameter_helpers/candidate.rb +6 -6
- data/lib/reek/smell_detectors/control_parameter_helpers/control_parameter_finder.rb +1 -1
- data/lib/reek/smell_detectors/data_clump.rb +1 -1
- data/lib/reek/smell_detectors/duplicate_method_call.rb +5 -5
- data/lib/reek/smell_detectors/instance_variable_assumption.rb +8 -8
- data/lib/reek/smell_detectors/nested_iterators.rb +4 -3
- data/lib/reek/smell_detectors/uncommunicative_module_name.rb +1 -1
- data/lib/reek/smell_detectors/unused_private_method.rb +3 -2
- data/lib/reek/smell_warning.rb +1 -1
- data/lib/reek/source/source_code.rb +11 -5
- data/lib/reek/source/source_locator.rb +1 -3
- data/lib/reek/spec/should_reek_of.rb +11 -9
- data/lib/reek/spec.rb +1 -1
- data/lib/reek/version.rb +2 -2
- data/reek.gemspec +33 -25
- metadata +41 -238
- data/.travis.yml +0 -40
- 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 -37
- data/docs/templates/default/fulldoc/html/css/common.css +0 -1
- 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/lib/reek/configuration/schema.yml +0 -210
- 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 -16
- 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 -293
- 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
- /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
|