RConditions
RConditions generates a bang method (for example, Array#empty!) for each predicate method (for example, Array#empty?). The bang method will pass if the predicate method passes, otherwise it will throw an exception. The exception will include auto-generated modules that give information which predicate methods passed or failed in the bang method’s execution.
Download
RConditions is hosted on RubyForge, and published as a gem. Installation is straightforward:
-
Install RubyGems
-
gem install rconditions
You may also download the gem on RConditions’s RubyForge project page.
Example
require "rconditions"
class Posting
attr_writer :spam, :active
def spam?
@spam
end
def active?
@active
end
def visible?
!spam? && active?
end
end
class User
attr_writer :admin
def admin?
@admin
end
def can_view_posting?(posting)
admin? || posting.visible?
end
end
user = User.new
user.admin = false
posting = Posting.new
posting.active = false
posting.spam = true
begin
user.can_view_posting!(posting)
rescue Posting::SpamError => e
p e
rescue Posting::NotActiveError
puts "should not get here"
end
# => #<Exception: User::NotAdminError, Posting::SpamError,
# Posting::NotVisibleError, User::NotCanViewPostingError>
As you can see, the raised exception includes modules for each of the evaluated predicate methods: User#can_view_posting!(posting) in the context above called User#can_view_posting?(posting), which called User#admin? and Posting#visible?, which called Posting#spam?.
The results were
-
User#admin? # => false -
Posting#spam? # => true -
Posting#visible? # => false -
User#can_view_posting? # => false
The names of the included exception modules are derived from the names of the predicate methods:
-
User::NotAdminError -
Posting::SpamError -
Posting::NotVisibleError -
User::NotCanViewPostingError
Performance
As almost all predicate methods are extended by default, RConditions carries a performance penalty which varies with the number of calls to predicate methods. A simple test setup using mongrel/rails was slowed down by more than 30% by adding require "rconditions" to the bottom of its enviroment.rb.
The performance penalty can be avoided by applying RConditions only to new methods, that is, methods defined after require "rconditions". To achieve this, set ::RCONDITIONS_ONLY_FOR_NEW_METHODS = true before the require call. Our test setup had no measurable slowdown afterwards.
Supported Ruby Versions
The test suite of RConditions passes for
-
ruby 1.8.6
-
ruby 1.9.0 (tested with revision 13680)
-
jruby 1.1 (tested with revision 4574)
If you use another ruby version, please check whether the tests pass.
Limitations
-
RConditions only processes predicate methods starting with a letter and containing only word characters except the question mark at the end.
-
Kernel#block_given?is not processed. -
Singleton methods on classes and modules are not processed.
License
RConditions is released under the MIT license.
Authors
RConditions is written by Norman Timmler and Tammo Freese.