lib/anyway/rails/config.rb in anyway_config-1.4.4 vs lib/anyway/rails/config.rb in anyway_config-2.0.0.pre

- old
+ new

@@ -1,38 +1,90 @@ # frozen_string_literal: true +require "active_support/core_ext/hash/indifferent_access" + module Anyway - class Config # :nodoc: - class << self - def defaults - return unless @defaults + module Rails + # Enhance config to be more Railsy-like: + # – accept hashes with indeferent access + # - load data from secrets + # - recognize Rails env when loading from YML + module Config + module ClassMethods + # Make defaults to be a Hash with indifferent access + def defaults + return @defaults if instance_variable_defined?(:@defaults) - @defaults_wia ||= @defaults.with_indifferent_access + @defaults = super.with_indifferent_access + end end - end - def load_from_sources(config = {}) - config = config.with_indifferent_access - load_from_file(config) - load_from_secrets(config) - load_from_env(config) - end + def load_from_sources(**options) + base_config = {}.with_indifferent_access + each_source(options) do |config| + base_config.deep_merge!(config) if config + end + base_config + end - def load_from_file(config) - config.deep_merge!(parse_yml(config_path)[Rails.env] || {}) if File.file? config_path - config - end + def each_source(options) + yield load_from_file(options) + yield load_from_secrets(options) + yield load_from_credentials(options) + yield load_from_env(options) + end - def load_from_secrets(config) - if Rails.application.respond_to?(:secrets) - config.deep_merge!(Rails.application.secrets.send(@config_name) || {}) + def load_from_file(name:, config_path:, env_prefix:, **_options) + file_config = load_from_yml(config_path)[::Rails.env] || {} + + if Anyway::Settings.use_local_files + local_config_path = config_path.sub(/\.yml/, ".local.yml") + file_config.deep_merge!(load_from_yml(local_config_path) || {}) + end + + file_config end - config - end - private + def load_from_secrets(name:, **_options) + return unless ::Rails.application.respond_to?(:secrets) - def default_config_path - Rails.root.join("config", "#{config_name}.yml") + ::Rails.application.secrets.public_send(name) + end + + def load_from_credentials(name:, **_options) + # do not load from credentials if we're in the context + # of the `credentials:edit` command + return if defined?(::Rails::Command::CredentialsCommand) + + return unless ::Rails.application.respond_to?(:credentials) + + # Create a new hash cause credentials are mutable! + creds_config = {} + + creds_config.deep_merge!(::Rails.application.credentials.public_send(name) || {}) + + creds_config.deep_merge!(load_from_local_credentials(name: name)) if Anyway::Settings.use_local_files + creds_config + end + + def load_from_local_credentials(name:) + local_creds_path = ::Rails.root.join("config/credentials/local.yml.enc").to_s + + return unless File.file?(local_creds_path) + + creds = ::Rails.application.encrypted( + local_creds_path, + key_path: ::Rails.root.join("config/credentials/local.key") + ) + + creds.public_send(name) || {} + end + + def default_config_path(name) + ::Rails.root.join("config", "#{name}.yml") + end end end end + +Anyway::Config.prepend Anyway::Rails::Config +Anyway::Config.singleton_class.prepend Anyway::Rails::Config::ClassMethods