diff --git a/Gemfile.lock b/Gemfile.lock index 94b820f..2a5e580 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -1,7 +1,7 @@ PATH remote: . specs: - rails-app_env (0.2.0) + rails-app_env (0.3.0) activesupport (>= 8.0.0) railties (>= 8.0.0) diff --git a/lib/rails/app_env.rb b/lib/rails/app_env.rb index ab51c6c..1dc55bc 100644 --- a/lib/rails/app_env.rb +++ b/lib/rails/app_env.rb @@ -1,13 +1,18 @@ require_relative "app_env/version" + +require_relative "app_env/error" + +require_relative "app_env/console" +require_relative "app_env/credentials" +require_relative "app_env/environment_inquirer" + +require_relative "app_env/extensions/rails/app_env_aware" +require_relative "app_env/extensions/credentials_command/original_aware" +require_relative "app_env/extensions/application/app_configurable" + require_relative "app_env/railtie" module Rails module AppEnv - autoload :ApplicationHelpers, "rails/app_env/application_helpers" - autoload :Console, "rails/app_env/console" - autoload :Credentials, "rails/app_env/credentials" - autoload :EnvironmentInquirer, "rails/app_env/environment_inquirer" - autoload :Error, "rails/app_env/error" - autoload :RailsHelpers, "rails/app_env/rails_helpers" end end diff --git a/lib/rails/app_env/application_helpers.rb b/lib/rails/app_env/application_helpers.rb deleted file mode 100644 index 791e2fd..0000000 --- a/lib/rails/app_env/application_helpers.rb +++ /dev/null @@ -1,9 +0,0 @@ -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/credentials.rb b/lib/rails/app_env/credentials.rb index c8aa659..37aee64 100644 --- a/lib/rails/app_env/credentials.rb +++ b/lib/rails/app_env/credentials.rb @@ -38,7 +38,8 @@ def key_path end def monkey_patch_rails_credentials_command! - require_relative "../rails_ext/credentials_command" + return unless defined?(Rails::Command::CredentialsCommand) + Rails::Command::CredentialsCommand.extend(Extensions::OriginalAware) end end end diff --git a/lib/rails/app_env/extensions/application/app_configurable.rb b/lib/rails/app_env/extensions/application/app_configurable.rb new file mode 100644 index 0000000..0ef2cfb --- /dev/null +++ b/lib/rails/app_env/extensions/application/app_configurable.rb @@ -0,0 +1,9 @@ +module Rails::AppEnv::Extensions + module AppConfigurable + extend self + + def app_config_for(name) + Rails.application.config_for(name, env: Rails.app_env) + end + end +end diff --git a/lib/rails/app_env/extensions/credentials_command/original_aware.rb b/lib/rails/app_env/extensions/credentials_command/original_aware.rb new file mode 100644 index 0000000..b3024e7 --- /dev/null +++ b/lib/rails/app_env/extensions/credentials_command/original_aware.rb @@ -0,0 +1,9 @@ +module Rails::AppEnv::Extensions + module OriginalAware + private + + def config + Rails::AppEnv::Credentials.original + end + end +end diff --git a/lib/rails/app_env/extensions/rails/app_env_aware.rb b/lib/rails/app_env/extensions/rails/app_env_aware.rb new file mode 100644 index 0000000..7914ebd --- /dev/null +++ b/lib/rails/app_env/extensions/rails/app_env_aware.rb @@ -0,0 +1,13 @@ +module Rails + module AppEnv + module Extensions + module AppEnvAware + extend self + + def app_env + @_app_env ||= EnvironmentInquirer.new(ENV["APP_ENV"] || Rails.env) + end + end + end + end +end diff --git a/lib/rails/app_env/rails_helpers.rb b/lib/rails/app_env/rails_helpers.rb deleted file mode 100644 index 216357c..0000000 --- a/lib/rails/app_env/rails_helpers.rb +++ /dev/null @@ -1,9 +0,0 @@ -module Rails - module AppEnv - module RailsHelpers - def app_env - @_app_env ||= EnvironmentInquirer.new(ENV["APP_ENV"] || Rails.env) - end - end - end -end diff --git a/lib/rails/app_env/railtie.rb b/lib/rails/app_env/railtie.rb index c7431c0..9282f8a 100644 --- a/lib/rails/app_env/railtie.rb +++ b/lib/rails/app_env/railtie.rb @@ -2,8 +2,8 @@ module Rails module AppEnv class Railtie < Rails::Railtie config.before_configuration do - Rails.extend(RailsHelpers) - Rails.application.extend(ApplicationHelpers) + Rails.extend(Extensions::AppEnvAware) + Rails.application.extend(Extensions::AppConfigurable) end config.before_configuration do diff --git a/lib/rails/app_env/version.rb b/lib/rails/app_env/version.rb index 789ca48..763029a 100644 --- a/lib/rails/app_env/version.rb +++ b/lib/rails/app_env/version.rb @@ -1,5 +1,5 @@ module Rails module AppEnv - VERSION = "0.2.0" + VERSION = "0.3.0" end end diff --git a/lib/rails/rails_ext/credentials_command.rb b/lib/rails/rails_ext/credentials_command.rb deleted file mode 100644 index b48b3b0..0000000 --- a/lib/rails/rails_ext/credentials_command.rb +++ /dev/null @@ -1,11 +0,0 @@ -module Rails - module Command - class CredentialsCommand - private - - def config - Rails::AppEnv::Credentials.original - end - end - end -end diff --git a/test/units/app_env/console_test.rb b/test/units/app_env/console_test.rb index 34662de..a9d3e1e 100644 --- a/test/units/app_env/console_test.rb +++ b/test/units/app_env/console_test.rb @@ -2,50 +2,52 @@ require_relative "../../test_helper" require "rails/commands/console/irb_console" -class Rails::AppEnv::ConsoleTest < ActiveSupport::TestCase - test "Rails::AppEnv::Console is a kind of Rails::Console::IRBConsole" do - assert_kind_of Rails::Console::IRBConsole, Rails::AppEnv::Console.new(nil) - end +module Rails::AppEnv + class ConsoleTest < ActiveSupport::TestCase + test "Rails::AppEnv::Console is a kind of Rails::Console::IRBConsole" do + assert_kind_of Rails::Console::IRBConsole, Rails::AppEnv::Console.new(nil) + end - test "Console#colorized_env prints Rails.env only when Rails.app_env is same as Rails.env" do - Rails.stub :app_env, "foo" do - Rails.stub :env, "foo" do - console = Rails::AppEnv::Console.new(nil) - assert_equal_without_color "foo", console.colorized_env + test "#colorized_env prints Rails.env only when Rails.app_env is same as Rails.env" do + Rails.stub :app_env, "foo" do + Rails.stub :env, "foo" do + console = Console.new(nil) + assert_equal_without_color "foo", console.colorized_env + end end end - end - test "Console#colorized_env prints {Rails.env:Rails.app_env} when Rails.app_env is diff from Rails.env" do - Rails.stub :app_env, "foo" do - Rails.stub :env, "bar" do - console = Rails::AppEnv::Console.new(nil) - assert_equal_without_color "bar:foo", console.colorized_env + test "#colorized_env prints {Rails.env:Rails.app_env} when Rails.app_env is diff from Rails.env" do + Rails.stub :app_env, "foo" do + Rails.stub :env, "bar" do + console = Console.new(nil) + assert_equal_without_color "bar:foo", console.colorized_env + end end end - end - test "Console#colorized_env shorten Rails.app_env to dev when Rails.app_env is production" do - Rails.stub :app_env, "production" do - Rails.stub :env, "bar" do - console = Rails::AppEnv::Console.new(nil) - assert_equal_without_color "bar:prod", console.colorized_env + test "#colorized_env shorten Rails.app_env to prod when Rails.app_env is production" do + Rails.stub :app_env, "production" do + Rails.stub :env, "bar" do + console = Console.new(nil) + assert_equal_without_color "bar:prod", console.colorized_env + end end end - end - test "Console#colorized_env shorten Rails.app_env to dev when Rails.app_env is development" do - Rails.stub :app_env, "development" do - Rails.stub :env, "bar" do - console = Rails::AppEnv::Console.new(nil) - assert_equal_without_color "bar:dev", console.colorized_env + test "#colorized_env shorten Rails.app_env to dev when Rails.app_env is development" do + Rails.stub :app_env, "development" do + Rails.stub :env, "bar" do + console = Console.new(nil) + assert_equal_without_color "bar:dev", console.colorized_env + end end end - end - private + private - def assert_equal_without_color(expected, actual) - assert_equal expected, actual.gsub(/\e\[(\d+)(;\d+)*m/, "") + def assert_equal_without_color(expected, actual) + assert_equal expected, actual.gsub(/\e\[(\d+)(;\d+)*m/, "") + end end end diff --git a/test/units/app_env/credentials_test.rb b/test/units/app_env/credentials_test.rb index 5e1b971..76158c2 100644 --- a/test/units/app_env/credentials_test.rb +++ b/test/units/app_env/credentials_test.rb @@ -1,95 +1,97 @@ require "minitest/mock" require_relative "../../test_helper" -class Rails::AppEnv::CredentialsTest < ActiveSupport::TestCase - test "Rails::AppEnv::Credentials::AlreadyInitializedError is a kind of Rails::AppEnv::Error" do - assert_kind_of Rails::AppEnv::Error, Rails::AppEnv::Credentials::AlreadyInitializedError.new - end +module Rails::AppEnv + class CredentialsTest < ActiveSupport::TestCase + test "Rails::AppEnv::Credentials::AlreadyInitializedError is a kind of Rails::AppEnv::Error" do + assert_kind_of Rails::AppEnv::Error, Rails::AppEnv::Credentials::AlreadyInitializedError.new + end - test "#initialize! can only be invoked once" do - reset_credentials + test ".initialize! can only be invoked once" do + reset_credentials - Rails::AppEnv::Credentials.initialize! + Credentials.initialize! - assert_raises Rails::AppEnv::Credentials::AlreadyInitializedError do - Rails::AppEnv::Credentials.initialize! + assert_raises Rails::AppEnv::Credentials::AlreadyInitializedError do + Credentials.initialize! + end end - end - test "#initialize! backup original Rails.application.config.credentials" do - reset_credentials + test ".initialize! backup original Rails.application.config.credentials" do + reset_credentials - expected = Object.new + expected = Object.new - Rails.application.config.stub :credentials, expected do - Rails::AppEnv::Credentials.initialize! - end + Rails.application.config.stub :credentials, expected do + Credentials.initialize! + end - assert_same expected, Rails::AppEnv::Credentials.original - end + assert_same expected, Credentials.original + end - test "#configuration is a kind of ActiveSupport::Credentials" do - assert_kind_of ActiveSupport::InheritableOptions, Rails::AppEnv::Credentials.configuration - end + test ".configuration is a kind of ActiveSupport::Credentials" do + assert_kind_of ActiveSupport::InheritableOptions, Credentials.configuration + end - test "#configuration.content_path is config/credentials/{Rails.app_env}.yml.enc" do - Dir.mktmpdir do |tmp_dir| - Rails.stub :root, Pathname(tmp_dir) do - Rails.stub :app_env, Rails::AppEnv::EnvironmentInquirer.new("foo") do - path = Rails.root.join("config/credentials/foo.yml.enc") + test ".configuration.content_path is config/credentials/{Rails.app_env}.yml.enc" do + Dir.mktmpdir do |tmp_dir| + Rails.stub :root, Pathname(tmp_dir) do + Rails.stub :app_env, EnvironmentInquirer.new("foo") do + path = Rails.root.join("config/credentials/foo.yml.enc") - FileUtils.mkdir_p File.dirname(path) - FileUtils.touch path + FileUtils.mkdir_p File.dirname(path) + FileUtils.touch path - assert_equal path, Rails::AppEnv::Credentials.configuration.content_path + assert_equal path, Credentials.configuration.content_path + end end end end - end - test "#configuration.content_path falls back to config/credentials.yml.enc when config/credentials/{Rails.app_env}.yml.enc not exist" do - Dir.mktmpdir do |tmp_dir| - Rails.stub :root, Pathname(tmp_dir) do - Rails.stub :app_env, Rails::AppEnv::EnvironmentInquirer.new("foo") do - path = Rails.root.join("config/credentials.yml.enc") + test ".configuration.content_path falls back to config/credentials.yml.enc when config/credentials/{Rails.app_env}.yml.enc not exist" do + Dir.mktmpdir do |tmp_dir| + Rails.stub :root, Pathname(tmp_dir) do + Rails.stub :app_env, EnvironmentInquirer.new("foo") do + path = Rails.root.join("config/credentials.yml.enc") - assert_equal path, Rails::AppEnv::Credentials.configuration.content_path + assert_equal path, Credentials.configuration.content_path + end end end end - end - test "#configuration.key_path is config/credentials/{APP_ENV}.key" do - Dir.mktmpdir do |tmp_dir| - Rails.stub :root, Pathname(tmp_dir) do - Rails.stub :app_env, Rails::AppEnv::EnvironmentInquirer.new("foo") do - path = Rails.root.join("config/credentials/foo.key") + test ".configuration.key_path is config/credentials/{APP_ENV}.key" do + Dir.mktmpdir do |tmp_dir| + Rails.stub :root, Pathname(tmp_dir) do + Rails.stub :app_env, EnvironmentInquirer.new("foo") do + path = Rails.root.join("config/credentials/foo.key") - FileUtils.mkdir_p File.dirname(path) - FileUtils.touch path + FileUtils.mkdir_p File.dirname(path) + FileUtils.touch path - assert_equal path, Rails::AppEnv::Credentials.configuration.key_path + assert_equal path, Credentials.configuration.key_path + end end end end - end - test "#configuration.key_path falls back to config/master.key when config/credentials/{APP_ENV}.key not exist" do - Dir.mktmpdir do |tmp_dir| - Rails.stub :root, Pathname(tmp_dir) do - Rails.stub :app_env, Rails::AppEnv::EnvironmentInquirer.new("foo") do - path = Rails.root.join("config/master.key") + test ".configuration.key_path falls back to config/master.key when config/credentials/{APP_ENV}.key not exist" do + Dir.mktmpdir do |tmp_dir| + Rails.stub :root, Pathname(tmp_dir) do + Rails.stub :app_env, EnvironmentInquirer.new("foo") do + path = Rails.root.join("config/master.key") - assert_equal path, Rails::AppEnv::Credentials.configuration.key_path + assert_equal path, Credentials.configuration.key_path + end end end end - end - private + private - def reset_credentials - Rails::AppEnv::Credentials.instance_variable_set :@initialized, nil - Rails::AppEnv::Credentials.instance_variable_set :@original, nil + def reset_credentials + Credentials.instance_variable_set :@initialized, nil + Credentials.instance_variable_set :@original, nil + end end end diff --git a/test/units/app_env/environment_inquirer_test.rb b/test/units/app_env/environment_inquirer_test.rb index 81f0326..ab12c23 100644 --- a/test/units/app_env/environment_inquirer_test.rb +++ b/test/units/app_env/environment_inquirer_test.rb @@ -1,31 +1,33 @@ require_relative "../../test_helper" -class Rails::AppEnv::EnvironmentInquirerTest < ActiveSupport::TestCase - test "EnvironmentInquirer is a kind of ActiveSupport::EnvironmentInquirer" do - assert_kind_of ActiveSupport::EnvironmentInquirer, Rails::AppEnv::EnvironmentInquirer.new("foo") - end +module Rails::AppEnv + class EnvironmentInquirerTest < ActiveSupport::TestCase + test "EnvironmentInquirer is a kind of ActiveSupport::EnvironmentInquirer" do + assert_kind_of ActiveSupport::EnvironmentInquirer, Rails::AppEnv::EnvironmentInquirer.new("foo") + end - test "EnvironmentInquirer#production? is inherited" do - assert_includes Rails::AppEnv::EnvironmentInquirer.instance_methods, :production? - end + test "#production? is inherited" do + assert_includes EnvironmentInquirer.instance_methods, :production? + end - test "EnvironmentInquirer#staging? is defined" do - assert_includes Rails::AppEnv::EnvironmentInquirer.instance_methods, :staging? - end + test "#staging? is defined" do + assert_includes EnvironmentInquirer.instance_methods, :staging? + end - test "EnvironmentInquirer#review? is defined" do - assert_includes Rails::AppEnv::EnvironmentInquirer.instance_methods, :review? - end + test "#review? is defined" do + assert_includes EnvironmentInquirer.instance_methods, :review? + end - test "EnvironmentInquirer#staging?" do - assert_predicate Rails::AppEnv::EnvironmentInquirer.new("staging"), :staging? - refute_predicate Rails::AppEnv::EnvironmentInquirer.new("review"), :staging? - refute_predicate Rails::AppEnv::EnvironmentInquirer.new("production"), :staging? - end + test "#staging?" do + assert_predicate EnvironmentInquirer.new("staging"), :staging? + refute_predicate EnvironmentInquirer.new("review"), :staging? + refute_predicate EnvironmentInquirer.new("production"), :staging? + end - test "EnvironmentInquirer#review?" do - refute_predicate Rails::AppEnv::EnvironmentInquirer.new("staging"), :review? - assert_predicate Rails::AppEnv::EnvironmentInquirer.new("review"), :review? - refute_predicate Rails::AppEnv::EnvironmentInquirer.new("production"), :review? + test "#review?" do + refute_predicate EnvironmentInquirer.new("staging"), :review? + assert_predicate EnvironmentInquirer.new("review"), :review? + refute_predicate EnvironmentInquirer.new("production"), :review? + end end end diff --git a/test/units/app_env/extensions/application/app_configurable_test.rb b/test/units/app_env/extensions/application/app_configurable_test.rb new file mode 100644 index 0000000..88c3b42 --- /dev/null +++ b/test/units/app_env/extensions/application/app_configurable_test.rb @@ -0,0 +1,22 @@ +require "minitest/mock" +require_relative "../../../../test_helper" + +module Rails::AppEnv::Extensions + class AppConfigurableTest < ActiveSupport::TestCase + test ".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) + + Rails.stub(:app_env, app_env) do + Rails.application.stub(:config_for, mock) do + assert_same expected, AppConfigurable.app_config_for(:bar) + end + end + + mock.verify + end + end +end diff --git a/test/units/app_env/extensions/rails/app_env_aware_test.rb b/test/units/app_env/extensions/rails/app_env_aware_test.rb new file mode 100644 index 0000000..a83e9ad --- /dev/null +++ b/test/units/app_env/extensions/rails/app_env_aware_test.rb @@ -0,0 +1,47 @@ +require "minitest/mock" +require_relative "../../../../test_helper" + +module Rails::AppEnv::Extensions + class AppEnvAwareTest < ActiveSupport::TestCase + def setup + AppEnvAware.instance_variable_set :@_app_env, nil + end + + test ".app_env reads from APP_ENV" do + switch_env("APP_ENV", "foo") do + Rails.stub(:env, "bar") do + actual = AppEnvAware.app_env + + assert_equal "foo", actual + assert_predicate actual, :foo? + + refute_predicate actual, :bar? + refute_predicate actual, :test? + end + end + end + + test ".app_env falls back to read from Rails.env" do + switch_env("APP_ENV", nil) do + Rails.stub(:env, "bar") do + actual = AppEnvAware.app_env + + assert_equal "bar", actual + assert_predicate actual, :bar? + + refute_predicate actual, :foo? + refute_predicate actual, :test? + end + end + end + + private + + def switch_env(key, value) + old, ENV[key] = ENV[key], value + yield + ensure + ENV[key] = old + end + end +end