reek 3.2.1 → 3.3.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (112) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +5 -0
  3. data/Rakefile +0 -1
  4. data/config/defaults.reek +1 -1
  5. data/features/samples.feature +17 -16
  6. data/lib/reek.rb +0 -1
  7. data/lib/reek/ast/ast_node_class_map.rb +5 -1
  8. data/lib/reek/ast/node.rb +10 -3
  9. data/lib/reek/ast/object_refs.rb +11 -5
  10. data/lib/reek/ast/reference_collector.rb +6 -2
  11. data/lib/reek/ast/sexp_extensions.rb +42 -1
  12. data/lib/reek/ast/sexp_formatter.rb +2 -1
  13. data/lib/reek/cli/application.rb +12 -9
  14. data/lib/reek/cli/command.rb +6 -0
  15. data/lib/reek/cli/input.rb +4 -4
  16. data/lib/reek/cli/option_interpreter.rb +11 -7
  17. data/lib/reek/cli/options.rb +42 -40
  18. data/lib/reek/cli/reek_command.rb +3 -3
  19. data/lib/reek/cli/silencer.rb +12 -3
  20. data/lib/reek/cli/warning_collector.rb +8 -3
  21. data/lib/reek/code_comment.rb +6 -1
  22. data/lib/reek/configuration/app_configuration.rb +65 -100
  23. data/lib/reek/configuration/configuration_file_finder.rb +4 -13
  24. data/lib/reek/configuration/configuration_validator.rb +35 -0
  25. data/lib/reek/configuration/default_directive.rb +12 -0
  26. data/lib/reek/configuration/directory_directives.rb +54 -0
  27. data/lib/reek/configuration/excluded_paths.rb +18 -0
  28. data/lib/reek/context/code_context.rb +19 -17
  29. data/lib/reek/examiner.rb +9 -7
  30. data/lib/reek/rake/task.rb +12 -22
  31. data/lib/reek/report/formatter.rb +6 -1
  32. data/lib/reek/report/report.rb +22 -13
  33. data/lib/reek/smells/attribute.rb +6 -53
  34. data/lib/reek/smells/control_parameter.rb +21 -13
  35. data/lib/reek/smells/data_clump.rb +17 -9
  36. data/lib/reek/smells/duplicate_method_call.rb +12 -6
  37. data/lib/reek/smells/long_parameter_list.rb +2 -2
  38. data/lib/reek/smells/long_yield_list.rb +4 -4
  39. data/lib/reek/smells/nested_iterators.rb +4 -2
  40. data/lib/reek/smells/nil_check.rb +6 -2
  41. data/lib/reek/smells/repeated_conditional.rb +3 -3
  42. data/lib/reek/smells/smell_configuration.rb +17 -7
  43. data/lib/reek/smells/smell_detector.rb +24 -11
  44. data/lib/reek/smells/smell_repository.rb +1 -1
  45. data/lib/reek/smells/smell_warning.rb +6 -6
  46. data/lib/reek/smells/too_many_instance_variables.rb +2 -2
  47. data/lib/reek/smells/too_many_methods.rb +4 -4
  48. data/lib/reek/smells/too_many_statements.rb +4 -4
  49. data/lib/reek/smells/uncommunicative_method_name.rb +5 -5
  50. data/lib/reek/smells/uncommunicative_module_name.rb +6 -6
  51. data/lib/reek/smells/uncommunicative_parameter_name.rb +8 -4
  52. data/lib/reek/smells/uncommunicative_variable_name.rb +9 -5
  53. data/lib/reek/smells/utility_function.rb +1 -1
  54. data/lib/reek/source/source_code.rb +5 -1
  55. data/lib/reek/source/source_locator.rb +3 -2
  56. data/lib/reek/spec.rb +3 -3
  57. data/lib/reek/spec/should_reek.rb +10 -5
  58. data/lib/reek/spec/should_reek_of.rb +9 -6
  59. data/lib/reek/spec/should_reek_only_of.rb +13 -8
  60. data/lib/reek/tree_dresser.rb +6 -2
  61. data/lib/reek/tree_walker.rb +40 -32
  62. data/lib/reek/version.rb +1 -1
  63. data/reek.gemspec +1 -1
  64. data/spec/reek/ast/node_spec.rb +1 -2
  65. data/spec/reek/ast/object_refs_spec.rb +40 -42
  66. data/spec/reek/ast/sexp_extensions_spec.rb +98 -104
  67. data/spec/reek/cli/warning_collector_spec.rb +8 -12
  68. data/spec/reek/code_comment_spec.rb +3 -5
  69. data/spec/reek/configuration/app_configuration_spec.rb +43 -57
  70. data/spec/reek/configuration/configuration_file_finder_spec.rb +5 -7
  71. data/spec/reek/configuration/default_directive_spec.rb +13 -0
  72. data/spec/reek/configuration/directory_directives_spec.rb +89 -0
  73. data/spec/reek/configuration/excluded_paths_spec.rb +30 -0
  74. data/spec/reek/context/code_context_spec.rb +63 -62
  75. data/spec/reek/context/method_context_spec.rb +8 -12
  76. data/spec/reek/context/module_context_spec.rb +1 -1
  77. data/spec/reek/context/root_context_spec.rb +3 -7
  78. data/spec/reek/examiner_spec.rb +14 -25
  79. data/spec/reek/smells/attribute_spec.rb +2 -4
  80. data/spec/reek/smells/boolean_parameter_spec.rb +5 -7
  81. data/spec/reek/smells/class_variable_spec.rb +29 -44
  82. data/spec/reek/smells/control_parameter_spec.rb +7 -9
  83. data/spec/reek/smells/data_clump_spec.rb +25 -32
  84. data/spec/reek/smells/duplicate_method_call_spec.rb +8 -7
  85. data/spec/reek/smells/feature_envy_spec.rb +16 -17
  86. data/spec/reek/smells/irresponsible_module_spec.rb +2 -4
  87. data/spec/reek/smells/long_parameter_list_spec.rb +6 -9
  88. data/spec/reek/smells/long_yield_list_spec.rb +6 -9
  89. data/spec/reek/smells/nested_iterators_spec.rb +14 -16
  90. data/spec/reek/smells/repeated_conditional_spec.rb +25 -25
  91. data/spec/reek/smells/smell_configuration_spec.rb +32 -27
  92. data/spec/reek/smells/smell_detector_shared.rb +12 -13
  93. data/spec/reek/smells/smell_warning_spec.rb +54 -58
  94. data/spec/reek/smells/too_many_instance_variables_spec.rb +9 -9
  95. data/spec/reek/smells/too_many_methods_spec.rb +13 -14
  96. data/spec/reek/smells/too_many_statements_spec.rb +8 -10
  97. data/spec/reek/smells/uncommunicative_method_name_spec.rb +8 -9
  98. data/spec/reek/smells/uncommunicative_module_name_spec.rb +12 -13
  99. data/spec/reek/smells/uncommunicative_parameter_name_spec.rb +7 -10
  100. data/spec/reek/smells/uncommunicative_variable_name_spec.rb +16 -20
  101. data/spec/reek/smells/utility_function_spec.rb +11 -15
  102. data/spec/reek/source/source_code_spec.rb +6 -11
  103. data/spec/reek/spec/should_reek_of_spec.rb +19 -30
  104. data/spec/reek/spec/should_reek_only_of_spec.rb +28 -34
  105. data/spec/reek/tree_walker_spec.rb +14 -2
  106. data/spec/spec_helper.rb +2 -3
  107. data/tasks/test.rake +0 -5
  108. metadata +10 -6
  109. data/docs/Configuration-Files.md +0 -49
  110. data/spec/gem/updates_spec.rb +0 -25
  111. data/spec/gem/yard_spec.rb +0 -11
  112. data/spec/reek/smells/behaves_like_variable_detector.rb +0 -39
