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

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 ||= deserialize(read).deep_symbolize_keys
end

def deep_transform(hash)

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 deserialize(config)

def deserialize(config)
  doc = YAML.respond_to?(:unsafe_load) ? YAML.unsafe_load(config) : YAML.load(config)
  doc.presence || {}
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
end

def options

def options
  @options ||= ActiveSupport::InheritableOptions.new(deep_transform(config))
end

def read

Reads the file and returns the decrypted content. See EncryptedFile#read.
def read
  super
rescue ActiveSupport::EncryptedFile::MissingContentError
  # Allow a config to be started without a file present
  ""
end

def write(contents)

def write(contents)
  deserialize(contents)
  super
end