diff --git a/README.md b/README.md index 60812df..19360e0 100644 --- a/README.md +++ b/README.md @@ -39,7 +39,8 @@ TODO. ### `Rails.app_env` -`Rails.app_env` is like `Rails.env` but it is set by the `APP_ENV` environment variable (`ENV["APP_ENV"]`). +`Rails.app_env` is like [`Rails.env`](https://api.rubyonrails.org/classes/Rails.html#method-c-env) but it is set by the +`APP_ENV` environment variable (`ENV["APP_ENV"]`). It is optimization for `staging` and `review` ([the two extra Heroku pipeline stages](https://devcenter.heroku.com/articles/pipelines)), so it doesn't need to rely on the slower delegation through `method_missing` that `ActiveSupport::EnvironmentInquirer` @@ -59,6 +60,17 @@ Rails.env.production? # => true In case `ENV["APP_ENV"]` is blank, `Rails.app_env` falls back to `Rails.env`. +### `Rails.application.app_config_for` + +`Rails.application.app_config_for` wraps[`Rails.application.config_for`](https://api.rubyonrails.org/classes/Rails/Application.html#method-i-config_for) +with `{env: Rails.app_env}` as the second argument. + +```ruby +# These two lines are equivalent. +Rails.application.app_config_for(:foo) +Rails.application.config_for(:foo, env: Rails.app_env) +``` + ### Credentials `Rails APP_ENV` overrides the default Rails credentials `content_path` and `key_path` according to `Rails.app_env`. diff --git a/lib/rails/app_env.rb b/lib/rails/app_env.rb index 896f099..36561ca 100644 --- a/lib/rails/app_env.rb +++ b/lib/rails/app_env.rb @@ -1,6 +1,7 @@ require_relative "app_env/version" require_relative "app_env/environment_inquirer" -require_relative "app_env/helpers" +require_relative "app_env/rails_helpers" +require_relative "app_env/application_helpers" require_relative "app_env/credentials" require_relative "app_env/railtie" diff --git a/lib/rails/app_env/application_helpers.rb b/lib/rails/app_env/application_helpers.rb new file mode 100644 index 0000000..791e2fd --- /dev/null +++ b/lib/rails/app_env/application_helpers.rb @@ -0,0 +1,9 @@ +module Rails + module AppEnv + module ApplicationHelpers + def app_config_for(name) + config_for(name, env: Rails.app_env) + end + end + end +end diff --git a/lib/rails/app_env/helpers.rb b/lib/rails/app_env/rails_helpers.rb similarity index 86% rename from lib/rails/app_env/helpers.rb rename to lib/rails/app_env/rails_helpers.rb index acf1ed8..216357c 100644 --- a/lib/rails/app_env/helpers.rb +++ b/lib/rails/app_env/rails_helpers.rb @@ -1,6 +1,6 @@ module Rails module AppEnv - module Helpers + module RailsHelpers def app_env @_app_env ||= EnvironmentInquirer.new(ENV["APP_ENV"] || Rails.env) end diff --git a/lib/rails/app_env/railtie.rb b/lib/rails/app_env/railtie.rb index 7579d76..73ba83b 100644 --- a/lib/rails/app_env/railtie.rb +++ b/lib/rails/app_env/railtie.rb @@ -1,22 +1,27 @@ module Rails module AppEnv class Railtie < Rails::Railtie - initializer :load_helpers, before: :initialize_logger do - Rails.extend(Helpers) + config.before_configuration do + Rails.extend(RailsHelpers) + Rails.application.extend(ApplicationHelpers) end - initializer :set_credentials, before: :initialize_logger do + config.before_configuration do + # TODO: Allow opt-out. Rails::AppEnv::Credentials.initialize! end config.after_initialize do - Rails::Info.property "Application environment", Rails.app_env + Rails::Info.property "Application environment" do + Rails.app_env + end end console do |app| + # TODO: Allow opt-out. require_relative "console" - app.config.console = Rails::AppEnv::Console.new(app) + puts "Loading #{Rails.app_env} application environment (rails-app_env #{Rails::AppEnv::VERSION})" # standard:disable Rails/Output end end diff --git a/test/features/app_config_for_test.rb b/test/features/app_config_for_test.rb new file mode 100644 index 0000000..5832737 --- /dev/null +++ b/test/features/app_config_for_test.rb @@ -0,0 +1,25 @@ +require "minitest/mock" +require_relative "../test_helper" +require_relative "env_helpers" + +module Rails::AppEnv::FeaturesTest + class AppConfigForTest < ActiveSupport::TestCase + include EnvHelpers + + test "Rails.application.app_config_for delegates to Rails.application.config_for" do + app_env = "foo" + expected = Object.new + + mock = Minitest::Mock.new + mock.expect(:call, expected, [:bar], env: app_env) + + with_app_env(app_env) do + Rails.application.stub(:config_for, mock) do + assert_same expected, Rails.application.app_config_for(:bar) + end + end + + mock.verify + end + end +end