@@ -4,12 +4,10 @@ require_relative 'smell_detector_shared'
4
4
  require_relative '../../../lib/reek/context/method_context'
5
5
 
6
6
  RSpec.describe Reek::Smells::UncommunicativeParameterName do
7
- before :each do
8
- @source_name = 'dummy_source'
9
- @detector = build(:smell_detector,
10
- smell_type: :UncommunicativeParameterName,
11
- source: @source_name)
7
+ let(:detector) do
8
+ build(:smell_detector, smell_type: :UncommunicativeParameterName, source: source_name)
12
9
  end
10
+ let(:source_name) { 'dummy_source' }
13
11
 
14
12
  it_should_behave_like 'SmellDetector'
15
13
 
@@ -79,18 +77,17 @@ RSpec.describe Reek::Smells::UncommunicativeParameterName do
79
77
  end
80
78
 
81
79
  context 'looking at the smell result fields' do
82
- before :each do
80
+ let(:warning) do
83
81
  src = 'def bad(good, bad2, good_again); basics(good, bad2, good_again); end'
84
82
  ctx = Reek::Context::MethodContext.new(nil, Reek::Source::SourceCode.from(src).syntax_tree)
85
- @smells = @detector.examine_context(ctx)
86
- @warning = @smells[0]
83
+ detector.examine_context(ctx).first
87
84
  end
