class ActiveSupport::EncryptedConfiguration
# => KeyError
my_config.foo!
# => KeyError
my_config.fetch(:foo)
# => 456
my_config.some_namespace.another_secret
# => 456
my_config.dig(:some_namespace, :another_secret)
# => 123
my_config.some_secret
# => 123
my_config[:some_secret]
my_config.read # => “some_secret: 123nsome_namespace:n another_secret: 456”
my_config = ActiveSupport::EncryptedConfiguration.new(…)
dynamic accessor methods, similar to OrderedOptions.
Values can be accessed via Hash methods, such as fetch and dig, or via
as encrypted YAML.
Provides convenience methods on top of EncryptedFile to access values stored
= Encrypted Configuration
def config
# => { some_secret: 123, some_namespace: { another_secret: 789 } }
my_config.config
my_config.read # => "some_secret: 123\nsome_namespace:\n another_secret: 456"
my_config = ActiveSupport::EncryptedConfiguration.new(...)
Returns the decrypted content as a Hash with symbolized keys.
def config @config ||= deep_symbolize_keys(deserialize(read)) end
def deep_symbolize_keys(hash)
def deep_symbolize_keys(hash) hash.deep_transform_keys do |key| key.to_sym rescue NoMethodError raise InvalidKeyError.new(content_path, key) end end
def deep_transform(hash)
def deep_transform(hash) return hash unless hash.is_a?(Hash) h = ActiveSupport::OrderedOptions.new hash.each do |k, v| h[k] = deep_transform(v) end h end
def deserialize(content)
def deserialize(content) config = YAML.respond_to?(:unsafe_load) ? YAML.unsafe_load(content, filename: content_path) : YAML.load(content, filename: content_path) config.presence || {} rescue Psych::SyntaxError raise InvalidContentError.new(content_path) end
def initialize(config_path:, key_path:, env_key:, raise_if_missing_key:)
def initialize(config_path:, key_path:, env_key:, raise_if_missing_key:) super content_path: config_path, key_path: key_path, env_key: env_key, raise_if_missing_key: raise_if_missing_key @config = nil @options = nil end
def inspect # :nodoc:
def inspect # :nodoc: "#<#{self.class.name}:#{'%#016x' % (object_id << 1)}>" end
def options
def options @options ||= deep_transform(config) end
def read
def read super rescue ActiveSupport::EncryptedFile::MissingContentError # Allow a config to be started without a file present "" end
def validate! # :nodoc:
def validate! # :nodoc: deserialize(read).each_key do |key| key.to_sym rescue NoMethodError raise InvalidKeyError.new(content_path, key) end end