reek 4.7.2 → 4.7.3

Sign up to get free protection for your applications and to get access to all the features.
Files changed (77) hide show
  1. checksums.yaml +4 -4
  2. data/.rubocop.yml +18 -4
  3. data/.travis.yml +0 -5
  4. data/CHANGELOG.md +8 -0
  5. data/CONTRIBUTING.md +1 -1
  6. data/Gemfile +4 -4
  7. data/docs/How-To-Write-New-Detectors.md +6 -5
  8. data/docs/Unused-Private-Method.md +1 -1
  9. data/features/configuration_via_source_comments/erroneous_source_comments.feature +1 -1
  10. data/features/locales.feature +32 -0
  11. data/features/rake_task/rake_task.feature +46 -6
  12. data/features/rspec_matcher.feature +32 -0
  13. data/features/step_definitions/reek_steps.rb +0 -4
  14. data/features/support/env.rb +0 -9
  15. data/lib/reek/ast/builder.rb +1 -1
  16. data/lib/reek/ast/sexp_extensions/send.rb +0 -4
  17. data/lib/reek/cli/options.rb +2 -2
  18. data/lib/reek/configuration/app_configuration.rb +3 -2
  19. data/lib/reek/configuration/configuration_file_finder.rb +3 -3
  20. data/lib/reek/context/ghost_context.rb +0 -2
  21. data/lib/reek/context/module_context.rb +0 -3
  22. data/lib/reek/context_builder.rb +2 -4
  23. data/lib/reek/errors/bad_detector_configuration_key_in_comment_error.rb +2 -2
  24. data/lib/reek/errors/bad_detector_in_comment_error.rb +2 -2
  25. data/lib/reek/errors/encoding_error.rb +38 -0
  26. data/lib/reek/errors/garbage_detector_configuration_in_comment_error.rb +3 -3
  27. data/lib/reek/errors/incomprehensible_source_error.rb +4 -4
  28. data/lib/reek/examiner.rb +15 -11
  29. data/lib/reek/rake/task.rb +5 -1
  30. data/lib/reek/smell_detectors/attribute.rb +6 -11
  31. data/lib/reek/smell_detectors/base_detector.rb +9 -1
  32. data/lib/reek/smell_detectors/boolean_parameter.rb +4 -5
  33. data/lib/reek/smell_detectors/class_variable.rb +5 -6
  34. data/lib/reek/smell_detectors/control_parameter.rb +3 -3
  35. data/lib/reek/smell_detectors/data_clump.rb +13 -6
  36. data/lib/reek/smell_detectors/duplicate_method_call.rb +18 -11
  37. data/lib/reek/smell_detectors/feature_envy.rb +9 -7
  38. data/lib/reek/smell_detectors/instance_variable_assumption.rb +14 -14
  39. data/lib/reek/smell_detectors/irresponsible_module.rb +6 -12
  40. data/lib/reek/smell_detectors/long_parameter_list.rb +10 -6
  41. data/lib/reek/smell_detectors/long_yield_list.rb +9 -5
  42. data/lib/reek/smell_detectors/manual_dispatch.rb +3 -4
  43. data/lib/reek/smell_detectors/module_initialize.rb +4 -5
  44. data/lib/reek/smell_detectors/nested_iterators.rb +11 -19
  45. data/lib/reek/smell_detectors/nil_check.rb +9 -15
  46. data/lib/reek/smell_detectors/prima_donna_method.rb +17 -16
  47. data/lib/reek/smell_detectors/repeated_conditional.rb +11 -8
  48. data/lib/reek/smell_detectors/subclassed_from_core_class.rb +8 -8
  49. data/lib/reek/smell_detectors/too_many_constants.rb +10 -8
  50. data/lib/reek/smell_detectors/too_many_instance_variables.rb +10 -5
  51. data/lib/reek/smell_detectors/too_many_methods.rb +11 -6
  52. data/lib/reek/smell_detectors/too_many_statements.rb +10 -5
  53. data/lib/reek/smell_detectors/uncommunicative_method_name.rb +8 -8
  54. data/lib/reek/smell_detectors/uncommunicative_module_name.rb +12 -15
  55. data/lib/reek/smell_detectors/uncommunicative_parameter_name.rb +10 -13
  56. data/lib/reek/smell_detectors/uncommunicative_variable_name.rb +23 -23
  57. data/lib/reek/smell_detectors/unused_parameters.rb +5 -6
  58. data/lib/reek/smell_detectors/unused_private_method.rb +11 -18
  59. data/lib/reek/smell_detectors/utility_function.rb +12 -15
  60. data/lib/reek/source/source_code.rb +27 -6
  61. data/lib/reek/source/source_locator.rb +1 -1
  62. data/lib/reek/spec.rb +1 -1
  63. data/lib/reek/version.rb +1 -1
  64. data/reek.gemspec +0 -2
  65. data/spec/reek/ast/sexp_extensions_spec.rb +12 -32
  66. data/spec/reek/cli/application_spec.rb +4 -6
  67. data/spec/reek/configuration/configuration_file_finder_spec.rb +0 -2
  68. data/spec/reek/examiner_spec.rb +38 -1
  69. data/spec/reek/rake/task_spec.rb +25 -2
  70. data/spec/reek/smell_detectors/base_detector_spec.rb +4 -5
  71. data/spec/reek/smell_detectors/prima_donna_method_spec.rb +3 -3
  72. data/spec/reek/source/source_code_spec.rb +28 -1
  73. data/spec/reek/spec/should_reek_of_spec.rb +18 -18
  74. data/spec/reek/spec/should_reek_spec.rb +5 -5
  75. data/spec/reek/spec/smell_matcher_spec.rb +20 -20
  76. data/spec/spec_helper.rb +1 -1
  77. metadata +6 -3
