Class: ActiveSupport::EncryptedConfiguration

Inherits:
EncryptedFile show all
Defined in:
activesupport/lib/active_support/encrypted_configuration.rb

Overview

Encrypted Configuration

Provides convenience methods on top of EncryptedFile to access values stored as encrypted YAML.

Values can be accessed via Hash methods, such as fetch and dig, or via dynamic accessor methods, similar to OrderedOptions.

my_config = ActiveSupport::EncryptedConfiguration.new(...)
my_config.read # => "some_secret: 123\nsome_namespace:\n  another_secret: 456"

my_config[:some_secret]
# => 123
my_config.some_secret
# => 123
my_config.dig(:some_namespace, :another_secret)
# => 456
my_config.some_namespace.another_secret
# => 456
my_config.fetch(:foo)
# => KeyError
my_config.foo!
# => KeyError

Defined Under Namespace

Classes: InvalidContentError, InvalidKeyError

Constant Summary

Constants inherited from EncryptedFile

ActiveSupport::EncryptedFile::CIPHER

Instance Attribute Summary

Attributes inherited from EncryptedFile

#content_path, #env_key, #key_path, #raise_if_missing_key

Instance Method Summary collapse

Methods inherited from EncryptedFile

#change, expected_key_length, generate_key, #key, #key?, #write

Constructor Details

#initialize(config_path:, key_path:, env_key:, raise_if_missing_key:) ⇒ EncryptedConfiguration

Returns a new instance of EncryptedConfiguration.



54
55
56
57
58
59
# File 'activesupport/lib/active_support/encrypted_configuration.rb', line 54

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

Instance Method Details

#configObject

Returns the decrypted content as a Hash with symbolized keys.

my_config = ActiveSupport::EncryptedConfiguration.new(...)
my_config.read # => "some_secret: 123\nsome_namespace:\n  another_secret: 456"

my_config.config
# => { some_secret: 123, some_namespace: { another_secret: 789 } }


129
130
131
# File 'activesupport/lib/active_support/encrypted_configuration.rb', line 129

def config
  @config ||= deep_symbolize_keys(deserialize(read))
end

#inspectObject

:nodoc:



145
146
147
# File 'activesupport/lib/active_support/encrypted_configuration.rb', line 145

def inspect # :nodoc:
  "#<#{self.class.name}:#{'%#016x' % (object_id << 1)} keys=#{keys.inspect}>"
end

#keysObject

Returns an array of symbolized keys from the decrypted configuration.

my_config = ActiveSupport::EncryptedConfiguration.new(...)
my_config.read # => "some_secret: 123\nsome_namespace:\n  another_secret: 456"

my_config.keys
# => [:some_secret, :some_namespace]


141
142
143
# File 'activesupport/lib/active_support/encrypted_configuration.rb', line 141

def keys
  config.keys
end

#option(*key, default: nil) ⇒ Object

Find a upcased and double-underscored-joined string-version of the key in ENV. Returns nil if the key isn’t found or the value of default when passed If default is a block, it’s called first.

Examples:

config.option(:db_host)                                    # => ENV["DB_HOST"]
config.option(:database, :host)                            # => ENV["DATABASE__HOST"]
config.option(:database, :host, default: "missing")        # => ENV.fetch("DATABASE__HOST", "missing")
config.option(:database, :host, default: -> { "missing" }) # => ENV.fetch("DATABASE__HOST", default.call)


88
89
90
91
92
93
94
95
96
97
98
# File 'activesupport/lib/active_support/encrypted_configuration.rb', line 88

def option(*key, default: nil)
  value = dig(*key)

  if !value.nil?
    value
  elsif default.respond_to?(:call)
    default.call
  else
    default
  end
end

#readObject

Reads the file and returns the decrypted content. See EncryptedFile#read.



106
107
108
109
110
111
# File 'activesupport/lib/active_support/encrypted_configuration.rb', line 106

def read
  super
rescue ActiveSupport::EncryptedFile::MissingContentError
  # Allow a config to be started without a file present
  ""
end

#reloadObject

Reload the cached values in case any of them changed or new ones were added during runtime.



101
102
103
# File 'activesupport/lib/active_support/encrypted_configuration.rb', line 101

def reload
  @config = @options = nil
end

#require(*key) ⇒ Object

Find the referenced key Raises KeyError if not found.

Examples:

require(:db_host)         # => ENV.fetch("DB_HOST")
require(:database, :host) # => ENV.fetch("DATABASE__HOST")


68
69
70
71
72
73
74
75
76
# File 'activesupport/lib/active_support/encrypted_configuration.rb', line 68

def require(*key)
  value = dig(*key)

  if !value.nil?
    value
  else
    raise KeyError, "Missing key: #{key.inspect}"
  end
end

#validate!Object

:nodoc:



113
114
115
116
117
118
119
# File 'activesupport/lib/active_support/encrypted_configuration.rb', line 113

def validate! # :nodoc:
  deserialize(read).each_key do |key|
    key.to_sym
  rescue NoMethodError
    raise InvalidKeyError.new(content_path, key)
  end
end