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,309 +0,0 @@
|
|
1
|
-
require_relative '../../spec_helper'
|
2
|
-
require_lib 'reek/smell_detectors/utility_function'
|
3
|
-
|
4
|
-
RSpec.describe Reek::SmellDetectors::UtilityFunction do
|
5
|
-
it 'reports the right values' do
|
6
|
-
src = <<-RUBY
|
7
|
-
def alfa(bravo)
|
8
|
-
bravo.charlie.delta
|
9
|
-
end
|
10
|
-
RUBY
|
11
|
-
|
12
|
-
expect(src).to reek_of(:UtilityFunction,
|
13
|
-
lines: [1],
|
14
|
-
context: 'alfa',
|
15
|
-
message: "doesn't depend on instance state (maybe move it to another class?)",
|
16
|
-
source: 'string')
|
17
|
-
end
|
18
|
-
|
19
|
-
it 'counts a local call in a param initializer' do
|
20
|
-
src = 'def alfa(bravo = charlie) bravo.to_s end'
|
21
|
-
expect(src).not_to reek_of(:UtilityFunction)
|
22
|
-
end
|
23
|
-
|
24
|
-
it 'counts usages of self' do
|
25
|
-
src = 'def alfa(bravo); alfa.bravo(self); end'
|
26
|
-
expect(src).not_to reek_of(:UtilityFunction)
|
27
|
-
end
|
28
|
-
|
29
|
-
it 'counts self reference within a dstr' do
|
30
|
-
src = 'def alfa(bravo); "#{self} #{bravo}"; end'
|
31
|
-
expect(src).not_to reek_of(:UtilityFunction)
|
32
|
-
end
|
33
|
-
|
34
|
-
it 'counts calls to self within a dstr' do
|
35
|
-
src = 'def alfa(bravo); "#{self.gsub(/charlie/, /delta/)}"; end'
|
36
|
-
expect(src).
|
37
|
-
not_to reek_of(:UtilityFunction)
|
38
|
-
end
|
39
|
-
|
40
|
-
it 'does not report a method that calls super' do
|
41
|
-
src = 'def alfa(bravo) super; bravo.to_s; end'
|
42
|
-
expect(src).not_to reek_of(:UtilityFunction)
|
43
|
-
end
|
44
|
-
|
45
|
-
it 'does not report a method that calls super with arguments' do
|
46
|
-
src = 'def alfa(bravo) super(bravo); bravo.to_s; end'
|
47
|
-
expect(src).not_to reek_of(:UtilityFunction)
|
48
|
-
end
|
49
|
-
|
50
|
-
it 'recognises a deep call' do
|
51
|
-
src = <<-RUBY
|
52
|
-
class Alfa
|
53
|
-
def bravo(charlie)
|
54
|
-
charlie.each { |delta| foxtrot(delta) }
|
55
|
-
end
|
56
|
-
|
57
|
-
def foxtrot(golf)
|
58
|
-
@india << golf
|
59
|
-
end
|
60
|
-
end
|
61
|
-
RUBY
|
62
|
-
|
63
|
-
expect(src).not_to reek_of(:UtilityFunction)
|
64
|
-
end
|
65
|
-
|
66
|
-
it 'does not report empty method' do
|
67
|
-
src = 'def alfa(bravo); end'
|
68
|
-
expect(src).not_to reek_of(:UtilityFunction)
|
69
|
-
end
|
70
|
-
|
71
|
-
it 'does not report literal' do
|
72
|
-
src = 'def alfa; 3; end'
|
73
|
-
expect(src).not_to reek_of(:UtilityFunction)
|
74
|
-
end
|
75
|
-
|
76
|
-
it 'does not report instance variable reference' do
|
77
|
-
src = 'def alfa; @bravo; end'
|
78
|
-
expect(src).not_to reek_of(:UtilityFunction)
|
79
|
-
end
|
80
|
-
|
81
|
-
it 'does not report vcall' do
|
82
|
-
src = 'def alfa; bravo; end'
|
83
|
-
expect(src).not_to reek_of(:UtilityFunction)
|
84
|
-
end
|
85
|
-
|
86
|
-
it 'does not report references to self' do
|
87
|
-
src = 'def alfa; self; end'
|
88
|
-
expect(src).not_to reek_of(:UtilityFunction)
|
89
|
-
end
|
90
|
-
|
91
|
-
it 'recognises an ivar reference within a block' do
|
92
|
-
src = 'def alfa(bravo) bravo.each { @charlie = 3} end'
|
93
|
-
expect(src).not_to reek_of(:UtilityFunction)
|
94
|
-
end
|
95
|
-
|
96
|
-
it 'reports a call to a constant' do
|
97
|
-
src = 'def simple(arga) FIELDS[arga] end'
|
98
|
-
expect(src).to reek_of(:UtilityFunction, context: 'simple')
|
99
|
-
end
|
100
|
-
|
101
|
-
context 'when examining singleton methods' do
|
102
|
-
['class', 'module'].each do |scope|
|
103
|
-
it "does not report for #{scope} with `class << self` notation" do
|
104
|
-
src = "#{scope} Alfa; class << self; def bravo(charlie) charlie.to_s; end; end; end"
|
105
|
-
expect(src).not_to reek_of(:UtilityFunction)
|
106
|
-
end
|
107
|
-
|
108
|
-
it "does not report for #{scope} with `self.` notation" do
|
109
|
-
src = "#{scope} Alfa; def self.bravo(charlie) charlie.to_s; end; end"
|
110
|
-
expect(src).not_to reek_of(:UtilityFunction)
|
111
|
-
end
|
112
|
-
end
|
113
|
-
|
114
|
-
context 'when defined by using `module_function`' do
|
115
|
-
it 'does not report UtilityFunction also when using multiple arguments' do
|
116
|
-
src = <<-RUBY
|
117
|
-
class Alfa
|
118
|
-
def bravo(charlie) charlie.to_s; end
|
119
|
-
def delta(echo) echo.to_s; end
|
120
|
-
module_function :bravo, :delta
|
121
|
-
end
|
122
|
-
RUBY
|
123
|
-
|
124
|
-
expect(src).not_to reek_of(:UtilityFunction)
|
125
|
-
end
|
126
|
-
|
127
|
-
it 'does not report module functions defined by earlier modifier' do
|
128
|
-
src = <<-RUBY
|
129
|
-
module Alfa
|
130
|
-
module_function
|
131
|
-
def bravo(charlie) charlie.to_s; end
|
132
|
-
end
|
133
|
-
RUBY
|
134
|
-
|
135
|
-
expect(src).not_to reek_of(:UtilityFunction)
|
136
|
-
end
|
137
|
-
|
138
|
-
it 'reports functions preceded by canceled modifier' do
|
139
|
-
src = <<-RUBY
|
140
|
-
module Alfa
|
141
|
-
module_function
|
142
|
-
public
|
143
|
-
def bravo(charlie) charlie.to_s; end
|
144
|
-
end
|
145
|
-
RUBY
|
146
|
-
|
147
|
-
expect(src).to reek_of(:UtilityFunction, context: 'Alfa#bravo')
|
148
|
-
end
|
149
|
-
|
150
|
-
it 'does not report when module_function is called in separate scope' do
|
151
|
-
src = <<-RUBY
|
152
|
-
class Alfa
|
153
|
-
def bravo(charlie) charlie.to_s; end
|
154
|
-
begin
|
155
|
-
module_function :bravo
|
156
|
-
end
|
157
|
-
end
|
158
|
-
RUBY
|
159
|
-
expect(src).not_to reek_of(:UtilityFunction)
|
160
|
-
end
|
161
|
-
end
|
162
|
-
end
|
163
|
-
|
164
|
-
context 'when examining refinements' do
|
165
|
-
it 'reports on the refined class' do
|
166
|
-
src = <<-RUBY
|
167
|
-
module Alfa
|
168
|
-
refine Bravo do
|
169
|
-
def bravo(charlie)
|
170
|
-
charlie.delta.echo
|
171
|
-
end
|
172
|
-
end
|
173
|
-
end
|
174
|
-
RUBY
|
175
|
-
|
176
|
-
expect(src).to reek_of(:UtilityFunction, context: 'Bravo#bravo')
|
177
|
-
end
|
178
|
-
end
|
179
|
-
|
180
|
-
describe 'method visibility' do
|
181
|
-
it 'reports private methods' do
|
182
|
-
src = <<-RUBY
|
183
|
-
class Alfa
|
184
|
-
private
|
185
|
-
def bravo(charlie)
|
186
|
-
charlie.delta.echo
|
187
|
-
end
|
188
|
-
end
|
189
|
-
RUBY
|
190
|
-
|
191
|
-
expect(src).to reek_of(:UtilityFunction, context: 'Alfa#bravo')
|
192
|
-
end
|
193
|
-
|
194
|
-
it 'reports protected methods' do
|
195
|
-
src = <<-RUBY
|
196
|
-
class Alfa
|
197
|
-
protected
|
198
|
-
def bravo(charlie)
|
199
|
-
charlie.delta.echo
|
200
|
-
end
|
201
|
-
end
|
202
|
-
RUBY
|
203
|
-
|
204
|
-
expect(src).to reek_of(:UtilityFunction, context: 'Alfa#bravo')
|
205
|
-
end
|
206
|
-
end
|
207
|
-
|
208
|
-
describe 'disabling UtilityFunction via configuration for non-public methods' do
|
209
|
-
let(:config) do
|
210
|
-
{ Reek::SmellDetectors::UtilityFunction::PUBLIC_METHODS_ONLY_KEY => true }
|
211
|
-
end
|
212
|
-
|
213
|
-
context 'when examining public methods' do
|
214
|
-
it 'still reports UtilityFunction' do
|
215
|
-
src = <<-RUBY
|
216
|
-
class Alfa
|
217
|
-
def bravo(charlie)
|
218
|
-
charlie.delta.echo
|
219
|
-
end
|
220
|
-
end
|
221
|
-
RUBY
|
222
|
-
|
223
|
-
expect(src).to reek_of(:UtilityFunction, context: 'Alfa#bravo').with_config(config)
|
224
|
-
end
|
225
|
-
end
|
226
|
-
|
227
|
-
context 'when examining private methods' do
|
228
|
-
it 'does not report UtilityFunction' do
|
229
|
-
src = <<-RUBY
|
230
|
-
class Alfa
|
231
|
-
private
|
232
|
-
def bravo(charlie)
|
233
|
-
charlie.delta.echo
|
234
|
-
end
|
235
|
-
end
|
236
|
-
RUBY
|
237
|
-
|
238
|
-
expect(src).not_to reek_of(:UtilityFunction).with_config(config)
|
239
|
-
end
|
240
|
-
|
241
|
-
it 'does not report UtilityFunction when private is used as a def modifier' do
|
242
|
-
src = <<-RUBY
|
243
|
-
class Alfa
|
244
|
-
private def bravo(charlie)
|
245
|
-
charlie.delta.echo
|
246
|
-
end
|
247
|
-
end
|
248
|
-
RUBY
|
249
|
-
|
250
|
-
expect(src).not_to reek_of(:UtilityFunction).with_config(config)
|
251
|
-
end
|
252
|
-
end
|
253
|
-
|
254
|
-
context 'when examining protected methods' do
|
255
|
-
it 'does not report UtilityFunction' do
|
256
|
-
src = <<-RUBY
|
257
|
-
class Alfa
|
258
|
-
protected
|
259
|
-
def bravo(charlie)
|
260
|
-
charlie.delta.echo
|
261
|
-
end
|
262
|
-
end
|
263
|
-
RUBY
|
264
|
-
|
265
|
-
expect(src).not_to reek_of(:UtilityFunction).with_config(config)
|
266
|
-
end
|
267
|
-
|
268
|
-
it 'does not report UtilityFunction when protected is used as a def modifier' do
|
269
|
-
src = <<-RUBY
|
270
|
-
class Alfa
|
271
|
-
protected def bravo(charlie)
|
272
|
-
charlie.delta.echo
|
273
|
-
end
|
274
|
-
end
|
275
|
-
RUBY
|
276
|
-
|
277
|
-
expect(src).not_to reek_of(:UtilityFunction).with_config(config)
|
278
|
-
end
|
279
|
-
end
|
280
|
-
end
|
281
|
-
|
282
|
-
describe 'disabling with a comment' do
|
283
|
-
it 'disables the method following the comment' do
|
284
|
-
src = <<-RUBY
|
285
|
-
class Alfa
|
286
|
-
# :reek:UtilityFunction
|
287
|
-
def bravo(charlie)
|
288
|
-
charlie.delta.echo
|
289
|
-
end
|
290
|
-
end
|
291
|
-
RUBY
|
292
|
-
|
293
|
-
expect(src).not_to reek_of(:UtilityFunction)
|
294
|
-
end
|
295
|
-
|
296
|
-
it 'disables a method when it has a visibility modifier' do
|
297
|
-
src = <<-RUBY
|
298
|
-
class Alfa
|
299
|
-
# :reek:UtilityFunction
|
300
|
-
private def bravo(charlie)
|
301
|
-
charlie.delta.echo
|
302
|
-
end
|
303
|
-
end
|
304
|
-
RUBY
|
305
|
-
|
306
|
-
expect(src).not_to reek_of(:UtilityFunction)
|
307
|
-
end
|
308
|
-
end
|
309
|
-
end
|
@@ -1,137 +0,0 @@
|
|
1
|
-
require_relative '../spec_helper'
|
2
|
-
require_lib 'reek/smell_warning'
|
3
|
-
|
4
|
-
RSpec.describe Reek::SmellWarning do
|
5
|
-
let(:uncommunicative_name_detector) { build(:smell_detector, smell_type: 'UncommunicativeVariableName') }
|
6
|
-
|
7
|
-
describe 'sort order' do
|
8
|
-
shared_examples_for 'first sorts ahead of second' do
|
9
|
-
it 'hash differently' do
|
10
|
-
expect(first.hash).not_to eq(second.hash)
|
11
|
-
end
|
12
|
-
|
13
|
-
it 'are not equal' do
|
14
|
-
expect(first).not_to eq(second)
|
15
|
-
end
|
16
|
-
|
17
|
-
it 'sort correctly' do
|
18
|
-
expect(first <=> second).to be < 0
|
19
|
-
end
|
20
|
-
|
21
|
-
it 'does not match using eql?' do
|
22
|
-
expect(first).not_to eql(second)
|
23
|
-
end
|
24
|
-
end
|
25
|
-
|
26
|
-
context 'when smells differ only by detector' do
|
27
|
-
let(:first) { build_smell_warning(smell_type: 'DuplicateMethodCall') }
|
28
|
-
let(:second) { build_smell_warning(smell_type: 'FeatureEnvy') }
|
29
|
-
|
30
|
-
it_behaves_like 'first sorts ahead of second'
|
31
|
-
end
|
32
|
-
|
33
|
-
context 'when smells differ only by lines' do
|
34
|
-
let(:first) { build_smell_warning(smell_type: 'FeatureEnvy', lines: [2]) }
|
35
|
-
let(:second) { build_smell_warning(smell_type: 'FeatureEnvy', lines: [3]) }
|
36
|
-
|
37
|
-
it_behaves_like 'first sorts ahead of second'
|
38
|
-
end
|
39
|
-
|
40
|
-
context 'when smells differ only by context' do
|
41
|
-
let(:first) { build_smell_warning(smell_type: 'DuplicateMethodCall', context: 'first') }
|
42
|
-
let(:second) do
|
43
|
-
build_smell_warning(smell_type: 'DuplicateMethodCall', context: 'second')
|
44
|
-
end
|
45
|
-
|
46
|
-
it_behaves_like 'first sorts ahead of second'
|
47
|
-
end
|
48
|
-
|
49
|
-
context 'when smells differ only by message' do
|
50
|
-
let(:first) do
|
51
|
-
build_smell_warning(smell_type: 'DuplicateMethodCall',
|
52
|
-
context: 'ctx', message: 'first message')
|
53
|
-
end
|
54
|
-
let(:second) do
|
55
|
-
build_smell_warning(smell_type: 'DuplicateMethodCall',
|
56
|
-
context: 'ctx', message: 'second message')
|
57
|
-
end
|
58
|
-
|
59
|
-
it_behaves_like 'first sorts ahead of second'
|
60
|
-
end
|
61
|
-
|
62
|
-
context 'when smells differ by name and message' do
|
63
|
-
let(:first) do
|
64
|
-
build_smell_warning(smell_type: 'FeatureEnvy', message: 'second message')
|
65
|
-
end
|
66
|
-
let(:second) do
|
67
|
-
build_smell_warning(smell_type: 'UtilityFunction', message: 'first message')
|
68
|
-
end
|
69
|
-
|
70
|
-
it_behaves_like 'first sorts ahead of second'
|
71
|
-
end
|
72
|
-
|
73
|
-
context 'when smells differ everywhere' do
|
74
|
-
let(:first) do
|
75
|
-
build_smell_warning(smell_type: 'DuplicateMethodCall',
|
76
|
-
context: 'Dirty#a',
|
77
|
-
message: 'calls @s.title twice')
|
78
|
-
end
|
79
|
-
|
80
|
-
let(:second) do
|
81
|
-
build_smell_warning(smell_type: 'UncommunicativeVariableName',
|
82
|
-
context: 'Dirty',
|
83
|
-
message: "has the variable name '@s'")
|
84
|
-
end
|
85
|
-
|
86
|
-
it_behaves_like 'first sorts ahead of second'
|
87
|
-
end
|
88
|
-
end
|
89
|
-
|
90
|
-
describe '#yaml_hash' do
|
91
|
-
let(:context_name) { 'Module::Class#method/block' }
|
92
|
-
let(:lines) { [24, 513] }
|
93
|
-
let(:message) { 'test message' }
|
94
|
-
let(:parameters) { { 'one' => 34, 'two' => 'second' } }
|
95
|
-
let(:smell_type) { 'FeatureEnvy' }
|
96
|
-
let(:source) { 'a/ruby/source/file.rb' }
|
97
|
-
|
98
|
-
let(:yaml) do
|
99
|
-
warning = described_class.new(smell_type, source: source,
|
100
|
-
context: context_name,
|
101
|
-
lines: lines,
|
102
|
-
message: message,
|
103
|
-
parameters: parameters)
|
104
|
-
warning.yaml_hash
|
105
|
-
end
|
106
|
-
|
107
|
-
it 'includes the smell type' do
|
108
|
-
expect(yaml['smell_type']).to eq 'FeatureEnvy'
|
109
|
-
end
|
110
|
-
|
111
|
-
it 'includes the context' do
|
112
|
-
expect(yaml['context']).to eq context_name
|
113
|
-
end
|
114
|
-
|
115
|
-
it 'includes the message' do
|
116
|
-
expect(yaml['message']).to eq message
|
117
|
-
end
|
118
|
-
|
119
|
-
it 'includes the line numbers' do
|
120
|
-
expect(yaml['lines']).to match_array lines
|
121
|
-
end
|
122
|
-
|
123
|
-
it 'includes the source' do
|
124
|
-
expect(yaml['source']).to eq source
|
125
|
-
end
|
126
|
-
|
127
|
-
it 'includes the documentation link' do
|
128
|
-
expect(yaml['documentation_link']).to eq Reek::DocumentationLink.build('FeatureEnvy')
|
129
|
-
end
|
130
|
-
|
131
|
-
it 'includes the parameters' do
|
132
|
-
parameters.each do |key, value|
|
133
|
-
expect(yaml[key]).to eq value
|
134
|
-
end
|
135
|
-
end
|
136
|
-
end
|
137
|
-
end
|
@@ -1,79 +0,0 @@
|
|
1
|
-
require_relative '../../spec_helper'
|
2
|
-
require 'stringio'
|
3
|
-
require_lib 'reek/source/source_code'
|
4
|
-
|
5
|
-
RSpec.describe Reek::Source::SourceCode do
|
6
|
-
describe '#syntax_tree' do
|
7
|
-
it 'associates comments with the AST' do
|
8
|
-
source = "# this is\n# a comment\ndef foo; end"
|
9
|
-
source_code = described_class.new(source: source, origin: '(string)')
|
10
|
-
result = source_code.syntax_tree
|
11
|
-
expect(result.leading_comment).to eq "# this is\n# a comment"
|
12
|
-
end
|
13
|
-
|
14
|
-
it 'cleanly processes empty source' do
|
15
|
-
source_code = described_class.new(source: '', origin: '(string)')
|
16
|
-
result = source_code.syntax_tree
|
17
|
-
expect(result.type).to eq :empty
|
18
|
-
end
|
19
|
-
|
20
|
-
it 'cleanly processes empty source with comments' do
|
21
|
-
source = "# this is\n# a comment\n"
|
22
|
-
source_code = described_class.new(source: source, origin: '(string)')
|
23
|
-
result = source_code.syntax_tree
|
24
|
-
expect(result.type).to eq :empty
|
25
|
-
end
|
26
|
-
|
27
|
-
it 'does not crash with sequences incompatible with UTF-8' do
|
28
|
-
source = '"\xFF"'
|
29
|
-
source_code = described_class.new(source: source, origin: '(string)')
|
30
|
-
result = source_code.syntax_tree
|
31
|
-
expect(result.children.first).to eq "\xFF"
|
32
|
-
end
|
33
|
-
|
34
|
-
it 'returns a :lambda node for lambda expressions' do
|
35
|
-
source = '->() { }'
|
36
|
-
source_code = described_class.new(source: source, origin: '(string)')
|
37
|
-
result = source_code.syntax_tree
|
38
|
-
expect(result.children.first.type).to eq :lambda
|
39
|
-
end
|
40
|
-
|
41
|
-
context 'when the parser fails with a Parser::SyntaxError' do
|
42
|
-
let(:src) { described_class.new(source: code) }
|
43
|
-
let(:code) { '== Invalid Syntax ==' }
|
44
|
-
|
45
|
-
it 'raises the error' do
|
46
|
-
expect { src.syntax_tree }.to raise_error Parser::SyntaxError
|
47
|
-
end
|
48
|
-
end
|
49
|
-
|
50
|
-
context 'when the parser fails with a generic error' do
|
51
|
-
let(:code) { '' }
|
52
|
-
let(:parser) { instance_double('Parser::Ruby25') }
|
53
|
-
let(:src) { described_class.new(source: code, parser: parser) }
|
54
|
-
let(:error_class) { RuntimeError }
|
55
|
-
let(:error_message) { 'An error' }
|
56
|
-
|
57
|
-
before do
|
58
|
-
allow(parser).to receive(:parse_with_comments).and_raise(error_class, error_message)
|
59
|
-
end
|
60
|
-
|
61
|
-
it 'raises the error' do
|
62
|
-
expect { src.syntax_tree }.to raise_error error_class, error_message
|
63
|
-
end
|
64
|
-
end
|
65
|
-
|
66
|
-
if RUBY_VERSION >= '2.7'
|
67
|
-
context 'with ruby 2.7 syntax' do
|
68
|
-
context 'with forward_args (`...`)' do
|
69
|
-
let(:source_code) { described_class.new(source: 'def alpha(...) bravo(...); end') }
|
70
|
-
|
71
|
-
it 'returns a :forward_args node' do
|
72
|
-
result = source_code.syntax_tree
|
73
|
-
expect(result.children[1].type).to eq(:forward_args)
|
74
|
-
end
|
75
|
-
end
|
76
|
-
end
|
77
|
-
end
|
78
|
-
end
|
79
|
-
end
|