@@ -7,9 +7,10 @@ end
7
7
  require_relative '../tree_dresser'
8
8
  require_relative '../ast/node'
9
9
  require_relative '../ast/builder'
10
+ require_relative '../errors/encoding_error'
10
11
 
11
12
  # Opt in to new way of representing lambdas
12
- Parser::Builders::Default.emit_lambda = true
13
+ Reek::AST::Builder.emit_lambda = true
13
14
 
14
15
  module Reek
15
16
  module Source
@@ -20,7 +21,7 @@ module Reek
20
21
  IO_IDENTIFIER = 'STDIN'.freeze
21
22
  STRING_IDENTIFIER = 'string'.freeze
22
23
 
23
- attr_reader :origin, :diagnostics, :syntax_tree
24
+ attr_reader :origin
24
25
 
25
26
  # Initializer.
26
27
  #
@@ -30,7 +31,8 @@ module Reek
30
31
  def initialize(code:, origin:, parser: default_parser)
31
32
  @origin = origin
32
33
  @diagnostics = []
33
- @syntax_tree = parse(parser, code)
34
+ @parser = parser
35
+ @code = code
34
36
  end
35
37
 
36
38
  # Initializes an instance of SourceCode given a source.
@@ -54,11 +56,24 @@ module Reek
54
56
 
55
57
  # @return [true|false] Returns true if parsed file does not have any syntax errors.
56
58
  def valid_syntax?
57
- @diagnostics.none? { |diagnostic| [:error, :fatal].include?(diagnostic.level) }
59
+ diagnostics.none? { |diagnostic| [:error, :fatal].include?(diagnostic.level) }
60
+ end
61
+
62
+ def diagnostics
63
+ parse_if_needed
64
+ @diagnostics
65
+ end
66
+
67
+ def syntax_tree
68
+ parse_if_needed
58
69
  end
59
70
 
60
71
  private
61
72
 
73
+ def parse_if_needed
74
+ @syntax_tree ||= parse(@parser, @code)
75
+ end
76
+
62
77
  attr_reader :source
63
78
 
64
79
  # Parses the given source into an AST and associates the source code comments with it.
@@ -94,9 +109,15 @@ module Reek
94
109
  # @param source [String] - Ruby code
95
110
  # @return [Anonymous subclass of Reek::AST::Node] the AST presentation
96
111
  # for the given source
112
+ # :reek:TooManyStatements { max_statements: 8 }
97
113
  def parse(parser, source)