88
85
 
89
86
  it_should_behave_like 'common fields set correctly'
90
87
 
91
88
  it 'reports the correct values' do
92
- expect(@warning.parameters[:name]).to eq('bad2')
93
- expect(@warning.lines).to eq([1])
89
+ expect(warning.parameters[:name]).to eq('bad2')
90
+ expect(warning.lines).to eq([1])
94
91
  end
95
92
  end
96
93
  end
@@ -3,11 +3,9 @@ require_relative '../../../lib/reek/smells/uncommunicative_variable_name'
3
3
  require_relative 'smell_detector_shared'
4
4
 
5
5
  RSpec.describe Reek::Smells::UncommunicativeVariableName do
6
- before :each do
7
- @source_name = 'dummy_source'
8
- @detector = build(:smell_detector,
9
- smell_type: :UncommunicativeVariableName,
10
- source: @source_name)
6
+ let(:source_name) { 'dummy_source' }
7
+ let(:detector) do
8
+ build(:smell_detector, smell_type: :UncommunicativeVariableName, source: source_name)
11
9
  end
12
10
 
13
11
  it_should_behave_like 'SmellDetector'
@@ -19,7 +17,7 @@ RSpec.describe Reek::Smells::UncommunicativeVariableName do
19
17
  end
20
18
  it 'reports one-letter fieldname in assignment' do
21
19
  src = 'class Thing; def simple(fred) @x = fred end end'
22
- expect(src).to reek_of(:UncommunicativeVariableName, name: '@x')
20
+ expect(src).to reek_of(:UncommunicativeVariableName, name: '@x')
23
21
  end
24
22
  end
25
23
 
@@ -44,17 +42,17 @@ RSpec.describe Reek::Smells::UncommunicativeVariableName do
44
42
  end
45
43
 
46
44
  it 'reports long name ending in a number' do
47
- @bad_var = 'var123'
48
- src = "def simple(fred) #{@bad_var} = jim(45) end"
45
+ bad_var = 'var123'
46
+ src = "def simple(fred) #{bad_var} = jim(45) end"
49
47
  expect(src).to reek_of(:UncommunicativeVariableName,
50
- name: @bad_var)
48
+ name: bad_var)
51
49
  end
52
50
 
53
51
  it 'reports variable name only once' do
54
52
  src = 'def simple(fred) x = jim(45); x = y end'
55
53
  syntax_tree = Reek::Source::SourceCode.from(src).syntax_tree
56
54
  ctx = Reek::Context::CodeContext.new(nil, syntax_tree)
57
- smells = @detector.examine_context(ctx)
55
+ smells = detector.examine_context(ctx)
58
56
  expect(smells.length).to eq(1)
59
57
  expect(smells[0].smell_type).to eq(described_class.smell_type)
60
58
  expect(smells[0].parameters[:name]).to eq('x')
@@ -67,7 +65,7 @@ RSpec.describe Reek::Smells::UncommunicativeVariableName do
67
65
  end
68
66
 
69
67
  it 'reports variable name outside any method' do
70
- expect('class Simple; x = jim(45); end').to reek_of(:UncommunicativeVariableName, name: 'x')
68
+ expect('class Simple; x = jim(45); end').to reek_of(:UncommunicativeVariableName, name: 'x')
71
69
  end
72
70
  end
73
71
 
@@ -154,7 +152,7 @@ RSpec.describe Reek::Smells::UncommunicativeVariableName do
154
152
  end
155
153
 
156
154
  context 'when a smell is reported' do
157
- before :each do
155
+ let(:warning) do
158
156
  src = <<-EOS
159
157
  def bad
160
158
  unless @mod then
