class Object

Public Instance Methods

assure(expression, message = nil) click to toggle source

Raises internal error when expression evaluates to nil or false Use this to check various preconditions, for example

def do_smth(x)
  assure(x.is_a? String)
end

You can provide optional message to be printed in the exception output.

# File lib/assure.rb, line 15
def assure(expression, message = nil)
    return if expression
    file, method, line = get_caller_location_for_assure

    #Try to find expression in assert
    expression = File.readlines(file)[line.to_i-1].
        gsub(/^.*assure\s*\(\s*/, '').gsub(/\s*\)\s*$/, '')

    #cleanup path - remove rails root and "./"
    if defined? Rails
        file = file.gsub(Rails.root.to_s+'/', '')
    else
        file = file.gsub(Dir.pwd, '')
    end
    file = file.gsub(/^\.\//, '') 
    raise internal_error("#{file}:#{line}: #{method}: Assertion \"#{expression}\" failed#{message ? "\n#{message}" : ""}")
end
get_caller_location_for_assure(options = {:depth => 2}) click to toggle source
# File lib/assure.rb, line 33
def get_caller_location_for_assure(options = {:depth => 2})
    caller_method = caller(options[:depth])[0]
    #Sample output is:
    #   test/unit/assure_test.rb:9:in `test_assure
    #   test.rb:3
    caller_method =~ /([^:]+):([0-9]+)(:in `(.+)')*/
    file = $1
    line = $2
    method = $4
    [file, method, line]
end
internal_error(message = 'internal error') click to toggle source

Use this to raise internal error with a given message. This works for all modes - production, development, etc.

# File lib/assure.rb, line 5
def internal_error(message = 'internal error')
    raise message
end