reek 2.2.1 → 3.0.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/.rubocop.yml +1 -1
- data/.travis.yml +9 -4
- data/CHANGELOG +8 -0
- data/Gemfile +6 -4
- data/README.md +6 -0
- data/docs/API.md +51 -22
- data/docs/Configuration-Files.md +12 -1
- data/docs/Feature-Envy.md +30 -10
- data/docs/How-reek-works-internally.md +109 -39
- data/docs/RSpec-matchers.md +26 -22
- data/docs/Reek-Driven-Development.md +0 -8
- data/docs/Utility-Function.md +8 -10
- data/features/{ruby_api/api.feature → command_line_interface/basic_usage.feature} +2 -2
- data/features/programmatic_access.feature +21 -2
- data/features/samples.feature +3 -1
- data/lib/reek.rb +2 -2
- data/lib/reek/{core → ast}/ast_node_class_map.rb +8 -8
- data/lib/reek/{sexp/sexp_node.rb → ast/node.rb} +47 -6
- data/lib/reek/{core → ast}/object_refs.rb +2 -1
- data/lib/reek/{core → ast}/reference_collector.rb +2 -1
- data/lib/reek/{sexp → ast}/sexp_extensions.rb +10 -5
- data/lib/reek/{sexp → ast}/sexp_formatter.rb +7 -5
- data/lib/reek/cli/application.rb +1 -0
- data/lib/reek/cli/command.rb +1 -0
- data/lib/reek/cli/input.rb +4 -1
- data/lib/reek/cli/option_interpreter.rb +6 -4
- data/lib/reek/cli/options.rb +2 -1
- data/lib/reek/cli/reek_command.rb +3 -2
- data/lib/reek/cli/silencer.rb +1 -0
- data/lib/reek/{core → cli}/warning_collector.rb +2 -1
- data/lib/reek/code_comment.rb +36 -0
- data/lib/reek/configuration/app_configuration.rb +17 -2
- data/lib/reek/configuration/configuration_file_finder.rb +1 -0
- data/lib/reek/{core → context}/code_context.rb +7 -5
- data/lib/reek/{core → context}/method_context.rb +5 -3
- data/lib/reek/{core → context}/module_context.rb +8 -3
- data/lib/reek/{core/stop_context.rb → context/root_context.rb} +4 -2
- data/lib/reek/{core → context}/singleton_method_context.rb +2 -1
- data/lib/reek/examiner.rb +82 -0
- data/lib/reek/report/formatter.rb +70 -0
- data/lib/reek/report/heading_formatter.rb +45 -0
- data/lib/reek/report/location_formatter.rb +35 -0
- data/lib/reek/report/report.rb +198 -0
- data/lib/reek/smells.rb +24 -13
- data/lib/reek/smells/attribute.rb +6 -4
- data/lib/reek/smells/boolean_parameter.rb +3 -1
- data/lib/reek/smells/class_variable.rb +3 -1
- data/lib/reek/smells/control_parameter.rb +3 -1
- data/lib/reek/smells/data_clump.rb +3 -1
- data/lib/reek/smells/duplicate_method_call.rb +3 -1
- data/lib/reek/smells/feature_envy.rb +3 -1
- data/lib/reek/smells/irresponsible_module.rb +12 -7
- data/lib/reek/smells/long_parameter_list.rb +5 -3
- data/lib/reek/smells/long_yield_list.rb +3 -1
- data/lib/reek/smells/module_initialize.rb +3 -1
- data/lib/reek/smells/nested_iterators.rb +3 -1
- data/lib/reek/smells/nil_check.rb +3 -1
- data/lib/reek/smells/prima_donna_method.rb +3 -1
- data/lib/reek/smells/repeated_conditional.rb +5 -3
- data/lib/reek/{core → smells}/smell_configuration.rb +3 -1
- data/lib/reek/smells/smell_detector.rb +9 -7
- data/lib/reek/{core → smells}/smell_repository.rb +3 -2
- data/lib/reek/smells/smell_warning.rb +6 -4
- data/lib/reek/smells/too_many_instance_variables.rb +3 -1
- data/lib/reek/smells/too_many_methods.rb +3 -1
- data/lib/reek/smells/too_many_statements.rb +3 -1
- data/lib/reek/smells/uncommunicative_method_name.rb +3 -1
- data/lib/reek/smells/uncommunicative_module_name.rb +3 -1
- data/lib/reek/smells/uncommunicative_parameter_name.rb +3 -1
- data/lib/reek/smells/uncommunicative_variable_name.rb +3 -1
- data/lib/reek/smells/unused_parameters.rb +3 -1
- data/lib/reek/smells/utility_function.rb +5 -2
- data/lib/reek/source/source_code.rb +40 -9
- data/lib/reek/source/source_locator.rb +30 -12
- data/lib/reek/spec/should_reek.rb +5 -4
- data/lib/reek/spec/should_reek_of.rb +3 -2
- data/lib/reek/spec/should_reek_only_of.rb +5 -4
- data/lib/reek/tree_dresser.rb +32 -0
- data/lib/reek/tree_walker.rb +182 -0
- data/lib/reek/version.rb +1 -1
- data/reek.gemspec +3 -3
- data/spec/factories/factories.rb +2 -0
- data/spec/reek/{sexp/sexp_node_spec.rb → ast/node_spec.rb} +2 -2
- data/spec/reek/{core → ast}/object_refs_spec.rb +3 -3
- data/spec/reek/{core → ast}/reference_collector_spec.rb +2 -2
- data/spec/reek/{sexp → ast}/sexp_extensions_spec.rb +6 -16
- data/spec/reek/{sexp → ast}/sexp_formatter_spec.rb +2 -2
- data/spec/reek/cli/option_interpreter_spec.rb +2 -1
- data/spec/reek/{core → cli}/warning_collector_spec.rb +3 -3
- data/spec/reek/{core/code_comment_spec.rb → code_comment_spec.rb} +3 -3
- data/spec/reek/configuration/app_configuration_spec.rb +31 -18
- data/spec/reek/{core → context}/code_context_spec.rb +14 -15
- data/spec/reek/{core → context}/method_context_spec.rb +8 -8
- data/spec/reek/{core → context}/module_context_spec.rb +4 -4
- data/spec/reek/context/root_context_spec.rb +14 -0
- data/spec/reek/{core → context}/singleton_method_context_spec.rb +4 -4
- data/spec/reek/{core/examiner_spec.rb → examiner_spec.rb} +3 -42
- data/spec/reek/{cli → report}/html_report_spec.rb +5 -5
- data/spec/reek/report/json_report_spec.rb +20 -0
- data/spec/reek/{cli → report}/text_report_spec.rb +14 -14
- data/spec/reek/{cli → report}/xml_report_spec.rb +7 -7
- data/spec/reek/report/yaml_report_spec.rb +20 -0
- data/spec/reek/smells/attribute_spec.rb +2 -1
- data/spec/reek/smells/boolean_parameter_spec.rb +1 -1
- data/spec/reek/smells/class_variable_spec.rb +5 -5
- data/spec/reek/smells/control_parameter_spec.rb +1 -1
- data/spec/reek/smells/data_clump_spec.rb +1 -1
- data/spec/reek/smells/duplicate_method_call_spec.rb +3 -3
- data/spec/reek/smells/feature_envy_spec.rb +1 -1
- data/spec/reek/smells/irresponsible_module_spec.rb +24 -28
- data/spec/reek/smells/long_parameter_list_spec.rb +2 -2
- data/spec/reek/smells/long_yield_list_spec.rb +2 -2
- data/spec/reek/smells/nested_iterators_spec.rb +1 -1
- data/spec/reek/smells/nil_check_spec.rb +2 -2
- data/spec/reek/smells/prima_donna_method_spec.rb +3 -3
- data/spec/reek/smells/repeated_conditional_spec.rb +6 -6
- data/spec/reek/{core → smells}/smell_configuration_spec.rb +4 -4
- data/spec/reek/smells/smell_detector_shared.rb +2 -2
- data/spec/reek/{core → smells}/smell_repository_spec.rb +5 -4
- data/spec/reek/smells/too_many_instance_variables_spec.rb +1 -1
- data/spec/reek/smells/too_many_methods_spec.rb +4 -4
- data/spec/reek/smells/too_many_statements_spec.rb +2 -2
- data/spec/reek/smells/uncommunicative_method_name_spec.rb +1 -1
- data/spec/reek/smells/uncommunicative_module_name_spec.rb +4 -4
- data/spec/reek/smells/uncommunicative_parameter_name_spec.rb +2 -2
- data/spec/reek/smells/uncommunicative_variable_name_spec.rb +3 -3
- data/spec/reek/smells/utility_function_spec.rb +23 -1
- data/spec/reek/source/source_code_spec.rb +1 -1
- data/spec/reek/source/source_locator_spec.rb +30 -0
- data/spec/reek/spec/should_reek_of_spec.rb +0 -17
- data/spec/reek/spec/should_reek_spec.rb +0 -25
- data/spec/reek/tree_dresser_spec.rb +16 -0
- data/spec/reek/{core/tree_walker_spec.rb → tree_walker_spec.rb} +5 -5
- data/spec/samples/{simple_configuration.reek → configuration/simple_configuration.reek} +0 -0
- data/spec/samples/configuration/with_excluded_paths.reek +4 -0
- data/spec/samples/source_with_exclude_paths/ignore_me/uncommunicative_method_name.rb +5 -0
- data/spec/samples/source_with_exclude_paths/nested/ignore_me_as_well/irresponsible_module.rb +2 -0
- data/spec/samples/source_with_exclude_paths/nested/uncommunicative_parameter_name.rb +6 -0
- data/spec/spec_helper.rb +6 -7
- data/tasks/develop.rake +2 -2
- metadata +71 -69
- data/lib/reek/cli/report/formatter.rb +0 -69
- data/lib/reek/cli/report/heading_formatter.rb +0 -45
- data/lib/reek/cli/report/location_formatter.rb +0 -34
- data/lib/reek/cli/report/report.rb +0 -191
- data/lib/reek/core/ast_node.rb +0 -38
- data/lib/reek/core/code_comment.rb +0 -37
- data/lib/reek/core/examiner.rb +0 -85
- data/lib/reek/core/tree_dresser.rb +0 -24
- data/lib/reek/core/tree_walker.rb +0 -180
- data/lib/reek/source/source_repository.rb +0 -43
- data/spec/reek/cli/json_report_spec.rb +0 -20
- data/spec/reek/cli/yaml_report_spec.rb +0 -20
- data/spec/reek/core/object_source_spec.rb +0 -18
- data/spec/reek/core/stop_context_spec.rb +0 -14
- data/spec/reek/core/tree_dresser_spec.rb +0 -16
@@ -20,7 +20,7 @@ RSpec.describe Reek::Smells::TooManyMethods do
|
|
20
20
|
end
|
21
21
|
EOS
|
22
22
|
syntax_tree = Reek::Source::SourceCode.from(src).syntax_tree
|
23
|
-
ctx = Reek::
|
23
|
+
ctx = Reek::Context::ModuleContext.new(nil, syntax_tree)
|
24
24
|
expect(@detector.examine_context(ctx)).to be_empty
|
25
25
|
end
|
26
26
|
|
@@ -33,7 +33,7 @@ RSpec.describe Reek::Smells::TooManyMethods do
|
|
33
33
|
end
|
34
34
|
EOS
|
35
35
|
syntax_tree = Reek::Source::SourceCode.from(src).syntax_tree
|
36
|
-
ctx = Reek::
|
36
|
+
ctx = Reek::Context::ModuleContext.new(nil, syntax_tree)
|
37
37
|
smells = @detector.examine_context(ctx)
|
38
38
|
expect(smells.length).to eq(1)
|
39
39
|
expect(smells[0].smell_type).to eq(described_class.smell_type)
|
@@ -56,7 +56,7 @@ RSpec.describe Reek::Smells::TooManyMethods do
|
|
56
56
|
end
|
57
57
|
EOS
|
58
58
|
syntax_tree = Reek::Source::SourceCode.from(src).syntax_tree
|
59
|
-
ctx = Reek::
|
59
|
+
ctx = Reek::Context::ModuleContext.new(nil, syntax_tree)
|
60
60
|
expect(@detector.examine_context(ctx)).to be_empty
|
61
61
|
end
|
62
62
|
end
|
@@ -71,7 +71,7 @@ RSpec.describe Reek::Smells::TooManyMethods do
|
|
71
71
|
EOS
|
72
72
|
|
73
73
|
syntax_tree = Reek::Source::SourceCode.from(src).syntax_tree
|
74
|
-
ctx = Reek::
|
74
|
+
ctx = Reek::Context::ModuleContext.new(nil, syntax_tree)
|
75
75
|
@warning = @detector.examine_context(ctx)[0]
|
76
76
|
expect(@warning.source).to eq(@source_name)
|
77
77
|
expect(@warning.smell_category).to eq(described_class.smell_category)
|
@@ -4,11 +4,11 @@ require_relative 'smell_detector_shared'
|
|
4
4
|
require_relative '../../../lib/reek/source/source_code'
|
5
5
|
|
6
6
|
def process_method(source)
|
7
|
-
Reek::
|
7
|
+
Reek::TreeWalker.new.process_def(Reek::Source::SourceCode.from(source).syntax_tree)
|
8
8
|
end
|
9
9
|
|
10
10
|
def process_singleton_method(source)
|
11
|
-
Reek::
|
11
|
+
Reek::TreeWalker.new.process_defs(Reek::Source::SourceCode.from(source).syntax_tree)
|
12
12
|
end
|
13
13
|
|
14
14
|
RSpec.describe Reek::Smells::TooManyStatements do
|
@@ -21,7 +21,7 @@ RSpec.describe Reek::Smells::UncommunicativeMethodName do
|
|
21
21
|
context 'with a bad name' do
|
22
22
|
before do
|
23
23
|
src = "def #{method_name}; end"
|
24
|
-
ctx = Reek::
|
24
|
+
ctx = Reek::Context::CodeContext.new(nil, Reek::Source::SourceCode.from(src).syntax_tree)
|
25
25
|
smells = @detector.examine_context(ctx)
|
26
26
|
@warning = smells[0]
|
27
27
|
end
|
@@ -1,7 +1,7 @@
|
|
1
1
|
require_relative '../../spec_helper'
|
2
2
|
require_relative '../../../lib/reek/smells/uncommunicative_module_name'
|
3
3
|
require_relative 'smell_detector_shared'
|
4
|
-
require_relative '../../../lib/reek/
|
4
|
+
require_relative '../../../lib/reek/context/code_context'
|
5
5
|
|
6
6
|
RSpec.describe Reek::Smells::UncommunicativeModuleName do
|
7
7
|
before do
|
@@ -30,7 +30,7 @@ RSpec.describe Reek::Smells::UncommunicativeModuleName do
|
|
30
30
|
|
31
31
|
it 'reports a bad scoped name' do
|
32
32
|
src = "#{type} Foo::X; end"
|
33
|
-
ctx = Reek::
|
33
|
+
ctx = Reek::Context::CodeContext.new(nil, Reek::Source::SourceCode.from(src).syntax_tree)
|
34
34
|
smells = @detector.examine_context(ctx)
|
35
35
|
expect(smells.length).to eq(1)
|
36
36
|
expect(smells[0].smell_category).to eq(Reek::Smells::UncommunicativeModuleName.smell_category)
|
@@ -43,7 +43,7 @@ RSpec.describe Reek::Smells::UncommunicativeModuleName do
|
|
43
43
|
context 'accepting names' do
|
44
44
|
it 'accepts Inline::C' do
|
45
45
|
src = 'module Inline::C; end'
|
46
|
-
ctx = Reek::
|
46
|
+
ctx = Reek::Context::CodeContext.new(nil, Reek::Source::SourceCode.from(src).syntax_tree)
|
47
47
|
expect(@detector.examine_context(ctx)).to be_empty
|
48
48
|
end
|
49
49
|
end
|
@@ -51,7 +51,7 @@ RSpec.describe Reek::Smells::UncommunicativeModuleName do
|
|
51
51
|
context 'looking at the YAML' do
|
52
52
|
before :each do
|
53
53
|
src = 'module Printer2; end'
|
54
|
-
ctx = Reek::
|
54
|
+
ctx = Reek::Context::CodeContext.new(nil, Reek::Source::SourceCode.from(src).syntax_tree)
|
55
55
|
smells = @detector.examine_context(ctx)
|
56
56
|
@warning = smells[0]
|
57
57
|
end
|
@@ -1,7 +1,7 @@
|
|
1
1
|
require_relative '../../spec_helper'
|
2
2
|
require_relative '../../../lib/reek/smells/uncommunicative_parameter_name'
|
3
3
|
require_relative 'smell_detector_shared'
|
4
|
-
require_relative '../../../lib/reek/
|
4
|
+
require_relative '../../../lib/reek/context/method_context'
|
5
5
|
|
6
6
|
RSpec.describe Reek::Smells::UncommunicativeParameterName do
|
7
7
|
before :each do
|
@@ -81,7 +81,7 @@ RSpec.describe Reek::Smells::UncommunicativeParameterName do
|
|
81
81
|
context 'looking at the smell result fields' do
|
82
82
|
before :each do
|
83
83
|
src = 'def bad(good, bad2, good_again); basics(good, bad2, good_again); end'
|
84
|
-
ctx = Reek::
|
84
|
+
ctx = Reek::Context::MethodContext.new(nil, Reek::Source::SourceCode.from(src).syntax_tree)
|
85
85
|
@smells = @detector.examine_context(ctx)
|
86
86
|
@warning = @smells[0]
|
87
87
|
end
|
@@ -53,7 +53,7 @@ RSpec.describe Reek::Smells::UncommunicativeVariableName do
|
|
53
53
|
it 'reports variable name only once' do
|
54
54
|
src = 'def simple(fred) x = jim(45); x = y end'
|
55
55
|
syntax_tree = Reek::Source::SourceCode.from(src).syntax_tree
|
56
|
-
ctx = Reek::
|
56
|
+
ctx = Reek::Context::CodeContext.new(nil, syntax_tree)
|
57
57
|
smells = @detector.examine_context(ctx)
|
58
58
|
expect(smells.length).to eq(1)
|
59
59
|
expect(smells[0].smell_type).to eq(described_class.smell_type)
|
@@ -165,7 +165,7 @@ RSpec.describe Reek::Smells::UncommunicativeVariableName do
|
|
165
165
|
end
|
166
166
|
EOS
|
167
167
|
syntax_tree = Reek::Source::SourceCode.from(src).syntax_tree
|
168
|
-
ctx = Reek::
|
168
|
+
ctx = Reek::Context::CodeContext.new(nil, syntax_tree)
|
169
169
|
@smells = @detector.examine_context(ctx)
|
170
170
|
@warning = @smells[0]
|
171
171
|
end
|
@@ -182,7 +182,7 @@ RSpec.describe Reek::Smells::UncommunicativeVariableName do
|
|
182
182
|
before :each do
|
183
183
|
src = 'def self.bad() x2 = 4; end'
|
184
184
|
syntax_tree = Reek::Source::SourceCode.from(src).syntax_tree
|
185
|
-
ctx = Reek::
|
185
|
+
ctx = Reek::Context::CodeContext.new(nil, syntax_tree)
|
186
186
|
@smells = @detector.examine_context(ctx)
|
187
187
|
@warning = @smells[0]
|
188
188
|
end
|
@@ -21,7 +21,7 @@ RSpec.describe Reek::Smells::UtilityFunction do
|
|
21
21
|
end
|
22
22
|
EOS
|
23
23
|
source = Reek::Source::SourceCode.from(src)
|
24
|
-
mctx = Reek::
|
24
|
+
mctx = Reek::TreeWalker.new.process_def(source.syntax_tree)
|
25
25
|
@warning = @detector.examine_context(mctx)[0] # SMELL: too cumbersome!
|
26
26
|
end
|
27
27
|
|
@@ -42,6 +42,28 @@ RSpec.describe Reek::Smells::UtilityFunction do
|
|
42
42
|
end
|
43
43
|
end
|
44
44
|
|
45
|
+
context 'Singleton methods' do
|
46
|
+
it 'for classes with `class << self` notation should not report UtilityFunction' do
|
47
|
+
src = 'class C; class << self; def m(a) a.to_s; end; end; end'
|
48
|
+
expect(src).not_to reek_of(:UtilityFunction)
|
49
|
+
end
|
50
|
+
|
51
|
+
it 'for classes with `self.` notation should not report UtilityFunction' do
|
52
|
+
src = 'class C; def self.m(a) a.to_s; end; end'
|
53
|
+
expect(src).not_to reek_of(:UtilityFunction)
|
54
|
+
end
|
55
|
+
|
56
|
+
it 'for modules with `class << self` notation should not report UtilityFunction' do
|
57
|
+
src = 'module M; class << self; def self.m(a) a.to_s; end; end; end'
|
58
|
+
expect(src).not_to reek_of(:UtilityFunction)
|
59
|
+
end
|
60
|
+
|
61
|
+
it 'for modules with `self.` notation should not report UtilityFunction' do
|
62
|
+
src = 'module M; def self.simple(a) a.to_s; end; end'
|
63
|
+
expect(src).not_to reek_of(:UtilityFunction)
|
64
|
+
end
|
65
|
+
end
|
66
|
+
|
45
67
|
context 'with no calls' do
|
46
68
|
it 'does not report empty method' do
|
47
69
|
expect('def simple(arga) end').not_to reek_of(:UtilityFunction)
|
@@ -8,7 +8,7 @@ RSpec.describe Reek::Source::SourceCode do
|
|
8
8
|
source = "# this is\n# a comment\ndef foo; end"
|
9
9
|
source_code = Reek::Source::SourceCode.new(source, '(string)')
|
10
10
|
result = source_code.syntax_tree
|
11
|
-
expect(result.
|
11
|
+
expect(result.leading_comment).to eq "# this is\n# a comment"
|
12
12
|
end
|
13
13
|
|
14
14
|
it 'cleanly processes empty source' do
|
@@ -0,0 +1,30 @@
|
|
1
|
+
require_relative '../../spec_helper'
|
2
|
+
require_relative '../../../lib/reek/source/source_locator'
|
3
|
+
|
4
|
+
RSpec.describe Reek::Source::SourceLocator do
|
5
|
+
describe '#sources' do
|
6
|
+
context 'exclude paths' do
|
7
|
+
let(:config) { 'spec/samples/configuration/with_excluded_paths.reek' }
|
8
|
+
let(:path) { 'spec/samples/source_with_exclude_paths' }
|
9
|
+
let(:files_that_are_expected_to_be_ignored) do
|
10
|
+
[
|
11
|
+
'spec/samples/source_with_exclude_paths/ignore_me/uncommunicative_method_name.rb',
|
12
|
+
'spec/samples/source_with_exclude_paths/nested/ignore_me_as_well/irresponsible_module.rb'
|
13
|
+
]
|
14
|
+
end
|
15
|
+
|
16
|
+
it 'does not use excluded paths' do
|
17
|
+
with_test_config(config) do
|
18
|
+
sources = described_class.new([path]).sources
|
19
|
+
|
20
|
+
expect(sources.map(&:path).sort).
|
21
|
+
not_to include(files_that_are_expected_to_be_ignored)
|
22
|
+
|
23
|
+
expect(sources.map(&:path).sort).to eq [
|
24
|
+
'spec/samples/source_with_exclude_paths/nested/uncommunicative_parameter_name.rb'
|
25
|
+
]
|
26
|
+
end
|
27
|
+
end
|
28
|
+
end
|
29
|
+
end
|
30
|
+
end
|
@@ -54,23 +54,6 @@ RSpec.describe Reek::Spec::ShouldReekOf do
|
|
54
54
|
end
|
55
55
|
end
|
56
56
|
|
57
|
-
context 'checking code in a Dir' do
|
58
|
-
before :each do
|
59
|
-
@clean_dir = Dir['spec/samples/three_clean_files/*.rb']
|
60
|
-
@smelly_dir = Dir['spec/samples/two_smelly_files/*.rb']
|
61
|
-
@matcher = Reek::Spec::ShouldReekOf.new(:UncommunicativeVariableName,
|
62
|
-
name: '@s')
|
63
|
-
end
|
64
|
-
|
65
|
-
it 'matches a smelly String' do
|
66
|
-
expect(@matcher.matches?(@smelly_dir)).to be_truthy
|
67
|
-
end
|
68
|
-
|
69
|
-
it 'doesnt match a fragrant String' do
|
70
|
-
expect(@matcher.matches?(@clean_dir)).to be_falsey
|
71
|
-
end
|
72
|
-
end
|
73
|
-
|
74
57
|
context 'checking code in a File' do
|
75
58
|
before :each do
|
76
59
|
@clean_file = File.new(Dir['spec/samples/three_clean_files/*.rb'][0])
|
@@ -22,31 +22,6 @@ RSpec.describe Reek::Spec::ShouldReek do
|
|
22
22
|
end
|
23
23
|
end
|
24
24
|
|
25
|
-
describe 'checking code in a Dir' do
|
26
|
-
let(:clean_dir) { Dir['spec/samples/three_clean_files/*.rb'] }
|
27
|
-
let(:smelly_dir) { Dir['spec/samples/two_smelly_files/*.rb'] }
|
28
|
-
let(:masked_dir) { Dir['spec/samples/clean_due_to_masking/*.rb'] }
|
29
|
-
|
30
|
-
it 'matches a smelly Dir' do
|
31
|
-
expect(matcher.matches?(smelly_dir)).to be_truthy
|
32
|
-
end
|
33
|
-
|
34
|
-
it 'doesnt match a fragrant Dir' do
|
35
|
-
expect(matcher.matches?(clean_dir)).to be_falsey
|
36
|
-
end
|
37
|
-
|
38
|
-
it 'masks smells using the relevant configuration' do
|
39
|
-
with_test_config('spec/samples/clean_due_to_masking/masked.reek') do
|
40
|
-
expect(matcher.matches?(masked_dir)).to be_falsey
|
41
|
-
end
|
42
|
-
end
|
43
|
-
|
44
|
-
it 'reports the smells when should_not fails' do
|
45
|
-
matcher.matches?(smelly_dir)
|
46
|
-
expect(matcher.failure_message_when_negated).to match('UncommunicativeVariableName')
|
47
|
-
end
|
48
|
-
end
|
49
|
-
|
50
25
|
describe 'checking code in a File' do
|
51
26
|
let(:clean_file) { File.new('spec/samples/three_clean_files/clean_one.rb') }
|
52
27
|
let(:smelly_file) { File.new('spec/samples/two_smelly_files/dirty_one.rb') }
|
@@ -0,0 +1,16 @@
|
|
1
|
+
require_relative '../spec_helper'
|
2
|
+
require_relative '../../lib/reek/tree_dresser'
|
3
|
+
|
4
|
+
RSpec.describe Reek::TreeDresser do
|
5
|
+
let(:ifnode) { ::Parser::AST::Node.new(:if) }
|
6
|
+
let(:sendnode) { ::Parser::AST::Node.new(:send) }
|
7
|
+
let(:dresser) { described_class.new }
|
8
|
+
|
9
|
+
it 'dresses :if sexp with IfNode' do
|
10
|
+
expect(dresser.dress(ifnode, {})).to be_a Reek::AST::SexpExtensions::IfNode
|
11
|
+
end
|
12
|
+
|
13
|
+
it 'dresses :send sexp with SendNode' do
|
14
|
+
expect(dresser.dress(sendnode, {})).to be_a Reek::AST::SexpExtensions::SendNode
|
15
|
+
end
|
16
|
+
end
|
@@ -1,7 +1,7 @@
|
|
1
|
-
require_relative '
|
2
|
-
require_relative '
|
1
|
+
require_relative '../spec_helper'
|
2
|
+
require_relative '../../lib/reek/tree_walker'
|
3
3
|
|
4
|
-
RSpec.describe Reek::
|
4
|
+
RSpec.describe Reek::TreeWalker, 'with no method definitions' do
|
5
5
|
it 'reports no problems for empty source code' do
|
6
6
|
expect('').not_to reek
|
7
7
|
end
|
@@ -11,14 +11,14 @@ class Fred; end').not_to reek
|
|
11
11
|
end
|
12
12
|
end
|
13
13
|
|
14
|
-
RSpec.describe Reek::
|
14
|
+
RSpec.describe Reek::TreeWalker, 'with a global method definition' do
|
15
15
|
it 'reports no problems for simple method' do
|
16
16
|
src = 'def Outermost::fred() true; end'
|
17
17
|
expect(src).not_to reek
|
18
18
|
end
|
19
19
|
end
|
20
20
|
|
21
|
-
RSpec.describe Reek::
|
21
|
+
RSpec.describe Reek::TreeWalker, 'when a yield is the receiver' do
|
22
22
|
it 'reports no problems' do
|
23
23
|
src = <<EOS
|
24
24
|
def values(*args)
|
File without changes
|
data/spec/spec_helper.rb
CHANGED
@@ -1,20 +1,19 @@
|
|
1
1
|
require_relative '../lib/reek/spec'
|
2
|
-
require_relative '../lib/reek/
|
2
|
+
require_relative '../lib/reek/ast/ast_node_class_map'
|
3
3
|
require_relative '../lib/reek/configuration/app_configuration'
|
4
4
|
|
5
5
|
Reek::CLI::Silencer.silently do
|
6
6
|
require 'factory_girl'
|
7
|
+
begin
|
8
|
+
require 'pry-byebug'
|
9
|
+
rescue LoadError # rubocop:disable Lint/HandleExceptions
|
10
|
+
end
|
7
11
|
end
|
8
12
|
if Gem.loaded_specs['factory_girl'].version > Gem::Version.create('4.5.0')
|
9
13
|
raise 'Remove the above silencer as well as this check now that ' \
|
10
14
|
'`factory_girl` gem is updated to version greater than 4.5.0!'
|
11
15
|
end
|
12
16
|
|
13
|
-
begin
|
14
|
-
require 'pry-byebug'
|
15
|
-
rescue LoadError # rubocop:disable Lint/HandleExceptions
|
16
|
-
end
|
17
|
-
|
18
17
|
FactoryGirl.find_definitions
|
19
18
|
|
20
19
|
SAMPLES_DIR = 'spec/samples'
|
@@ -37,7 +36,7 @@ module Helpers
|
|
37
36
|
|
38
37
|
# :reek:UncommunicativeMethodName
|
39
38
|
def s(type, *children)
|
40
|
-
@klass_map ||= Reek::
|
39
|
+
@klass_map ||= Reek::AST::ASTNodeClassMap.new
|
41
40
|
@klass_map.klass_for(type).new(type, children)
|
42
41
|
end
|
43
42
|
|
data/tasks/develop.rake
CHANGED
@@ -1,11 +1,11 @@
|
|
1
1
|
require 'rake/clean'
|
2
|
-
require_relative '../lib/reek/
|
2
|
+
require_relative '../lib/reek/smells/smell_repository'
|
3
3
|
|
4
4
|
CONFIG_FILE = 'config/defaults.reek'
|
5
5
|
|
6
6
|
file CONFIG_FILE do
|
7
7
|
config = {}
|
8
|
-
Reek::
|
8
|
+
Reek::Smells::SmellRepository.smell_types.each do |klass|
|
9
9
|
config[klass.name.split(/::/)[-1]] = klass.default_config
|
10
10
|
end
|
11
11
|
$stderr.puts "Creating #{CONFIG_FILE}"
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: reek
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version:
|
4
|
+
version: 3.0.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Kevin Rutherford
|
@@ -10,7 +10,7 @@ authors:
|
|
10
10
|
autorequire:
|
11
11
|
bindir: bin
|
12
12
|
cert_chain: []
|
13
|
-
date: 2015-
|
13
|
+
date: 2015-06-30 00:00:00.000000000 Z
|
14
14
|
dependencies:
|
15
15
|
- !ruby/object:Gem::Dependency
|
16
16
|
name: parser
|
@@ -18,14 +18,14 @@ dependencies:
|
|
18
18
|
requirements:
|
19
19
|
- - "~>"
|
20
20
|
- !ruby/object:Gem::Version
|
21
|
-
version:
|
21
|
+
version: 2.2.2.5
|
22
22
|
type: :runtime
|
23
23
|
prerelease: false
|
24
24
|
version_requirements: !ruby/object:Gem::Requirement
|
25
25
|
requirements:
|
26
26
|
- - "~>"
|
27
27
|
- !ruby/object:Gem::Version
|
28
|
-
version:
|
28
|
+
version: 2.2.2.5
|
29
29
|
- !ruby/object:Gem::Dependency
|
30
30
|
name: rainbow
|
31
31
|
requirement: !ruby/object:Gem::Requirement
|
@@ -82,6 +82,20 @@ dependencies:
|
|
82
82
|
- - "~>"
|
83
83
|
- !ruby/object:Gem::Version
|
84
84
|
version: 0.6.2
|
85
|
+
- !ruby/object:Gem::Dependency
|
86
|
+
name: ataru
|
87
|
+
requirement: !ruby/object:Gem::Requirement
|
88
|
+
requirements:
|
89
|
+
- - "~>"
|
90
|
+
- !ruby/object:Gem::Version
|
91
|
+
version: 0.2.0
|
92
|
+
type: :development
|
93
|
+
prerelease: false
|
94
|
+
version_requirements: !ruby/object:Gem::Requirement
|
95
|
+
requirements:
|
96
|
+
- - "~>"
|
97
|
+
- !ruby/object:Gem::Version
|
98
|
+
version: 0.2.0
|
85
99
|
- !ruby/object:Gem::Dependency
|
86
100
|
name: bundler
|
87
101
|
requirement: !ruby/object:Gem::Requirement
|
@@ -166,20 +180,6 @@ dependencies:
|
|
166
180
|
- - "~>"
|
167
181
|
- !ruby/object:Gem::Version
|
168
182
|
version: 0.30.0
|
169
|
-
- !ruby/object:Gem::Dependency
|
170
|
-
name: yard
|
171
|
-
requirement: !ruby/object:Gem::Requirement
|
172
|
-
requirements:
|
173
|
-
- - "~>"
|
174
|
-
- !ruby/object:Gem::Version
|
175
|
-
version: 0.8.7
|
176
|
-
type: :development
|
177
|
-
prerelease: false
|
178
|
-
version_requirements: !ruby/object:Gem::Requirement
|
179
|
-
requirements:
|
180
|
-
- - "~>"
|
181
|
-
- !ruby/object:Gem::Version
|
182
|
-
version: 0.8.7
|
183
183
|
description: |2
|
184
184
|
Reek is a tool that examines Ruby classes, modules and methods and reports
|
185
185
|
any code smells it finds.
|
@@ -247,6 +247,7 @@ files:
|
|
247
247
|
- docs/Versioning-Policy.md
|
248
248
|
- docs/YAML-Reports.md
|
249
249
|
- docs/yard_plugin.rb
|
250
|
+
- features/command_line_interface/basic_usage.feature
|
250
251
|
- features/command_line_interface/options.feature
|
251
252
|
- features/command_line_interface/smell_selection.feature
|
252
253
|
- features/command_line_interface/smells_count.feature
|
@@ -259,46 +260,40 @@ files:
|
|
259
260
|
- features/reports/json.feature
|
260
261
|
- features/reports/reports.feature
|
261
262
|
- features/reports/yaml.feature
|
262
|
-
- features/ruby_api/api.feature
|
263
263
|
- features/samples.feature
|
264
264
|
- features/step_definitions/.rubocop.yml
|
265
265
|
- features/step_definitions/reek_steps.rb
|
266
266
|
- features/step_definitions/sample_file_steps.rb
|
267
267
|
- features/support/env.rb
|
268
268
|
- lib/reek.rb
|
269
|
+
- lib/reek/ast/ast_node_class_map.rb
|
270
|
+
- lib/reek/ast/node.rb
|
271
|
+
- lib/reek/ast/object_refs.rb
|
272
|
+
- lib/reek/ast/reference_collector.rb
|
273
|
+
- lib/reek/ast/sexp_extensions.rb
|
274
|
+
- lib/reek/ast/sexp_formatter.rb
|
269
275
|
- lib/reek/cli/application.rb
|
270
276
|
- lib/reek/cli/command.rb
|
271
277
|
- lib/reek/cli/input.rb
|
272
278
|
- lib/reek/cli/option_interpreter.rb
|
273
279
|
- lib/reek/cli/options.rb
|
274
280
|
- lib/reek/cli/reek_command.rb
|
275
|
-
- lib/reek/cli/report/formatter.rb
|
276
|
-
- lib/reek/cli/report/heading_formatter.rb
|
277
|
-
- lib/reek/cli/report/location_formatter.rb
|
278
|
-
- lib/reek/cli/report/report.rb
|
279
281
|
- lib/reek/cli/silencer.rb
|
282
|
+
- lib/reek/cli/warning_collector.rb
|
283
|
+
- lib/reek/code_comment.rb
|
280
284
|
- lib/reek/configuration/app_configuration.rb
|
281
285
|
- lib/reek/configuration/configuration_file_finder.rb
|
282
|
-
- lib/reek/
|
283
|
-
- lib/reek/
|
284
|
-
- lib/reek/
|
285
|
-
- lib/reek/
|
286
|
-
- lib/reek/
|
287
|
-
- lib/reek/
|
288
|
-
- lib/reek/core/module_context.rb
|
289
|
-
- lib/reek/core/object_refs.rb
|
290
|
-
- lib/reek/core/reference_collector.rb
|
291
|
-
- lib/reek/core/singleton_method_context.rb
|
292
|
-
- lib/reek/core/smell_configuration.rb
|
293
|
-
- lib/reek/core/smell_repository.rb
|
294
|
-
- lib/reek/core/stop_context.rb
|
295
|
-
- lib/reek/core/tree_dresser.rb
|
296
|
-
- lib/reek/core/tree_walker.rb
|
297
|
-
- lib/reek/core/warning_collector.rb
|
286
|
+
- lib/reek/context/code_context.rb
|
287
|
+
- lib/reek/context/method_context.rb
|
288
|
+
- lib/reek/context/module_context.rb
|
289
|
+
- lib/reek/context/root_context.rb
|
290
|
+
- lib/reek/context/singleton_method_context.rb
|
291
|
+
- lib/reek/examiner.rb
|
298
292
|
- lib/reek/rake/task.rb
|
299
|
-
- lib/reek/
|
300
|
-
- lib/reek/
|
301
|
-
- lib/reek/
|
293
|
+
- lib/reek/report/formatter.rb
|
294
|
+
- lib/reek/report/heading_formatter.rb
|
295
|
+
- lib/reek/report/location_formatter.rb
|
296
|
+
- lib/reek/report/report.rb
|
302
297
|
- lib/reek/smells.rb
|
303
298
|
- lib/reek/smells/attribute.rb
|
304
299
|
- lib/reek/smells/boolean_parameter.rb
|
@@ -315,7 +310,9 @@ files:
|
|
315
310
|
- lib/reek/smells/nil_check.rb
|
316
311
|
- lib/reek/smells/prima_donna_method.rb
|
317
312
|
- lib/reek/smells/repeated_conditional.rb
|
313
|
+
- lib/reek/smells/smell_configuration.rb
|
318
314
|
- lib/reek/smells/smell_detector.rb
|
315
|
+
- lib/reek/smells/smell_repository.rb
|
319
316
|
- lib/reek/smells/smell_warning.rb
|
320
317
|
- lib/reek/smells/too_many_instance_variables.rb
|
321
318
|
- lib/reek/smells/too_many_methods.rb
|
@@ -328,44 +325,40 @@ files:
|
|
328
325
|
- lib/reek/smells/utility_function.rb
|
329
326
|
- lib/reek/source/source_code.rb
|
330
327
|
- lib/reek/source/source_locator.rb
|
331
|
-
- lib/reek/source/source_repository.rb
|
332
328
|
- lib/reek/spec.rb
|
333
329
|
- lib/reek/spec/should_reek.rb
|
334
330
|
- lib/reek/spec/should_reek_of.rb
|
335
331
|
- lib/reek/spec/should_reek_only_of.rb
|
332
|
+
- lib/reek/tree_dresser.rb
|
333
|
+
- lib/reek/tree_walker.rb
|
336
334
|
- lib/reek/version.rb
|
337
335
|
- reek.gemspec
|
338
336
|
- spec/factories/factories.rb
|
339
337
|
- spec/gem/updates_spec.rb
|
340
338
|
- spec/gem/yard_spec.rb
|
341
339
|
- spec/quality/reek_source_spec.rb
|
342
|
-
- spec/reek/
|
343
|
-
- spec/reek/
|
340
|
+
- spec/reek/ast/node_spec.rb
|
341
|
+
- spec/reek/ast/object_refs_spec.rb
|
342
|
+
- spec/reek/ast/reference_collector_spec.rb
|
343
|
+
- spec/reek/ast/sexp_extensions_spec.rb
|
344
|
+
- spec/reek/ast/sexp_formatter_spec.rb
|
344
345
|
- spec/reek/cli/option_interpreter_spec.rb
|
345
346
|
- spec/reek/cli/options_spec.rb
|
346
|
-
- spec/reek/cli/
|
347
|
-
- spec/reek/
|
348
|
-
- spec/reek/cli/yaml_report_spec.rb
|
347
|
+
- spec/reek/cli/warning_collector_spec.rb
|
348
|
+
- spec/reek/code_comment_spec.rb
|
349
349
|
- spec/reek/configuration/app_configuration_spec.rb
|
350
350
|
- spec/reek/configuration/configuration_file_finder_spec.rb
|
351
|
-
- spec/reek/
|
352
|
-
- spec/reek/
|
353
|
-
- spec/reek/
|
354
|
-
- spec/reek/
|
355
|
-
- spec/reek/
|
356
|
-
- spec/reek/
|
357
|
-
- spec/reek/
|
358
|
-
- spec/reek/
|
359
|
-
- spec/reek/
|
360
|
-
- spec/reek/
|
361
|
-
- spec/reek/
|
362
|
-
- spec/reek/core/stop_context_spec.rb
|
363
|
-
- spec/reek/core/tree_dresser_spec.rb
|
364
|
-
- spec/reek/core/tree_walker_spec.rb
|
365
|
-
- spec/reek/core/warning_collector_spec.rb
|
366
|
-
- spec/reek/sexp/sexp_extensions_spec.rb
|
367
|
-
- spec/reek/sexp/sexp_formatter_spec.rb
|
368
|
-
- spec/reek/sexp/sexp_node_spec.rb
|
351
|
+
- spec/reek/context/code_context_spec.rb
|
352
|
+
- spec/reek/context/method_context_spec.rb
|
353
|
+
- spec/reek/context/module_context_spec.rb
|
354
|
+
- spec/reek/context/root_context_spec.rb
|
355
|
+
- spec/reek/context/singleton_method_context_spec.rb
|
356
|
+
- spec/reek/examiner_spec.rb
|
357
|
+
- spec/reek/report/html_report_spec.rb
|
358
|
+
- spec/reek/report/json_report_spec.rb
|
359
|
+
- spec/reek/report/text_report_spec.rb
|
360
|
+
- spec/reek/report/xml_report_spec.rb
|
361
|
+
- spec/reek/report/yaml_report_spec.rb
|
369
362
|
- spec/reek/smells/attribute_spec.rb
|
370
363
|
- spec/reek/smells/behaves_like_variable_detector.rb
|
371
364
|
- spec/reek/smells/boolean_parameter_spec.rb
|
@@ -382,7 +375,9 @@ files:
|
|
382
375
|
- spec/reek/smells/nil_check_spec.rb
|
383
376
|
- spec/reek/smells/prima_donna_method_spec.rb
|
384
377
|
- spec/reek/smells/repeated_conditional_spec.rb
|
378
|
+
- spec/reek/smells/smell_configuration_spec.rb
|
385
379
|
- spec/reek/smells/smell_detector_shared.rb
|
380
|
+
- spec/reek/smells/smell_repository_spec.rb
|
386
381
|
- spec/reek/smells/smell_warning_spec.rb
|
387
382
|
- spec/reek/smells/too_many_instance_variables_spec.rb
|
388
383
|
- spec/reek/smells/too_many_methods_spec.rb
|
@@ -394,9 +389,12 @@ files:
|
|
394
389
|
- spec/reek/smells/unused_parameters_spec.rb
|
395
390
|
- spec/reek/smells/utility_function_spec.rb
|
396
391
|
- spec/reek/source/source_code_spec.rb
|
392
|
+
- spec/reek/source/source_locator_spec.rb
|
397
393
|
- spec/reek/spec/should_reek_of_spec.rb
|
398
394
|
- spec/reek/spec/should_reek_only_of_spec.rb
|
399
395
|
- spec/reek/spec/should_reek_spec.rb
|
396
|
+
- spec/reek/tree_dresser_spec.rb
|
397
|
+
- spec/reek/tree_walker_spec.rb
|
400
398
|
- spec/samples/all_but_one_masked/clean_one.rb
|
401
399
|
- spec/samples/all_but_one_masked/dirty.rb
|
402
400
|
- spec/samples/all_but_one_masked/masked.reek
|
@@ -407,6 +405,8 @@ files:
|
|
407
405
|
- spec/samples/clean_due_to_masking/dirty_one.rb
|
408
406
|
- spec/samples/clean_due_to_masking/dirty_two.rb
|
409
407
|
- spec/samples/clean_due_to_masking/masked.reek
|
408
|
+
- spec/samples/configuration/simple_configuration.reek
|
409
|
+
- spec/samples/configuration/with_excluded_paths.reek
|
410
410
|
- spec/samples/exceptions.reek
|
411
411
|
- spec/samples/inline.rb
|
412
412
|
- spec/samples/masked_by_dotfile/.reek
|
@@ -414,7 +414,9 @@ files:
|
|
414
414
|
- spec/samples/no_config_file/dirty.rb
|
415
415
|
- spec/samples/optparse.rb
|
416
416
|
- spec/samples/redcloth.rb
|
417
|
-
- spec/samples/
|
417
|
+
- spec/samples/source_with_exclude_paths/ignore_me/uncommunicative_method_name.rb
|
418
|
+
- spec/samples/source_with_exclude_paths/nested/ignore_me_as_well/irresponsible_module.rb
|
419
|
+
- spec/samples/source_with_exclude_paths/nested/uncommunicative_parameter_name.rb
|
418
420
|
- spec/samples/three_clean_files/clean_one.rb
|
419
421
|
- spec/samples/three_clean_files/clean_three.rb
|
420
422
|
- spec/samples/three_clean_files/clean_two.rb
|
@@ -442,7 +444,7 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
442
444
|
requirements:
|
443
445
|
- - ">="
|
444
446
|
- !ruby/object:Gem::Version
|
445
|
-
version:
|
447
|
+
version: 2.0.0
|
446
448
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
447
449
|
requirements:
|
448
450
|
- - ">="
|
@@ -450,7 +452,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
450
452
|
version: '0'
|
451
453
|
requirements: []
|
452
454
|
rubyforge_project:
|
453
|
-
rubygems_version: 2.4.
|
455
|
+
rubygems_version: 2.4.5
|
454
456
|
signing_key:
|
455
457
|
specification_version: 4
|
456
458
|
summary: Code smell detector for Ruby
|