@@ -166,31 +164,29 @@ RSpec.describe Reek::Smells::UncommunicativeVariableName do
166
164
  EOS
167
165
  syntax_tree = Reek::Source::SourceCode.from(src).syntax_tree
168
166
  ctx = Reek::Context::CodeContext.new(nil, syntax_tree)
169
- @smells = @detector.examine_context(ctx)
170
- @warning = @smells[0]
167
+ detector.examine_context(ctx).first
171
168
  end
172
169
 
173
170
  it_should_behave_like 'common fields set correctly'
174
171
 
175
172
  it 'reports the correct values' do
176
- expect(@warning.parameters[:name]).to eq('x2')
177
- expect(@warning.lines).to eq([3, 5])
173
+ expect(warning.parameters[:name]).to eq('x2')
174
+ expect(warning.lines).to eq([3, 5])
178
175
  end
179
176
  end
180
177
 
181
178
  context 'when a smell is reported in a singleton method' do
182
- before :each do
179
+ let(:warning) do
183
180
  src = 'def self.bad() x2 = 4; end'
184
181
  syntax_tree = Reek::Source::SourceCode.from(src).syntax_tree
185
182
  ctx = Reek::Context::CodeContext.new(nil, syntax_tree)
186
- @smells = @detector.examine_context(ctx)
187
- @warning = @smells[0]
183
+ detector.examine_context(ctx).first
188
184
  end
189
185
 
190
186
  it_should_behave_like 'common fields set correctly'
191
187
 
192
188
  it 'reports the fq context' do
193
- expect(@warning.context).to eq('self.bad')
189
+ expect(warning.context).to eq('self.bad')
194
190
  end
195
191
  end
196
192
  end
@@ -5,29 +5,25 @@ require_relative 'smell_detector_shared'
5
5
 
6
6
  RSpec.describe Reek::Smells::UtilityFunction do
7
7
  describe 'a detector' do
8
- before(:each) do
9
- @source_name = 'string'
10
- @detector = build(:smell_detector,
11
- smell_type: :UtilityFunction,
12
- source: @source_name)
13
- end
8
+ let(:detector) { build(:smell_detector, smell_type: :UtilityFunction, source: source_name) }
9
+ let(:source_name) { 'string' }
14
10
 
15
11
  it_should_behave_like 'SmellDetector'
16
12
 
17
13
  context 'when a smells is reported' do
18
- before :each do
14
+ let(:warning) do
19
15
  src = <<-EOS
20
- def simple(arga)
21
- arga.b.c
22
- end
16
+ def simple(arga)
17
+ arga.b.c
18
+ end
23
19
  EOS
24
- @warning = Reek::Examiner.new(src, ['UtilityFunction']).smells[0]
20
+ Reek::Examiner.new(src, ['UtilityFunction']).smells[0]
25
21
  end
26
22
 
27
23
  it_should_behave_like 'common fields set correctly'
28
24
 
29
25
  it 'reports the line number of the method' do
30
- expect(@warning.lines).to eq([1])
26
+ expect(warning.lines).to eq([1])
31
27
  end
32
28
  end
33
29
  end
@@ -158,7 +154,7 @@ RSpec.describe Reek::Smells::UtilityFunction do
158
154
 
159
155
  context 'with only one call' do
160
156
  it 'reports a call to a parameter' do
161
- expect('def simple(arga) arga.to_s end').to reek_of(:UtilityFunction, name: 'simple')
157
+ expect('def simple(arga) arga.to_s end').to reek_of(:UtilityFunction, name: 'simple')
162
158
  end
163
159
 
164
160
  it 'reports a call to a constant' do
@@ -169,7 +165,7 @@ RSpec.describe Reek::Smells::UtilityFunction do
169
165
  context 'with two or more calls' do
170
166
  it 'reports two calls' do
171
167
  src = 'def simple(arga) arga.to_s + arga.to_i end'
172
- expect(src).to reek_of(:UtilityFunction, name: 'simple')
168
+ expect(src).to reek_of(:UtilityFunction, name: 'simple')
173
169
  expect(src).not_to reek_of(:FeatureEnvy)
174
170
  end
175
171
 
@@ -194,7 +190,7 @@ RSpec.describe Reek::Smells::UtilityFunction do
194
190
 
195
191
  it 'should report message chain' do
