Top Level Namespace

Instance Method Summary collapse

Instance Method Details

#assure(expression, message = nil) ⇒ Object

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.



15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
# 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}) ⇒ Object



33
34
35
36
37
38
39
40
41
42
43
# 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') ⇒ Object

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



5
6
7
# File 'lib/assure.rb', line 5

def internal_error(message = 'internal error')
    raise message
end