98
- buffer = Parser::Source::Buffer.new(origin, 1)
99
- buffer.source = source
114
+ begin
115
+ buffer = Parser::Source::Buffer.new(origin, 1)
116
+ source.force_encoding(Encoding::UTF_8)
117
+ buffer.source = source
118
+ rescue EncodingError => exception
119
+ raise Errors::EncodingError, origin: origin, original_exception: exception
120
+ end
100
121
  begin
101
122
  ast, comments = parser.parse_with_comments(buffer)
102
123
  rescue Parser::SyntaxError # rubocop:disable Lint/HandleExceptions
@@ -69,7 +69,7 @@ module Reek
69
69
 
70
70
  # :reek:UtilityFunction
71
71
  def print_no_such_file_error(path)
72
- $stderr.puts "Error: No such file - #{path}"
72
+ warn "Error: No such file - #{path}"
73
73
  end
74
74
 
75
75
  # :reek:UtilityFunction
@@ -114,7 +114,7 @@ module Reek
114
114
  # @public
115
115
  #
116
116
  # :reek:UtilityFunction
117
- def reek(configuration = Configuration::AppConfiguration.default)
117
+ def reek(configuration = Configuration::AppConfiguration.from_path)
118
118
  ShouldReek.new(configuration: configuration)
119
119
  end
120
120
  end
@@ -8,6 +8,6 @@ module Reek
8
8
  # @public
9
9
  module Version
10
10
  # @public
11
- STRING = '4.7.2'.freeze
11
+ STRING = '4.7.3'.freeze
12
12
  end
13
13
  end
@@ -1,5 +1,3 @@
1
- # -*- encoding: utf-8 -*-
2
-
3
1
  require File.join(File.dirname(__FILE__), 'lib/reek/version')
4
2
 
5
3
  Gem::Specification.new do |s|
@@ -303,12 +303,8 @@ RSpec.describe Reek::AST::SexpExtensions::SendNode do
303
303
  context 'with no parameters' do
304
304
  let(:node) { sexp(:send, nil, :hello) }
305
305
 
306
- it 'has no argument names' do
307
- expect(node.arg_names).to eq []
308
- end
309
-
310
306
  it 'is not considered to be a writable attr' do
311
- expect(sexp(:send, nil, :attr).attr_with_writable_flag?).to be_falsey
307
+ expect(sexp(:send, nil, :attr)).not_to be_attr_with_writable_flag
312
308
  end
313
309
  end
314
310
 
@@ -316,15 +312,15 @@ RSpec.describe Reek::AST::SexpExtensions::SendNode do
316
312
  let(:bare_new) { sexp(:send, nil, :new) }
317
313
 
318
314
  it 'is not considered to be a module creation call' do
319
- expect(bare_new.module_creation_call?).to be_falsey
315
+ expect(bare_new).not_to be_module_creation_call
320
316
  end
321
317
 
322
318
  it 'is not considered to have a module creation receiver' do
323
- expect(bare_new.module_creation_receiver?).to be_falsey
319
+ expect(bare_new).not_to be_module_creation_receiver
324
320
  end
325
321
 
326
322
  it 'is considered to be an object creation call' do
327
- expect(bare_new.object_creation_call?).to be_truthy
323
+ expect(bare_new).to be_object_creation_call
328
324
  end
329
325
  end
330
326
 
@@ -332,31 +328,15 @@ RSpec.describe Reek::AST::SexpExtensions::SendNode do
332
328
  let(:node) { Reek::Source::SourceCode.from('(foo ? bar : baz).new').syntax_tree }
333
329
 
334
330
  it 'is not considered to be a module creation call' do
335
- expect(node.module_creation_call?).to be_falsey
331
+ expect(node).not_to be_module_creation_call
336
332
  end
337
333
 
338
334
  it 'is not considered to have a module creation receiver' do
339
- expect(node.module_creation_receiver?).to be_falsey
335
+ expect(node).not_to be_module_creation_receiver
340
336
  end
341
337
 
342
338
  it 'is considered to be an object creation call' do
