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,211 +0,0 @@
|
|
1
|
-
require_relative '../../spec_helper'
|
2
|
-
require_lib 'reek/smell_detectors/duplicate_method_call'
|
3
|
-
|
4
|
-
RSpec.describe Reek::SmellDetectors::DuplicateMethodCall do
|
5
|
-
it 'reports the right values' do
|
6
|
-
src = <<-RUBY
|
7
|
-
class Alfa
|
8
|
-
def bravo(charlie)
|
9
|
-
charlie.delta
|
10
|
-
charlie.delta
|
11
|
-
end
|
12
|
-
end
|
13
|
-
RUBY
|
14
|
-
|
15
|
-
expect(src).to reek_of(:DuplicateMethodCall,
|
16
|
-
lines: [3, 4],
|
17
|
-
context: 'Alfa#bravo',
|
18
|
-
message: "calls 'charlie.delta' 2 times",
|
19
|
-
source: 'string',
|
20
|
-
name: 'charlie.delta',
|
21
|
-
count: 2)
|
22
|
-
end
|
23
|
-
|
24
|
-
it 'does count all occurences' do
|
25
|
-
src = <<-RUBY
|
26
|
-
class Alfa
|
27
|
-
def bravo(charlie)
|
28
|
-
charlie.delta
|
29
|
-
charlie.delta
|
30
|
-
end
|
31
|
-
|
32
|
-
def echo(foxtrot)
|
33
|
-
foxtrot.golf
|
34
|
-
foxtrot.golf
|
35
|
-
end
|
36
|
-
end
|
37
|
-
RUBY
|
38
|
-
|
39
|
-
expect(src).
|
40
|
-
to reek_of(:DuplicateMethodCall, lines: [3, 4], name: 'charlie.delta', count: 2).
|
41
|
-
and reek_of(:DuplicateMethodCall, lines: [8, 9], name: 'foxtrot.golf', count: 2)
|
42
|
-
end
|
43
|
-
|
44
|
-
context 'with repeated method calls' do
|
45
|
-
it 'reports repeated call to lvar' do
|
46
|
-
src = 'def alfa(bravo); bravo.charlie + bravo.charlie; end'
|
47
|
-
expect(src).to reek_of(:DuplicateMethodCall, name: 'bravo.charlie')
|
48
|
-
end
|
49
|
-
|
50
|
-
it 'reports call parameters' do
|
51
|
-
src = 'def alfa; @bravo.charlie(2, 3) + @bravo.charlie(2, 3); end'
|
52
|
-
expect(src).to reek_of(:DuplicateMethodCall, name: '@bravo.charlie(2, 3)')
|
53
|
-
end
|
54
|
-
|
55
|
-
it 'reports nested calls' do
|
56
|
-
src = 'def alfa; @bravo.charlie.delta + @bravo.charlie.delta; end'
|
57
|
-
expect(src).
|
58
|
-
to reek_of(:DuplicateMethodCall, name: '@bravo.charlie').
|
59
|
-
and reek_of(:DuplicateMethodCall, name: '@bravo.charlie.delta')
|
60
|
-
end
|
61
|
-
|
62
|
-
it 'ignores calls to new' do
|
63
|
-
src = 'def alfa; @bravo.new + @bravo.new; end'
|
64
|
-
expect(src).not_to reek_of(:DuplicateMethodCall)
|
65
|
-
end
|
66
|
-
end
|
67
|
-
|
68
|
-
context 'with repeated simple method calls' do
|
69
|
-
it 'reports no smell' do
|
70
|
-
src = <<-RUBY
|
71
|
-
def alfa
|
72
|
-
bravo
|
73
|
-
bravo
|
74
|
-
end
|
75
|
-
RUBY
|
76
|
-
|
77
|
-
expect(src).not_to reek_of(:DuplicateMethodCall)
|
78
|
-
end
|
79
|
-
end
|
80
|
-
|
81
|
-
context 'with repeated simple method calls with blocks' do
|
82
|
-
it 'reports a smell if the blocks are identical' do
|
83
|
-
src = <<-RUBY
|
84
|
-
def alfa
|
85
|
-
bravo { charlie }
|
86
|
-
bravo { charlie }
|
87
|
-
end
|
88
|
-
RUBY
|
89
|
-
|
90
|
-
expect(src).to reek_of(:DuplicateMethodCall)
|
91
|
-
end
|
92
|
-
|
93
|
-
it 'reports no smell if the blocks are different' do
|
94
|
-
src = <<-RUBY
|
95
|
-
def alfa
|
96
|
-
bravo { charlie }
|
97
|
-
bravo { delta }
|
98
|
-
end
|
99
|
-
RUBY
|
100
|
-
|
101
|
-
expect(src).not_to reek_of(:DuplicateMethodCall)
|
102
|
-
end
|
103
|
-
end
|
104
|
-
|
105
|
-
context 'with repeated method calls with receivers with blocks' do
|
106
|
-
it 'reports a smell if the blocks are identical' do
|
107
|
-
src = <<-RUBY
|
108
|
-
def alfa
|
109
|
-
bravo.charlie { delta }
|
110
|
-
bravo.charlie { delta }
|
111
|
-
end
|
112
|
-
RUBY
|
113
|
-
|
114
|
-
expect(src).to reek_of(:DuplicateMethodCall)
|
115
|
-
end
|
116
|
-
|
117
|
-
it 'reports a smell if the blocks are different' do
|
118
|
-
src = <<-RUBY
|
119
|
-
def alfa
|
120
|
-
bravo.charlie { delta }
|
121
|
-
bravo.charlie { echo }
|
122
|
-
end
|
123
|
-
RUBY
|
124
|
-
|
125
|
-
expect(src).to reek_of(:DuplicateMethodCall)
|
126
|
-
end
|
127
|
-
end
|
128
|
-
|
129
|
-
context 'with repeated attribute assignment' do
|
130
|
-
it 'reports repeated assignment' do
|
131
|
-
src = <<-RUBY
|
132
|
-
def alfa(bravo)
|
133
|
-
@charlie[bravo] = true
|
134
|
-
@charlie[bravo] = true
|
135
|
-
end
|
136
|
-
RUBY
|
137
|
-
|
138
|
-
expect(src).to reek_of(:DuplicateMethodCall)
|
139
|
-
end
|
140
|
-
|
141
|
-
it 'does not report multi-assignments' do
|
142
|
-
src = <<-RUBY
|
143
|
-
def alfa
|
144
|
-
bravo, charlie = delta, echo
|
145
|
-
charlie, bravo = delta, echo
|
146
|
-
end
|
147
|
-
RUBY
|
148
|
-
|
149
|
-
expect(src).not_to reek_of(:DuplicateMethodCall)
|
150
|
-
end
|
151
|
-
end
|
152
|
-
|
153
|
-
context 'with non-repeated method calls' do
|
154
|
-
it 'does not report similar calls' do
|
155
|
-
src = 'def alfa(bravo) bravo.charlie == self.charlie end'
|
156
|
-
expect(src).not_to reek_of(:DuplicateMethodCall)
|
157
|
-
end
|
158
|
-
|
159
|
-
it 'respects call parameters' do
|
160
|
-
src = 'def alfa; @bravo.charlie(3) + @bravo.charlie(2) end'
|
161
|
-
expect(src).not_to reek_of(:DuplicateMethodCall)
|
162
|
-
end
|
163
|
-
end
|
164
|
-
|
165
|
-
context 'when allowing up to 3 calls' do
|
166
|
-
let(:config) do
|
167
|
-
{ Reek::SmellDetectors::DuplicateMethodCall::MAX_ALLOWED_CALLS_KEY => 3 }
|
168
|
-
end
|
169
|
-
|
170
|
-
it 'does not report double calls' do
|
171
|
-
src = 'def alfa(bravo); bravo.charlie + bravo.charlie; end'
|
172
|
-
expect(src).not_to reek_of(:DuplicateMethodCall).with_config(config)
|
173
|
-
end
|
174
|
-
|
175
|
-
it 'does not report triple calls' do
|
176
|
-
src = 'def alfa(bravo); bravo.charlie + bravo.charlie + bravo.charlie; end'
|
177
|
-
expect(src).not_to reek_of(:DuplicateMethodCall).with_config(config)
|
178
|
-
end
|
179
|
-
|
180
|
-
it 'reports quadruple calls' do
|
181
|
-
src = <<-RUBY
|
182
|
-
def alfa
|
183
|
-
bravo.charlie + bravo.charlie + bravo.charlie + bravo.charlie
|
184
|
-
end
|
185
|
-
RUBY
|
186
|
-
|
187
|
-
expect(src).to reek_of(:DuplicateMethodCall,
|
188
|
-
count: 4).with_config(config)
|
189
|
-
end
|
190
|
-
end
|
191
|
-
|
192
|
-
context 'when allowing calls to some methods' do
|
193
|
-
it 'does not report calls to some methods' do
|
194
|
-
config = { Reek::SmellDetectors::DuplicateMethodCall::ALLOW_CALLS_KEY => ['@bravo.charlie'] }
|
195
|
-
src = 'def alfa; @bravo.charlie + @bravo.charlie; end'
|
196
|
-
expect(src).not_to reek_of(:DuplicateMethodCall).with_config(config)
|
197
|
-
end
|
198
|
-
|
199
|
-
it 'reports calls to other methods' do
|
200
|
-
config = { Reek::SmellDetectors::DuplicateMethodCall::ALLOW_CALLS_KEY => ['@delta.charlie'] }
|
201
|
-
src = 'def alfa; @bravo.charlie + @bravo.charlie; end'
|
202
|
-
expect(src).to reek_of(:DuplicateMethodCall, name: '@bravo.charlie').with_config(config)
|
203
|
-
end
|
204
|
-
|
205
|
-
it 'does not report calls to methods specifed with a regular expression' do
|
206
|
-
config = { Reek::SmellDetectors::DuplicateMethodCall::ALLOW_CALLS_KEY => [/charlie/] }
|
207
|
-
src = 'def alfa; puts @bravo.charlie; puts @bravo.charlie; end'
|
208
|
-
expect(src).not_to reek_of(:DuplicateMethodCall, name: '@bravo.charlie').with_config(config)
|
209
|
-
end
|
210
|
-
end
|
211
|
-
end
|
@@ -1,295 +0,0 @@
|
|
1
|
-
require_relative '../../spec_helper'
|
2
|
-
require_lib 'reek/smell_detectors/feature_envy'
|
3
|
-
|
4
|
-
RSpec.describe Reek::SmellDetectors::FeatureEnvy do
|
5
|
-
it 'reports the right values' do
|
6
|
-
src = <<-RUBY
|
7
|
-
class Alfa
|
8
|
-
def bravo(charlie)
|
9
|
-
(charlie.delta - charlie.echo) * foxtrot
|
10
|
-
end
|
11
|
-
end
|
12
|
-
RUBY
|
13
|
-
|
14
|
-
expect(src).to reek_of(:FeatureEnvy,
|
15
|
-
lines: [3, 3],
|
16
|
-
context: 'Alfa#bravo',
|
17
|
-
message: "refers to 'charlie' more than self (maybe move it to another class?)",
|
18
|
-
source: 'string',
|
19
|
-
name: 'charlie')
|
20
|
-
end
|
21
|
-
|
22
|
-
it 'does count all occurences' do
|
23
|
-
src = <<-RUBY
|
24
|
-
class Alfa
|
25
|
-
def bravo(charlie)
|
26
|
-
(charlie.delta - charlie.echo) * foxtrot
|
27
|
-
end
|
28
|
-
|
29
|
-
def golf(hotel)
|
30
|
-
(hotel.india + hotel.juliett) * kilo
|
31
|
-
end
|
32
|
-
end
|
33
|
-
RUBY
|
34
|
-
|
35
|
-
expect(src).
|
36
|
-
to reek_of(:FeatureEnvy, lines: [3, 3], name: 'charlie').
|
37
|
-
and reek_of(:FeatureEnvy, lines: [7, 7], name: 'hotel')
|
38
|
-
end
|
39
|
-
|
40
|
-
it 'does not report use of self' do
|
41
|
-
src = 'def alfa; self.to_s + self.to_i; end'
|
42
|
-
expect(src).not_to reek_of(:FeatureEnvy)
|
43
|
-
end
|
44
|
-
|
45
|
-
it 'does not report vcall with no argument' do
|
46
|
-
src = 'def alfa; bravo; end'
|
47
|
-
expect(src).not_to reek_of(:FeatureEnvy)
|
48
|
-
end
|
49
|
-
|
50
|
-
it 'does not report single use' do
|
51
|
-
src = 'def alfa(bravo); bravo.charlie(@delta); end'
|
52
|
-
expect(src).not_to reek_of(:FeatureEnvy)
|
53
|
-
end
|
54
|
-
|
55
|
-
it 'does not report return value' do
|
56
|
-
src = 'def alfa(bravo); bravo.charlie(@delta); bravo; end'
|
57
|
-
expect(src).not_to reek_of(:FeatureEnvy)
|
58
|
-
end
|
59
|
-
|
60
|
-
it 'does ignore global variables' do
|
61
|
-
src = 'def alfa; $bravo.to_a; $bravo[@charlie]; end'
|
62
|
-
expect(src).not_to reek_of(:FeatureEnvy)
|
63
|
-
end
|
64
|
-
|
65
|
-
it 'does not report class methods' do
|
66
|
-
src = 'def alfa; self.class.bravo(self); end'
|
67
|
-
expect(src).not_to reek_of(:FeatureEnvy)
|
68
|
-
end
|
69
|
-
|
70
|
-
it 'does not report single use of an ivar' do
|
71
|
-
src = 'def alfa; @bravo.to_a; end'
|
72
|
-
expect(src).not_to reek_of(:FeatureEnvy)
|
73
|
-
end
|
74
|
-
|
75
|
-
it 'does not report returning an ivar' do
|
76
|
-
src = 'def alfa; @bravo.to_a; @bravo; end'
|
77
|
-
expect(src).not_to reek_of(:FeatureEnvy)
|
78
|
-
end
|
79
|
-
|
80
|
-
it 'does not report ivar usage in a parameter' do
|
81
|
-
src = 'def alfa; @bravo.charlie + delta(@bravo) - echo(@bravo) end'
|
82
|
-
expect(src).not_to reek_of(:FeatureEnvy)
|
83
|
-
end
|
84
|
-
|
85
|
-
it 'does not report single use of an lvar' do
|
86
|
-
src = 'def alfa; bravo = @charlie; bravo.to_a; end'
|
87
|
-
expect(src).not_to reek_of(:FeatureEnvy)
|
88
|
-
end
|
89
|
-
|
90
|
-
it 'does not report returning an lvar' do
|
91
|
-
src = 'def alfa; bravo = @charlie; bravo.to_a; lv end'
|
92
|
-
expect(src).not_to reek_of(:FeatureEnvy)
|
93
|
-
end
|
94
|
-
|
95
|
-
it 'ignores lvar usage in a parameter' do
|
96
|
-
src = 'def alfa; bravo = @item; bravo.charlie + delta(bravo) - echo(bravo); end'
|
97
|
-
expect(src).not_to reek_of(:FeatureEnvy)
|
98
|
-
end
|
99
|
-
|
100
|
-
it 'does not report parameter method called with super' do
|
101
|
-
src = 'def alfa(bravo) super(bravo.to_s); end'
|
102
|
-
expect(src).not_to reek_of(:FeatureEnvy)
|
103
|
-
end
|
104
|
-
|
105
|
-
it 'reports parameter method called with super and elsewhere' do
|
106
|
-
src = 'def alfa(bravo) bravo.charley; super(bravo.to_s); end'
|
107
|
-
expect(src).to reek_of(:FeatureEnvy)
|
108
|
-
end
|
109
|
-
|
110
|
-
it 'ignores multiple ivars' do
|
111
|
-
src = <<-RUBY
|
112
|
-
def func
|
113
|
-
@alfa.charlie
|
114
|
-
@alfa.delta
|
115
|
-
|
116
|
-
@bravo.echo
|
117
|
-
@bravo.foxtrot
|
118
|
-
end
|
119
|
-
RUBY
|
120
|
-
|
121
|
-
expect(src).not_to reek_of(:FeatureEnvy)
|
122
|
-
end
|
123
|
-
|
124
|
-
it 'report highest affinity' do
|
125
|
-
src = <<-RUBY
|
126
|
-
def alfa
|
127
|
-
bravo = @charlie
|
128
|
-
delta = 0
|
129
|
-
delta += bravo.echo
|
130
|
-
delta += bravo.foxtrot
|
131
|
-
delta *= 1.15
|
132
|
-
end
|
133
|
-
RUBY
|
134
|
-
|
135
|
-
expect(src).
|
136
|
-
to reek_of(:FeatureEnvy, name: 'delta').
|
137
|
-
and not_reek_of(:FeatureEnvy, name: 'bravo')
|
138
|
-
end
|
139
|
-
|
140
|
-
it 'reports multiple affinities' do
|
141
|
-
src = <<-RUBY
|
142
|
-
def alfa
|
143
|
-
bravo = @charlie
|
144
|
-
delta = 0
|
145
|
-
delta += bravo.echo
|
146
|
-
delta += bravo.foxtrot
|
147
|
-
end
|
148
|
-
RUBY
|
149
|
-
|
150
|
-
expect(src).
|
151
|
-
to reek_of(:FeatureEnvy, name: 'delta').
|
152
|
-
and reek_of(:FeatureEnvy, name: 'bravo')
|
153
|
-
end
|
154
|
-
|
155
|
-
it 'is not fooled by duplication' do
|
156
|
-
src = <<-RUBY
|
157
|
-
def alfa(bravo)
|
158
|
-
@charlie.delta(bravo.echo)
|
159
|
-
@foxtrot.delta(bravo.echo)
|
160
|
-
end
|
161
|
-
RUBY
|
162
|
-
|
163
|
-
expect(src).to reek_only_of(:DuplicateMethodCall, name: 'bravo.echo')
|
164
|
-
end
|
165
|
-
|
166
|
-
it 'counts local calls' do
|
167
|
-
src = <<-RUBY
|
168
|
-
def alfa(bravo)
|
169
|
-
charlie.delta(bravo.echo)
|
170
|
-
foxtrot.delta(bravo.echo)
|
171
|
-
end
|
172
|
-
RUBY
|
173
|
-
|
174
|
-
expect(src).to reek_only_of(:DuplicateMethodCall, name: 'bravo.echo')
|
175
|
-
end
|
176
|
-
|
177
|
-
it 'reports many calls to lvar' do
|
178
|
-
src = <<-RUBY
|
179
|
-
def alfa
|
180
|
-
bravo = @charlie
|
181
|
-
bravo.delta + bravo.echo
|
182
|
-
end
|
183
|
-
RUBY
|
184
|
-
|
185
|
-
expect(src).to reek_only_of(:FeatureEnvy)
|
186
|
-
end
|
187
|
-
|
188
|
-
it 'counts =~ as a call' do
|
189
|
-
src = <<-RUBY
|
190
|
-
def alfa(bravo)
|
191
|
-
charlie(bravo.delta)
|
192
|
-
bravo =~ /charlie/
|
193
|
-
end
|
194
|
-
RUBY
|
195
|
-
|
196
|
-
expect(src).to reek_of :FeatureEnvy
|
197
|
-
end
|
198
|
-
|
199
|
-
it 'counts += as a call' do
|
200
|
-
src = <<-RUBY
|
201
|
-
def alfa(bravo)
|
202
|
-
charlie(bravo.delta)
|
203
|
-
bravo += 1
|
204
|
-
end
|
205
|
-
RUBY
|
206
|
-
|
207
|
-
expect(src).to reek_of :FeatureEnvy
|
208
|
-
end
|
209
|
-
|
210
|
-
it 'counts ivar assignment as call to self' do
|
211
|
-
src = <<-RUBY
|
212
|
-
def foo
|
213
|
-
bravo = charlie(1, 2)
|
214
|
-
|
215
|
-
@delta = bravo.echo
|
216
|
-
@foxtrot = bravo.golf
|
217
|
-
end
|
218
|
-
RUBY
|
219
|
-
|
220
|
-
expect(src).not_to reek_of :FeatureEnvy
|
221
|
-
end
|
222
|
-
|
223
|
-
it 'counts self references correctly' do
|
224
|
-
src = <<-RUBY
|
225
|
-
def alfa(bravo)
|
226
|
-
bravo.keys.each do |charlie|
|
227
|
-
self[charlie] += 3
|
228
|
-
self[charlie] = 4
|
229
|
-
end
|
230
|
-
self
|
231
|
-
end
|
232
|
-
RUBY
|
233
|
-
|
234
|
-
expect(src).not_to reek_of(:FeatureEnvy)
|
235
|
-
end
|
236
|
-
|
237
|
-
it 'interprets << correctly' do
|
238
|
-
src = <<-RUBY
|
239
|
-
def alfa(bravo)
|
240
|
-
if @charlie
|
241
|
-
bravo.delta(self)
|
242
|
-
else
|
243
|
-
bravo << self
|
244
|
-
end
|
245
|
-
end
|
246
|
-
RUBY
|
247
|
-
|
248
|
-
expect(src).not_to reek_of(:FeatureEnvy)
|
249
|
-
end
|
250
|
-
|
251
|
-
it 'does not report on class methods defined by opening the metaclass' do
|
252
|
-
src = <<-RUBY
|
253
|
-
class Alfa
|
254
|
-
class << self
|
255
|
-
def bravo(charlie)
|
256
|
-
delta = new(charlie)
|
257
|
-
delta.echo
|
258
|
-
delta.echo
|
259
|
-
end
|
260
|
-
end
|
261
|
-
end
|
262
|
-
RUBY
|
263
|
-
|
264
|
-
expect(src).not_to reek_of(:FeatureEnvy)
|
265
|
-
end
|
266
|
-
|
267
|
-
it 'does not report on class methods defined with an explicit receiver' do
|
268
|
-
src = <<-RUBY
|
269
|
-
class Alfa
|
270
|
-
def self.bravo(charlie)
|
271
|
-
delta = new(charlie)
|
272
|
-
delta.echo
|
273
|
-
delta.echo
|
274
|
-
end
|
275
|
-
end
|
276
|
-
RUBY
|
277
|
-
|
278
|
-
expect(src).not_to reek_of(:FeatureEnvy)
|
279
|
-
end
|
280
|
-
|
281
|
-
it 'does not report module functions' do
|
282
|
-
src = <<-RUBY
|
283
|
-
module Alfa
|
284
|
-
module_function
|
285
|
-
def bravo(charlie)
|
286
|
-
echo = delta(charlie)
|
287
|
-
echo.foxtrot
|
288
|
-
echo.foxtrot
|
289
|
-
end
|
290
|
-
end
|
291
|
-
RUBY
|
292
|
-
|
293
|
-
expect(src).not_to reek_of(:FeatureEnvy)
|
294
|
-
end
|
295
|
-
end
|