196
192
  src = 'def simple(arga) arga.b.c end'
197
- expect(src).to reek_of(:UtilityFunction, name: 'simple')
193
+ expect(src).to reek_of(:UtilityFunction, name: 'simple')
198
194
  expect(src).not_to reek_of(:FeatureEnvy)
199
195
  end
200
196
 
@@ -26,16 +26,13 @@ RSpec.describe Reek::Source::SourceCode do
26
26
  end
27
27
 
28
28
  context 'when the parser fails' do
29
+ let(:catcher) { StringIO.new }
29
30
  let(:source_name) { 'Test source' }
30
31
  let(:error_message) { 'Error message' }
31
32
  let(:parser) { double('parser') }
32
33
  let(:src) { Reek::Source::SourceCode.new('', source_name, parser) }
33
34
 
34
- before :each do
35
- @catcher = StringIO.new
36
- @old_std_err = $stderr
37
- $stderr = @catcher
38
- end
35
+ before { $stderr = catcher }
39
36
 
40
37
  shared_examples_for 'handling and recording the error' do
41
38
  it 'does not raise an error' do
@@ -48,17 +45,17 @@ RSpec.describe Reek::Source::SourceCode do
48
45
 
49
46
  it 'records the syntax error' do
50
47
  src.syntax_tree
51
- expect(@catcher.string).to match(error_class.name)
48
+ expect(catcher.string).to match(error_class.name)
52
49
  end
53
50
 
54
51
  it 'records the source name' do
55
52
  src.syntax_tree
56
- expect(@catcher.string).to match(source_name)
53
+ expect(catcher.string).to match(source_name)
57
54
  end
58
55
 
59
56
  it 'records the error message' do
60
57
  src.syntax_tree
61
- expect(@catcher.string).to match(error_message)
58
+ expect(catcher.string).to match(error_message)
62
59
  end
63
60
  end
64
61
 
@@ -98,8 +95,6 @@ RSpec.describe Reek::Source::SourceCode do
98
95
  end
99
96
  end
100
97
 
101
- after :each do
102
- $stderr = @old_std_err
103
- end
98
+ after { $stderr = STDERR }
104
99
  end
105
100
  end
@@ -4,71 +4,60 @@ require_relative '../../../lib/reek/spec'
4
4
 
5
5
  RSpec.describe Reek::Spec::ShouldReekOf do
6
6
  context 'rdoc demo example' do
7
- before :each do
8
- @ruby = 'def double_thing() @other.thing.foo + @other.thing.foo end'
9
- end
7
+ let(:ruby) { 'def double_thing() @other.thing.foo + @other.thing.foo end' }
10
8
 
11
9
  it 'reports duplicate calls to @other.thing' do
12
- expect(@ruby).to reek_of(:Duplication, name: '@other.thing')
10
+ expect(ruby).to reek_of(:Duplication, name: '@other.thing')
13
11
  end
14
12
 
15
13
  it 'reports duplicate calls to @other.thing.foo' do
16
- expect(@ruby).to reek_of(:Duplication, name: '@other.thing.foo')
14
+ expect(ruby).to reek_of(:Duplication, name: '@other.thing.foo')
17
15
  end
18
16
 
19
17
  it 'does not report any feature envy' do
20
- expect(@ruby).not_to reek_of(:FeatureEnvy)
18
+ expect(ruby).not_to reek_of(:FeatureEnvy)
21
19
  end
22
20
  end
23
21
 
24
22
  context 'checking code in a string' do
25
- before :each do
26
- @clean_code = 'def good() true; end'
27
- @smelly_code = 'def x() y = 4; end'
28
- @matcher = Reek::Spec::ShouldReekOf.new(:UncommunicativeVariableName,
29
- name: 'y')
30
- end
23
+ let(:clean_code) { 'def good() true; end' }
24
+ let(:matcher) { Reek::Spec::ShouldReekOf.new(:UncommunicativeVariableName, name: 'y') }
25
+ let(:smelly_code) { 'def x() y = 4; end' }
31
26
 
32
27
  it 'matches a smelly String' do
33
- expect(@matcher.matches?(@smelly_code)).to be_truthy
28
+ expect(matcher.matches?(smelly_code)).to be_truthy
34
29
  end
35
30
 
36
31
  it 'doesnt match a fragrant String' do
