Skip to content

Commit e731180

Browse files
committed
Implement Rails.app_env
1 parent e4f4bf4 commit e731180

File tree

4 files changed

+134
-0
lines changed

4 files changed

+134
-0
lines changed

lib/rails/app_env/helpers.rb

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
module Rails
2+
module AppEnv
3+
module Helpers
4+
def app_env
5+
return Rails.env unless ENV["APP_ENV"].present?
6+
7+
@_app_env ||= ActiveSupport::EnvironmentInquirer.new(ENV["APP_ENV"])
8+
end
9+
end
10+
end
11+
end

lib/rails/app_env/railtie.rb

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,11 @@
1+
require_relative "helpers"
2+
13
module Rails
24
module AppEnv
35
class Railtie < ::Rails::Railtie
6+
config.before_configuration do
7+
::Rails.extend(Helpers)
8+
end
49
end
510
end
611
end

test/env_helpers.rb

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,20 @@
1+
# frozen_string_literal: true
2+
3+
require "rails"
4+
5+
module EnvHelpers
6+
private
7+
def with_rails_env(env, &block)
8+
Rails.instance_variable_set :@_env, nil
9+
switch_env "RAILS_ENV", env do
10+
switch_env "RACK_ENV", nil, &block
11+
end
12+
end
13+
14+
def switch_env(key, value)
15+
old, ENV[key] = ENV[key], value
16+
yield
17+
ensure
18+
ENV[key] = old
19+
end
20+
end

test/rails/app_env/helpers_test.rb

Lines changed: 98 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,98 @@
1+
require_relative "../../env_helpers"
2+
3+
class Rails::AppEnvTest < ActiveSupport::TestCase
4+
include EnvHelpers
5+
6+
DEFAULT_RAILS_ENV = "development"
7+
8+
test "Rails.app_env is an instance of EnvironmentInquirer when APP_ENV is present" do
9+
switch_env "APP_ENV", nil do
10+
assert_instance_of ActiveSupport::EnvironmentInquirer, Rails.app_env
11+
end
12+
end
13+
14+
test "Rails.app_env is an instance of EnvironmentInquirer when APP_ENV is blank" do
15+
switch_env "APP_ENV", "foo" do
16+
assert_instance_of ActiveSupport::EnvironmentInquirer, Rails.app_env
17+
end
18+
end
19+
20+
test "Rails.app_env is set from APP_ENV" do
21+
switch_env "APP_ENV", "foo" do
22+
assert_equal "foo", Rails.app_env
23+
end
24+
end
25+
26+
test "Rails.app_env is set from APP_ENV when both APP_ENV are RAILS_ENV present" do
27+
switch_env "APP_ENV", "foo" do
28+
with_rails_env("bar") do
29+
assert_equal "foo", Rails.app_env
30+
assert_equal "bar", Rails.env
31+
end
32+
end
33+
end
34+
35+
test "Rails.app_env is set from APP_ENV when APP_ENV is present but not RAILS_ENV" do
36+
switch_env "APP_ENV", "foo" do
37+
with_rails_env(nil) do
38+
assert_equal "foo", Rails.app_env
39+
assert_equal DEFAULT_RAILS_ENV, Rails.env # Default Rails environment
40+
end
41+
end
42+
end
43+
44+
test "Rails.app_env falls back to Rails.env when APP_ENV is blank" do
45+
switch_env "APP_ENV", nil do
46+
with_rails_env("foo") do
47+
assert_equal "foo", Rails.app_env
48+
assert_equal "foo", Rails.env
49+
assert_same Rails.env, Rails.app_env
50+
end
51+
end
52+
end
53+
54+
test "Rails.app_env falls back to Rails.env when APP_ENV is blank and follow its changes" do
55+
switch_env "APP_ENV", nil do
56+
with_rails_env("foo") do
57+
Rails.env = "bar"
58+
59+
assert_equal "bar", Rails.app_env
60+
assert_equal "bar", Rails.env
61+
assert_same Rails.env, Rails.app_env
62+
end
63+
end
64+
end
65+
66+
test "Rails.app_env falls back to Rails.env when both APP_ENV and RAILS_ENV are blank" do
67+
switch_env "APP_ENV", nil do
68+
with_rails_env(nil) do
69+
assert_equal DEFAULT_RAILS_ENV, Rails.app_env
70+
assert_equal DEFAULT_RAILS_ENV, Rails.env # Default Rails environment
71+
assert_same Rails.env, Rails.app_env
72+
end
73+
end
74+
end
75+
76+
test "Rails.app_env falls back to Rails.env when both APP_ENV and RAILS_ENV are blank and follow its changes" do
77+
switch_env "APP_ENV", nil do
78+
with_rails_env(nil) do
79+
Rails.env = "foo"
80+
81+
assert_equal "foo", Rails.app_env
82+
assert_equal "foo", Rails.env
83+
assert_same Rails.env, Rails.app_env
84+
end
85+
end
86+
end
87+
88+
test "Rails.app_env is set from APP_ENV and does not follow Rails.env changes" do
89+
switch_env "APP_ENV", "foo" do
90+
with_rails_env("bar") do
91+
Rails.env = "baz"
92+
93+
assert_equal "foo", Rails.app_env
94+
assert_equal "baz", Rails.env
95+
end
96+
end
97+
end
98+
end

0 commit comments

Comments
 (0)