1
0
Fork 0
mirror of https://github.com/rails/rails.git synced 2022-11-09 12:12:34 -05:00
rails--rails/activesupport/lib/active_support/encrypted_configuration.rb
Alex Ghiculescu c87e16bf0e Credentials: support hash style access in more cases
Fixes https://github.com/rails/rails/issues/42351

https://github.com/rails/rails/pull/42106 broke if you wanted to treat a set of nested credentials as a hash. This PR fixes it.
2021-06-02 10:34:22 -05:00

55 lines
1.3 KiB
Ruby

# frozen_string_literal: true
require "yaml"
require "active_support/encrypted_file"
require "active_support/ordered_options"
require "active_support/core_ext/object/inclusion"
require "active_support/core_ext/module/delegation"
module ActiveSupport
class EncryptedConfiguration < EncryptedFile
delegate :[], :fetch, to: :config
delegate_missing_to :options
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
end
# Allow a config to be started without a file present
def read
super
rescue ActiveSupport::EncryptedFile::MissingContentError
""
end
def write(contents)
deserialize(contents)
super
end
def config
@config ||= deserialize(read).deep_symbolize_keys
end
private
def deep_transform(hash)
return hash unless hash.is_a?(Hash)
h = ActiveSupport::InheritableOptions.new
hash.each do |k, v|
h[k] = deep_transform(v)
end
h
end
def options
@options ||= ActiveSupport::InheritableOptions.new(deep_transform(config))
end
def deserialize(config)
YAML.load(config).presence || {}
end
end
end