37
- expect(@matcher.matches?(@clean_code)).to be_falsey
32
+ expect(matcher.matches?(clean_code)).to be_falsey
38
33
  end
39
34
 
40
35
  it 'reports the smells when should_not fails' do
41
- expect(@matcher.matches?(@smelly_code)).to be_truthy
42
- expect(@matcher.failure_message_when_negated).to match('UncommunicativeVariableName')
36
+ expect(matcher.matches?(smelly_code)).to be_truthy
37
+ expect(matcher.failure_message_when_negated).to match('UncommunicativeVariableName')
43
38
  end
44
39
  end
45
40
 
46
41
  context 'passing in smell_details with unknown parameter name' do
47
- before :each do
48
- @smelly_code = 'def x() y = 4; end'
49
- @matcher = Reek::Spec::ShouldReekOf.new(:UncommunicativeVariableName,
50
- foo: 'y')
51
- end
42
+ let(:matcher) { Reek::Spec::ShouldReekOf.new(:UncommunicativeVariableName, foo: 'y') }
43
+ let(:smelly_code) { 'def x() y = 4; end' }
52
44
 
53
45
  it 'raises ArgumentError' do
54
- expect { @matcher.matches?(@smelly_code) }.to raise_error(ArgumentError)
46
+ expect { matcher.matches?(smelly_code) }.to raise_error(ArgumentError)
55
47
  end
56
48
  end
57
49
 
58
50
  context 'checking code in a File' do
59
- before :each do
60
- @clean_file = Pathname.glob("#{SAMPLES_PATH}/three_clean_files/*.rb").first
61
- @smelly_file = Pathname.glob("#{SAMPLES_PATH}/two_smelly_files/*.rb").first
62
- @matcher = Reek::Spec::ShouldReekOf.new(:UncommunicativeVariableName,
63
- name: '@s')
64
- end
51
+ let(:clean_file) { Pathname.glob("#{SAMPLES_PATH}/three_clean_files/*.rb").first }
52
+ let(:matcher) { Reek::Spec::ShouldReekOf.new(:UncommunicativeVariableName, name: '@s') }
53
+ let(:smelly_file) { Pathname.glob("#{SAMPLES_PATH}/two_smelly_files/*.rb").first }
65
54
 
66
55
  it 'matches a smelly String' do
67
- expect(@matcher.matches?(@smelly_file)).to be_truthy
56
+ expect(matcher.matches?(smelly_file)).to be_truthy
68
57
  end
69
58
 
70
59
  it 'doesnt match a fragrant String' do
71
- expect(@matcher.matches?(@clean_file)).to be_falsey
60
+ expect(matcher.matches?(clean_file)).to be_falsey
72
61
  end
73
62
  end
74
63
  end
@@ -2,50 +2,46 @@ require_relative '../../spec_helper'
2
2
  require_relative '../../../lib/reek/spec'
3
3
 
4
4
  RSpec.describe Reek::Spec::ShouldReekOnlyOf do
5
- before :each do
6
- @expected_smell_type = :NestedIterators
7
- @expected_context_name = 'SmellyClass#big_method'
8
- @matcher = Reek::Spec::ShouldReekOnlyOf.new(@expected_smell_type)
9
- @examiner = double('examiner').as_null_object
10
- expect(@examiner).to receive(:smells) { smells }
11
- @match = @matcher.matches_examiner?(@examiner)
5
+ let(:examiner) { double('examiner').as_null_object }
6
+ let(:expected_context_name) { 'SmellyClass#big_method' }
7
+ let(:expected_smell_type) { :NestedIterators }
8
+ let(:matcher) { Reek::Spec::ShouldReekOnlyOf.new(expected_smell_type) }
9
+ let(:matcher_matches) { matcher.matches_examiner?(examiner) }
10
+
11
+ before do
12
+ expect(examiner).to receive(:smells) { smells }
13
+ matcher_matches
12
14
  end
13
15
 
14
16
  shared_examples_for 'no match' do
15
17
  it 'does not match' do
16
- expect(@match).to be_falsey
18
+ expect(matcher_matches).to be_falsey
17
19
  end
18
20
 
19
21
  context 'when a match was expected' do