343
- expect(node.object_creation_call?).to be_truthy
344
- end
345
- end
346
-
347
- context 'with 1 literal parameter' do
348
- let(:node) { sexp(:send, nil, :hello, sexp(:lit, :param)) }
349
-
350
- it 'has 1 argument name' do
351
- expect(node.arg_names).to eq [:param]
352
- end
353
- end
354
-
355
- context 'with 2 literal parameters' do
356
- let(:node) { sexp(:send, nil, :hello, sexp(:lit, :x), sexp(:lit, :y)) }
357
-
358
- it 'has 2 argument names' do
359
- expect(node.arg_names).to eq [:x, :y]
339
+ expect(node).to be_object_creation_call
360
340
  end
361
341
  end
362
342
  end
@@ -466,14 +446,14 @@ RSpec.describe Reek::AST::SexpExtensions::CasgnNode do
466
446
  context 'with single assignment' do
467
447
  it 'does not define a module' do
468
448
  exp = sexp(:casgn, nil, :Foo)
469
- expect(exp.defines_module?).to be_falsey
449
+ expect(exp).not_to be_defines_module
470
450
  end
471
451
  end
472
452
 
473
453
  context 'with implicit receiver to new' do
474
454
  it 'does not define a module' do
475
455
  exp = sexp(:casgn, nil, :Foo, sexp(:send, nil, :new))
476
- expect(exp.defines_module?).to be_falsey
456
+ expect(exp).not_to be_defines_module
477
457
  end
478
458
  end
479
459
 
@@ -481,7 +461,7 @@ RSpec.describe Reek::AST::SexpExtensions::CasgnNode do
481
461
  it 'does not define a module' do
482
462
  exp = Reek::Source::SourceCode.from('Foo = Class.new(Bar)').syntax_tree
483
463
 
484
- expect(exp.defines_module?).to be_truthy
464
+ expect(exp).to be_defines_module
485
465
  end
486
466
  end
487
467
 
@@ -489,7 +469,7 @@ RSpec.describe Reek::AST::SexpExtensions::CasgnNode do
489
469
  it 'does not define a module' do
490
470
  exp = Reek::Source::SourceCode.from('C = ->{}').syntax_tree
491
471
 
492
- expect(exp.defines_module?).to be_falsey
472
+ expect(exp).not_to be_defines_module
493
473
  end
494
474
  end
495
475
 
@@ -497,7 +477,7 @@ RSpec.describe Reek::AST::SexpExtensions::CasgnNode do
497
477
  it 'does not define a module' do
498
478
  exp = Reek::Source::SourceCode.from('C = "hello"').syntax_tree
499
479
 
500
- expect(exp.defines_module?).to be_falsey
480
+ expect(exp).not_to be_defines_module
501
481
  end
502
482
  end
503
483
  end
@@ -15,13 +15,11 @@ RSpec.describe Reek::CLI::Application do
15
15
  end
16
16
  end
17
17
 
18
- let(:path_excluded_in_configuration) do
19
- SAMPLES_PATH.join('source_with_exclude_paths/ignore_me/uncommunicative_method_name.rb')
20
- end
21
-
22
- let(:configuration) { test_configuration_for(CONFIG_PATH.join('with_excluded_paths.reek')) }
23
-
24
18
  describe '#execute' do
19
+ let(:path_excluded_in_configuration) do
20
+ SAMPLES_PATH.join('source_with_exclude_paths/ignore_me/uncommunicative_method_name.rb')
21
+ end
22
+ let(:configuration) { test_configuration_for(CONFIG_PATH.join('with_excluded_paths.reek')) }
25
23
  let(:command) { instance_double 'Reek::CLI::Command::ReportCommand' }
26
24
  let(:app) { described_class.new [] }
27
25
 
@@ -1,5 +1,3 @@
1
- # encoding: UTF-8
2
-
3
1
  require 'fileutils'
4
2
  require 'pathname'
5
3
  require 'tmpdir'
@@ -1,5 +1,6 @@
1
1
  require_relative '../spec_helper'
2
2
  require_lib 'reek/examiner'
3
+ require_lib 'reek/logging_error_handler'
3
4
 
4
5
  RSpec.shared_examples_for 'no smells found' do
5
6
  it 'is not smelly' do
@@ -107,7 +108,7 @@ RSpec.describe Reek::Examiner do
107
108
  end
