summary refs log tree commit
diff options
context:
space:
mode:
authorRafael França <rafaelmfranca@gmail.com>2016-11-04 16:35:46 -0400
committerGitHub <noreply@github.com>2016-11-04 16:35:46 -0400
commitbca0ae6f1979dbec0e2dbf51d8421c6f4781e10e (patch)
tree22c33c1f3de033bdc317242514e2317aba736f2f
parent7dd7646a932419f4d308bf2fbc91f4e77edfd4cb (diff)
parent91cc7a456f2a354d371b44dc14703f3304f42b29 (diff)
downloadrack-bca0ae6f1979dbec0e2dbf51d8421c6f4781e10e.tar.gz
Merge pull request #1125 from yannvanhalewyn/improve-fetch-on-session-hash
Improve and test SessionHash#fetch
-rw-r--r--lib/rack/session/abstract/id.rb12
-rw-r--r--test/spec_session_abstract_session_hash.rb17
2 files changed, 28 insertions, 1 deletions
diff --git a/lib/rack/session/abstract/id.rb b/lib/rack/session/abstract/id.rb
index 4c139637..ca1a2628 100644
--- a/lib/rack/session/abstract/id.rb
+++ b/lib/rack/session/abstract/id.rb
@@ -18,6 +18,8 @@ module Rack
         include Enumerable
         attr_writer :id
 
+        Unspecified = Object.new
+
         def self.find(req)
           req.get_header RACK_SESSION
         end
@@ -54,7 +56,15 @@ module Rack
           load_for_read!
           @data[key.to_s]
         end
-        alias :fetch :[]
+
+        def fetch(key, default=Unspecified, &block)
+          load_for_read!
+          if default == Unspecified
+            @data.fetch(key.to_s, &block)
+          else
+            @data.fetch(key.to_s, default, &block)
+          end
+        end
 
         def has_key?(key)
           load_for_read!
diff --git a/test/spec_session_abstract_session_hash.rb b/test/spec_session_abstract_session_hash.rb
index 6d73a80a..76b34a01 100644
--- a/test/spec_session_abstract_session_hash.rb
+++ b/test/spec_session_abstract_session_hash.rb
@@ -25,4 +25,21 @@ describe Rack::Session::Abstract::SessionHash do
     assert_equal [:bar, :qux], hash.values
   end
 
+  describe "#fetch" do
+    it "returns value for a matching key" do
+      assert_equal :bar, hash.fetch(:foo)
+    end
+
+    it "works with a default value" do
+      assert_equal :default, hash.fetch(:unknown, :default)
+    end
+
+    it "works with a block" do
+      assert_equal :default, hash.fetch(:unkown) { :default }
+    end
+
+    it "it raises when fetching unknown keys without defaults" do
+      lambda { hash.fetch(:unknown) }.must_raise KeyError
+    end
+  end
 end