20
- before :each do
21
- @source = 'the_path/to_a/source_file.rb'
22
- expect(@examiner).to receive(:description).and_return(@source)
23
- end
22
+ let(:source) { 'the_path/to_a/source_file.rb' }
23
+
24
+ before { expect(examiner).to receive(:description).and_return(source) }
24
25
 
25
26
  it 'reports the source' do
26
- expect(@matcher.failure_message).to match(@source)
27
+ expect(matcher.failure_message).to match(source)
27
28
  end
28
29
 
29
30
  it 'reports the expected smell class' do
30
- expect(@matcher.failure_message).to match(@expected_smell_type.to_s)
31
+ expect(matcher.failure_message).to match(expected_smell_type.to_s)
31
32
  end
32
33
  end
33
34
  end
34
35
 
35
36
  context 'with no smells' do
36
- def smells
37
- []
38
- end
37
+ let(:smells) { [] }
39
38
 
40
39
  it_should_behave_like 'no match'
41
40
  end
42
41
 
43
42
  context 'with 1 non-matching smell' do
44
43
  let(:control_couple_detector) { build(:smell_detector, smell_type: 'ControlParameter') }
45
-
46
- def smells
47
- [build(:smell_warning, smell_detector: control_couple_detector)]
48
- end
44
+ let(:smells) { [build(:smell_warning, smell_detector: control_couple_detector)] }
49
45
 
50
46
  it_should_behave_like 'no match'
51
47
  end
@@ -53,8 +49,7 @@ RSpec.describe Reek::Spec::ShouldReekOnlyOf do
53
49
  context 'with 2 non-matching smells' do
54
50
  let(:control_couple_detector) { build(:smell_detector, smell_type: 'ControlParameter') }
55
51
  let(:feature_envy_detector) { build(:smell_detector, smell_type: 'FeatureEnvy') }
56
-
57
- def smells
52
+ let(:smells) do
58
53
  [
59
54
  build(:smell_warning, smell_detector: control_couple_detector),
60
55
  build(:smell_warning, smell_detector: feature_envy_detector)
@@ -66,13 +61,12 @@ RSpec.describe Reek::Spec::ShouldReekOnlyOf do
66
61
 
67
62
  context 'with 1 non-matching and 1 matching smell' do
68
63
  let(:control_couple_detector) { build(:smell_detector, smell_type: 'ControlParameter') }
69
-
70
- def smells
71
- detector = build(:smell_detector, smell_type: @expected_smell_type.to_s)
64
+ let(:smells) do
65
+ detector = build(:smell_detector, smell_type: expected_smell_type.to_s)
72
66
  [
73
67
  build(:smell_warning, smell_detector: control_couple_detector),
74
68
  build(:smell_warning, smell_detector: detector,
75
- message: "message mentioning #{@expected_context_name}")
69
+ message: "message mentioning #{expected_context_name}")
76
70
  ]
77
71
  end
78
72
 
@@ -80,25 +74,25 @@ RSpec.describe Reek::Spec::ShouldReekOnlyOf do
80
74
  end
81
75
 
82
76
  context 'with 1 matching smell' do
83
- def smells
84
- detector = build(:smell_detector, smell_type: @expected_smell_type.to_s)
77
+ let(:smells) do
78
+ detector = build(:smell_detector, smell_type: expected_smell_type.to_s)
85
79
 
86
80
  [build(:smell_warning, smell_detector: detector,
87
- message: "message mentioning #{@expected_context_name}")]
81
+ message: "message mentioning #{expected_context_name}")]
88
82
  end
89
83
 
90
84
  it 'matches' do
91
- expect(@match).to be_truthy
85
+ expect(matcher_matches).to be_truthy
92
86
  end
93
87
 
94
88
  it 'reports the expected smell when no match was expected' do
95
- expect(@matcher.failure_message_when_negated).to match(@expected_smell_type.to_s)
89
+ expect(matcher.failure_message_when_negated).to match(expected_smell_type.to_s)
96
90
  end
97
91
 
98
92
  it 'reports the source when no match was expected' do
99
93
  source = 'the_path/to_a/source_file.rb'
100
- expect(@examiner).to receive(:description).and_return(source)
101
- expect(@matcher.failure_message_when_negated).to match(source)
94
+ expect(examiner).to receive(:description).and_return(source)
95
+ expect(matcher.failure_message_when_negated).to match(source)
102
96
  end
103
97
  end
104
98
  end