Class: KamalBackup::ConfigFile

Inherits:
Object
  • Object
show all
Defined in:
lib/kamal_backup/config_file.rb

Overview

Parses one config/kamal-backup.yml into ConfigData. Parsed values resolve to the same env keys the backup accessory receives, so process ENV always wins over file config through a single merge in Config.

Constant Summary collapse

TOP_LEVEL_KEYS =
%w[app accessory databases paths restore_from restic backup state].freeze
LEGACY_KEYS =
%w[
  app_name
  database_adapter
  database_url
  sqlite_database_path
  backup_paths
  local_restore_source_paths
  restic_repository
  restic_repository_file
  restic_password
  restic_password_file
  restic_password_command
  restic_init_if_missing
  restic_check_after_backup
  restic_check_read_data_subset
  restic_forget_after_backup
  restic_keep_last
  restic_keep_daily
  restic_keep_weekly
  restic_keep_monthly
  restic_keep_yearly
  backup_schedule_seconds
  backup_start_delay_seconds
  state_dir
  allow_suspicious_paths
  pgpassword
  mysql_pwd
].freeze

Instance Method Summary collapse

Constructor Details

#initialize(path, env:) ⇒ ConfigFile

Returns a new instance of ConfigFile.



51
52
53
54
# File 'lib/kamal_backup/config_file.rb', line 51

def initialize(path, env:)
  @path = path
  @env = env
end

Instance Method Details

#dataObject



56
57
58
59
60
61
62
63
64
65
66
67
68
69
# File 'lib/kamal_backup/config_file.rb', line 56

def data
  raw = YAML.safe_load(File.read(@path), permitted_classes: [], aliases: false)
  return ConfigData.empty if raw.nil?

  raise ConfigurationError, "#{@path} must contain a YAML mapping" unless raw.is_a?(Hash)

  raw.each_with_object(ConfigData.empty) do |(raw_key, raw_value), result|
    key = raw_key.to_s
    validate_top_level_key!(key)
    apply(result, key, raw_value)
  end
rescue Psych::SyntaxError => e
  raise ConfigurationError, "invalid YAML in #{@path}: #{e.message}"
end