Permalink
Browse files

Merge pull request #12692 from dmathieu/session_fetch

Add session#fetch
  • Loading branch information...
2 parents 671af07 + 84c9f41 commit a5e2800221b29eb5b2a3f3b831e6bc8ce4e7d534 @guilleiguaran guilleiguaran committed Oct 29, 2013
View
@@ -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 can’t 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 {

0 comments on commit a5e2800

Please sign in to comment.