add the fetch method to sessions

This commit is contained in:
Damien Mathieu 2013-10-29 17:00:45 +01:00
parent df2226ea16
commit 84c9f4164b
3 changed files with 37 additions and 0 deletions

@ -1,3 +1,15 @@
* Add `session#fetch` method
fetch behaves like [Hash#fetch](http://www.ruby-doc.org/core-1.9.3/Hash.html#method-i-fetch).
It returns a value from the hash for the given key.
If the key cant be found, there are several options:
* With no other arguments, it will raise an KeyError exception.
* If a default value is given, then that will be returned.
* If the optional code block is specified, then that will be run and its result returned.
*Damien Mathieu*
* Don't let strong parameters mutate the given hash via `fetch`
Create a new instance if the given parameter is a `Hash` instead of

@ -127,6 +127,18 @@ def delete(key)
@delegate.delete key.to_s
end
def fetch(key, default=nil)
if self.key?(key)
self[key]
elsif default
self[key] = default
elsif block_given?
self[key] = yield(key)
else
raise KeyError
end
end
def inspect
if loaded?
super

@ -61,6 +61,19 @@ def test_clear
assert_equal([], s.values)
end
def test_fetch
session = Session.create(store, {}, {})
session['one'] = '1'
assert_equal '1', session.fetch(:one)
assert_equal '2', session.fetch(:two, '2')
assert_equal 'three', session.fetch(:three) {|el| el.to_s }
assert_raise KeyError do
session.fetch(:four)
end
end
private
def store
Class.new {