summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--lib/zero/request.rb6
-rw-r--r--spec/unit/request/create_spec.rb21
2 files changed, 27 insertions, 0 deletions
diff --git a/lib/zero/request.rb b/lib/zero/request.rb
index 22c5a52..6b6ff01 100644
--- a/lib/zero/request.rb
+++ b/lib/zero/request.rb
@@ -6,9 +6,15 @@ require_relative 'request/server'
module Zero
# This class wraps around a rack environment for easier access to all data.
class Request
+ def self.create(environment)
+ return environment['zero.request'] if environment.has_key?('zero.request')
+ new(environment)
+ end
+
# create a new request object
def initialize(env)
@env = env
+ @env['zero.request'] = self
end
# get the environment
diff --git a/spec/unit/request/create_spec.rb b/spec/unit/request/create_spec.rb
new file mode 100644
index 0000000..a3440af
--- /dev/null
+++ b/spec/unit/request/create_spec.rb
@@ -0,0 +1,21 @@
+require 'spec_helper'
+
+describe Zero::Request, '.create' do
+ subject { Zero::Request.new(env) }
+
+ context "with a fresh environment" do
+ let(:env) { EnvGenerator.get('/foo') }
+ it "creates an instance of Zero::Request" do
+ Zero::Request.create(env).should be_an_instance_of(Zero::Request)
+ end
+ end
+
+ context "with an already used environment" do
+ let(:env) { EnvGenerator.get('/foo') }
+ let(:new_env) { subject.env }
+
+ it "returns an already build request" do
+ Zero::Request.create(new_env).should be(subject)
+ end
+ end
+end