108
109
  end
109
110
 
110
- context 'with an incomprehensible source that causes Reek to crash' do
111
+ context 'with an incomprehensible source that causes the detectors to crash' do
111
112
  let(:source) { 'class C; def does_crash_reek; end; end' }
112
113
 
113
114
  let(:examiner) do
@@ -143,6 +144,42 @@ RSpec.describe Reek::Examiner do
143
144
  end
144
145
  end
145
146
 
147
+ context 'when the source causes the source buffer to crash' do
148
+ let(:source) { 'I make the buffer crash' }
149
+
150
+ before do
151
+ buffer = double
152
+ allow(buffer).to receive(:source=) { raise RuntimeError }
153
+ allow(Parser::Source::Buffer).to receive(:new).and_return(buffer)
154
+ end
155
+
156
+ context 'if the error handler does not handle the error' do
157
+ let(:examiner) { described_class.new(source) }
158
+
159
+ it 'does not raise an error during initialization' do
160
+ expect { examiner }.not_to raise_error
161
+ end
162
+
163
+ it 'raises an incomprehensible source error when asked for smells' do
164
+ expect { examiner.smells }.to raise_error Reek::Errors::IncomprehensibleSourceError
165
+ end
166
+ end
167
+
168
+ context 'if the error handler handles the error' do
169
+ let(:handler) { instance_double(Reek::LoggingErrorHandler, handle: true) }
170
+ let(:examiner) { described_class.new(source, error_handler: handler) }
171
+
172
+ it 'does not raise an error when asked for smells' do
173
+ expect { examiner.smells }.not_to raise_error
174
+ end
175
+
176
+ it 'passes the wrapped error to the handler' do
177
+ examiner.smells
178
+ expect(handler).to have_received(:handle).with(Reek::Errors::IncomprehensibleSourceError)
179
+ end
180
+ end
181
+ end
182
+
146
183
  describe 'bad comment config' do
147
184
  let(:examiner) { described_class.new(source) }
148
185
 
@@ -7,14 +7,37 @@ RSpec.describe Reek::Rake::Task do
7
7
  task = described_class.new
8
8
  expect(task.source_files).to eq FileList['lib/**/*.rb']
9
9
  end
10
+
11
+ it 'is set to ENV["REEK_SRC"]' do
12
+ begin
13
+ ENV['REEK_SRC'] = '*.rb'
14
+ task = described_class.new
15
+ expect(task.source_files).to eq FileList['*.rb']
16
+ ensure
17
+ ENV['REEK_SRC'] = nil
18
+ end
19
+ end
10
20
  end
11
21
 
12
22
  describe '#source_files=' do
13
23
  it 'sets source_files to a FileList when passed a string' do
14
- task = described_class.new
15
- task.source_files = '*.rb'
24
+ task = described_class.new do |it|
25
+ it.source_files = '*.rb'
26
+ end
16
27
  expect(task.source_files).to eq FileList['*.rb']
17
28
  end
29
+
30
+ it 'has no effect when ENV["REEK_SRC"] is set' do
31
+ begin
32
+ ENV['REEK_SRC'] = '*.rb'
33
+ task = described_class.new do |it|
34
+ it.source_files = 'lib/*.rb'
35
+ end
36
+ expect(task.source_files).to eq FileList['*.rb']
37
+ ensure
38
+ ENV['REEK_SRC'] = nil
39
+ end
40
+ end
18
41
  end
19
42
 
20
43
  # SMELL: Testing a private method
@@ -21,16 +21,15 @@ RSpec.describe Reek::SmellDetectors::BaseDetector do
21
21
  context 'with default exclusions present' do
22
22
  let(:subclass) { Reek::SmellDetectors::TooManyStatements }
23
23
 
24
- before do
25
- expect(subclass.default_config['exclude']).to eq ['initialize']
26
- end
27
-
28
24
  it 'includes default exclusions' do
29
25
  detector = subclass.new
30
26
  smell = create(:smell_warning, smell_detector: detector, context: 'Foo#bar')
31
27
  result = subclass.todo_configuration_for([smell])
32
28
 
