module NuclearSecrets

Constants

VERSION

Attributes

required_secrets[RW]
settings[RW]

Public Class Methods

build_assertions(secrets, existing_keys) click to toggle source
# File lib/nuclear_secrets.rb, line 43
def build_assertions(secrets, existing_keys)
  existing_keys.map do |key|
    if required_secrets[key].class == Class
      make_type_check(required_secrets[key])
    elsif required_secrets[key].respond_to? :call
      required_secrets[key]
    else
      raise NuclearSecrets::InvalidRequiredSecretValue.new(
        [
          build_secret_tuple(secrets, required_secrets, key),
        ],
      ) if @settings[:raise_on_extra_secrets] == true
    end
  end.compact
end
build_pairs(keys, secrets) click to toggle source
# File lib/nuclear_secrets.rb, line 37
def build_pairs(keys, secrets)
  keys.map do |k|
    build_secret_tuple(secrets, required_secrets, k)
  end
end
build_secret_tuple(secrets, required_values, key) click to toggle source

secrets: hash of given secrets required_values: hash of required secrets key: key to build tuple for returns [key, required_type, given_type]

# File lib/nuclear_secrets.rb, line 33
def build_secret_tuple(secrets, required_values, key)
  [key, required_values[key], secrets[key]]
end
check_assertions(secrets, assertions) click to toggle source
# File lib/nuclear_secrets.rb, line 59
def check_assertions(secrets, assertions)
  secrets.to_a.zip(assertions).select do |pair|
    result = if pair.last.present?
               pair.last.call(pair.first[1])
             end
    if !result && @settings[:raise_on_extra_secrets] == true
      pair.first[0]
    else
      false
    end
  end.map do |pair|
    flat_pair = pair.flatten
    build_secret_tuple(secrets, required_secrets, flat_pair.first)
  end
end
check_secrets(secrets) click to toggle source
# File lib/nuclear_secrets.rb, line 83
def check_secrets(secrets)
  init_settings
  raise NuclearSecrets::RequiredSecretsListMissing if required_secrets.nil?
  req_keys = required_secrets.keys
  existing_keys = secrets.keys

  missing_keys = req_keys - existing_keys
  extra_keys = existing_keys - req_keys

  missing_pairs = build_pairs(missing_keys, secrets)
  extra_pairs = build_pairs(extra_keys, secrets)
  raise SecretsMissingError.new(missing_pairs) unless missing_keys.empty?
  handle_extra_keys(extra_keys, extra_pairs)

  assertions = build_assertions(secrets, existing_keys)
  error_pairs = check_assertions(secrets, assertions)
  raise MismatchedSecretType.new(error_pairs) if !error_pairs.empty?
end
configure() { |self| ... } click to toggle source
# File lib/nuclear_secrets.rb, line 10
def configure
  yield self if block_given?
end
default_settings() click to toggle source
# File lib/nuclear_secrets.rb, line 19
def default_settings
  {
    raise_on_extra_secrets: false,
  }
end
handle_extra_keys(extra_keys, extra_pairs) click to toggle source
# File lib/nuclear_secrets.rb, line 75
def handle_extra_keys(extra_keys, extra_pairs)
  raise ExtraSecretsError.new(extra_pairs) unless extra_keys.empty?
rescue ExtraSecretsError => e
  logger = Logger.new(STDOUT)
  logger.warn e.message
  raise e if @settings[:raise_on_extra_secrets] == true
end
init_settings() click to toggle source
# File lib/nuclear_secrets.rb, line 14
def init_settings
  @settings = {} unless @settings.is_a? Hash
  @settings = default_settings.merge(@settings)
end
make_type_check(type) click to toggle source
# File lib/nuclear_secrets.rb, line 25
def make_type_check(type)
  Proc.new { |item| item.class == type }
end