Module: Reek::Spec

Defined in:
lib/reek/spec.rb

Overview

Provides matchers for Rspec, making it easy to check code quality.

If you require this module somewhere within your spec (or in your spec_helper), Reek will arrange to update Spec::Runner’s config so that it knows about the matchers defined here.

Examples

Here’s a spec that ensures there are no smell warnings in the current project:

describe 'source code quality' do
  Dir['lib/**/*.rb'].each do |path|
    it "reports no smells in #{path}" do
      File.new(path).should_not reek
    end
  end
end

And here’s an even simpler way to do the same:

it 'has no code smells' do
  Dir['lib/**/*.rb'].should_not reek
end

Here’s a simple check of a code fragment:

'def equals(other) other.thing == self.thing end'.should_not reek

And a more complex example, making use of one of the factory methods for Source so that the code is parsed and analysed only once:

ruby = 'def double_thing() @other.thing.foo + @other.thing.foo end'.to_source
ruby.should reek_of(:Duplication, /@other.thing[^\.]/)
ruby.should reek_of(:Duplication, /@other.thing.foo/)
ruby.should_not reek_of(:FeatureEnvy)

Defined Under Namespace

Classes: ShouldReek, ShouldReekOf, ShouldReekOnlyOf

Instance Method Summary collapse

Instance Method Details

#reekObject

Returns true if and only if the target source code contains smells.



59
60
61
# File 'lib/reek/spec.rb', line 59

def reek
  ShouldReek.new
end

#reek_of(smell_class, *patterns) ⇒ Object

Checks the target source code for instances of smell_class, and returns true only if one of them has a report string matching all of the patterns.



85
86
87
# File 'lib/reek/spec.rb', line 85

def reek_of(smell_class, *patterns)
  ShouldReekOf.new(smell_class, patterns)
end

#reek_only_of(smell_class, *patterns) ⇒ Object

As for reek_of, but the matched smell warning must be the only warning of any kind in the target source code’s Reek report.



110
111
112
# File 'lib/reek/spec.rb', line 110

def reek_only_of(smell_class, *patterns)
  ShouldReekOnlyOf.new(smell_class, patterns)
end