33
- expect(result).to eq('TooManyStatements' => { 'exclude' => ['initialize', 'Foo#bar'] })
29
+ aggregate_failures do
30
+ expect(subclass.default_config['exclude']).to eq ['initialize']
31
+ expect(result).to eq('TooManyStatements' => { 'exclude' => ['initialize', 'Foo#bar'] })
32
+ end
34
33
  end
35
34
  end
36
35
  end
@@ -11,7 +11,7 @@ RSpec.describe Reek::SmellDetectors::PrimaDonnaMethod do
11
11
  EOS
12
12
 
13
13
  expect(src).to reek_of(:PrimaDonnaMethod,
14
- lines: [1],
14
+ lines: [2],
15
15
  context: 'Alfa',
16
16
  message: "has prima donna method 'bravo!'",
17
17
  source: 'string',
@@ -30,8 +30,8 @@ RSpec.describe Reek::SmellDetectors::PrimaDonnaMethod do
30
30
  EOS
31
31
 
32
32
  expect(src).
33
- to reek_of(:PrimaDonnaMethod, lines: [1], name: 'bravo!').
34
- and reek_of(:PrimaDonnaMethod, lines: [1], name: 'charlie!')
33
+ to reek_of(:PrimaDonnaMethod, lines: [2], name: 'bravo!').
34
+ and reek_of(:PrimaDonnaMethod, lines: [5], name: 'charlie!')
35
35
  end
36
36
 
37
37
  it 'reports nothing when method and bang counterpart exist' do
@@ -30,6 +30,33 @@ RSpec.describe Reek::Source::SourceCode do
30
30
  result = source_code.syntax_tree
31
31
  expect(result.children.first).to eq "\xFF"
32
32
  end
33
+
34
+ it 'returns a :lambda node for lambda expressions' do
35
+ source = '->() { }'
36
+ source_code = described_class.new(code: source, origin: '(string)')
37
+ result = source_code.syntax_tree
38
+ expect(result.children.first.type).to eq :lambda
39
+ end
40
+ end
41
+
42
+ context 'with a source that triggers an encoding error' do
43
+ let(:source_name) { 'Bad source' }
44
+ let(:code) do
45
+ <<-SRC.strip_heredoc
46
+ # encoding: US-ASCII
47
+ puts 'こんにちは世界'
48
+ SRC
49
+ end
50
+ let(:src) { described_class.new(code: code, origin: source_name) }
51
+
52
+ it 'raises an encoding error' do
53
+ expect { src.syntax_tree }.to raise_error Reek::Errors::EncodingError
54
+ end
55
+
56
+ it 'explains the origin of the error' do
57
+ message = "Source '#{source_name}' cannot be processed by Reek due to an encoding error in the source file."
58
+ expect { src.syntax_tree }.to raise_error.with_message(/#{message}/)
59
+ end
33
60
  end
34
61
 
35
62
  context 'when the parser fails' do
@@ -58,7 +85,7 @@ RSpec.describe Reek::Source::SourceCode do
58
85
  end
59
86
 
60
87
  it 'raises the error' do
61
- expect { src }.to raise_error error_class, error_message
88
+ expect { src.valid_syntax? }.to raise_error error_class, error_message
62
89
  end
63
90
  end
64
91
  end
@@ -27,16 +27,16 @@ RSpec.describe Reek::Spec::ShouldReekOf do
27
27
  let(:smelly_code) { 'def x() y = 4; end' }
28
28
 
29
29
  it 'matches a smelly String' do
30
- expect(matcher.matches?(smelly_code)).to be_truthy
30
+ expect(matcher).to be_matches(smelly_code)
31
31
  end
32
32
 
33
33
  it 'doesnt match a fragrant String' do
34
- expect(matcher.matches?(clean_code)).to be_falsey
34
+ expect(matcher).not_to be_matches(clean_code)
35
35
  end
36
36
 
37
37
  it 're-calculates matches every time' do
38
38
  matcher.matches? smelly_code
39
- expect(matcher.matches?(clean_code)).to be_falsey
39
+ expect(matcher).not_to be_matches(clean_code)
40
40
  end
41
41
  end
42
42
 
@@ -44,11 +44,11 @@ RSpec.describe Reek::Spec::ShouldReekOf do
44
44
  let(:matcher) { described_class.new(:UncommunicativeMethodName, name: 'x') }
45
45
 
46
46
  it 'matches a smelly file' do
47
- expect(matcher.matches?(SMELLY_FILE)).to be_truthy
47
+ expect(matcher).to be_matches(SMELLY_FILE)
48
48
  end
49
49
 
50
50
  it 'doesnt match a fragrant file' do
51
- expect(matcher.matches?(CLEAN_FILE)).to be_falsey
51
+ expect(matcher).not_to be_matches(CLEAN_FILE)
52
52
  end
53
53
  end
54
54
  end
@@ -68,7 +68,7 @@ RSpec.describe Reek::Spec::ShouldReekOf do
68
68
  let(:smelly_code) { 'def x() y = 4; end' }
69
69
 
70
70
  it 'is truthy' do
71
- expect(matcher.matches?(smelly_code)).to be_truthy
71
+ expect(matcher).to be_matches(smelly_code)
72
72
  end
73
73
  end
74
74
 
@@ -79,7 +79,7 @@ RSpec.describe Reek::Spec::ShouldReekOf do
79
79
  let(:truthy_matcher) { described_class.new(:UncommunicativeVariableName, name: 'y') }
80
80
 
81
81
  it 'is falsey' do
82
- expect(falsey_matcher.matches?(smelly_code)).to be_falsey
82
+ expect(falsey_matcher).not_to be_matches(smelly_code)
83
83
  end
84
84
 
85
85
  it 'sets the proper error message' do
@@ -102,7 +102,7 @@ RSpec.describe Reek::Spec::ShouldReekOf do
102
102
  let(:matcher) { described_class.new(:DuplicateMethodCall, name: 'foo', count: 15) }
103
103
 
104
104
  it 'is falsey' do
105
- expect(matcher.matches?(smelly_code)).to be_falsey
105
+ expect(matcher).not_to be_matches(smelly_code)
106
106
  end
107
107
 
108
108
  it 'sets the proper error message' do
@@ -130,14 +130,14 @@ RSpec.describe Reek::Spec::ShouldReekOf do
130
130
  end
131
131
 
132
132
  context 'for a smell that is disabled by default' do
133
- before do
134
- default_config = Reek::SmellDetectors::UnusedPrivateMethod.default_config
135
- expect(default_config[Reek::SmellConfiguration::ENABLED_KEY]).to be_falsy
136
- end
137
-
138
133
  it 'enables the smell detector to match automatically' do
134
+ default_config = Reek::SmellDetectors::UnusedPrivateMethod.default_config
139
135
  src = 'class C; private; def foo; end; end'
140
- expect(src).to reek_of(:UnusedPrivateMethod)
136
+
137
+ aggregate_failures do
138
+ expect(default_config[Reek::SmellConfiguration::ENABLED_KEY]).to be_falsy
139
+ expect(src).to reek_of(:UnusedPrivateMethod)
140
+ end
141
141
  end
142
142
  end
143
143
 
@@ -146,13 +146,13 @@ RSpec.describe Reek::Spec::ShouldReekOf do
146
146
  let(:configured_matcher) { matcher.with_config('accept' => 'x') }
147
147
 
148
148
  it 'uses the passed-in configuration for matching' do
149
- expect(configured_matcher.matches?('def foo; q = 2; end')).to be_truthy
150
- expect(configured_matcher.matches?('def foo; x = 2; end')).to be_falsey
149
+ expect(configured_matcher).to be_matches('def foo; q = 2; end')
150
+ expect(configured_matcher).not_to be_matches('def foo; x = 2; end')
151
151
  end
152
152
 
153
153
  it 'leaves the original matcher intact' do
154
- expect(configured_matcher.matches?('def foo; x = 2; end')).to be_falsey
155
- expect(matcher.matches?('def foo; x = 2; end')).to be_truthy
154
+ expect(configured_matcher).not_to be_matches('def foo; x = 2; end')
155
+ expect(matcher).to be_matches('def foo; x = 2; end')
156
156
  end
157
157
  end
158
158
  end