From 4ec406453dcd1969349a992ad7ce4a1048ee60c5 Mon Sep 17 00:00:00 2001 From: Geoff Buesing Date: Sun, 17 Jan 2010 12:28:48 -0600 Subject: [PATCH] Rack.env reader and Rack.env.development? etc query methods --- README.rdoc | 1 + lib/rack/contrib/env_inquirer.rb | 30 ++++++++++++++++++++++++++++++ test/spec_rack_env_inquirer.rb | 38 ++++++++++++++++++++++++++++++++++++++ 3 files changed, 69 insertions(+), 0 deletions(-) create mode 100644 lib/rack/contrib/env_inquirer.rb create mode 100644 test/spec_rack_env_inquirer.rb diff --git a/README.rdoc b/README.rdoc index ca015ae..85f604e 100644 --- a/README.rdoc +++ b/README.rdoc @@ -46,6 +46,7 @@ interface: * Rack::HostMeta - Configures /host-meta using a block * Rack::Cookies - Adds simple cookie jar hash to env * Rack::Access - Limit access based on IP address +* Rack.env reader and Rack.env.development? etc query methods === Use diff --git a/lib/rack/contrib/env_inquirer.rb b/lib/rack/contrib/env_inquirer.rb new file mode 100644 index 0000000..a617e55 --- /dev/null +++ b/lib/rack/contrib/env_inquirer.rb @@ -0,0 +1,30 @@ +module Rack + # Adds pretty reader and query methods for ENV['RACK_ENV'] value. + # A copy of Rails' Rails.env for Rack apps. + # + # Examples: + # + # Rack.env # => "development" + # Rack.env.development? # => true + # + # This feature is not autoloaded when you require rack/contrib; + # you need to explicitly require this file in order to use it: + # + # require 'rack/contrib/env_inquirer' + def self.env + @env ||= Utils::StringInquirer.new(ENV["RACK_ENV"] || "development") + end + + module Utils + # TAKEN FROM ACTIVE SUPPORT + class StringInquirer < String + def method_missing(method_name, *arguments) + if method_name.to_s[-1,1] == "?" + self == method_name.to_s[0..-2] + else + super + end + end + end + end +end diff --git a/test/spec_rack_env_inquirer.rb b/test/spec_rack_env_inquirer.rb new file mode 100644 index 0000000..b5dc334 --- /dev/null +++ b/test/spec_rack_env_inquirer.rb @@ -0,0 +1,38 @@ +require 'test/spec' +require 'rack/contrib/env_inquirer' + +context "Rack env inquirer" do + + specify "Rack.env returns ENV['RACK_ENV']" do + with_rack_env "production" do + Rack.env.should == "production" + end + end + + specify "Rack.env returns 'development' if ENV['RACK_ENV'] is nil" do + with_rack_env nil do + Rack.env.should == "development" + end + end + + specify "Rack.env.production? returns true when ENV['RACK_ENV'] == 'production'" do + with_rack_env "production" do + Rack.env.production?.should == true + end + end + + specify "Rack.env.production? returns false when ENV['RACK_ENV'] != 'production'" do + with_rack_env "development" do + Rack.env.production?.should == false + end + end + + private + def with_rack_env(env) + old_env, ENV['RACK_ENV'] = ENV['RACK_ENV'], env + yield + ensure + ENV['RACK_ENV'] = old_env + Rack.instance_variable_set(:@env, nil) + end +end \ No newline at end of file -- 1.6.1