Module: Kettle::Jem::TemplateLock

Defined in:
lib/kettle/jem.rb

Constant Summary collapse

VERSION =
1
TEMPLATE_STATE_KEY =
"template_state"
FILES_KEY =
"files"

Class Method Summary collapse

Class Method Details

.build_lock(template_state:, file_records:) ⇒ Object



2062
2063
2064
2065
2066
2067
2068
# File 'lib/kettle/jem.rb', line 2062

def build_lock(template_state:, file_records:)
  {
    "version" => VERSION,
    TEMPLATE_STATE_KEY => template_state,
    FILES_KEY => file_records.sort.to_h
  }
end

.file_record(lock, relative_path) ⇒ Object



2057
2058
2059
2060
# File 'lib/kettle/jem.rb', line 2057

def file_record(lock, relative_path)
  record = files(lock)[relative_path.to_s]
  record.is_a?(Hash) ? record : {}
end

.files(lock) ⇒ Object



2052
2053
2054
2055
# File 'lib/kettle/jem.rb', line 2052

def files(lock)
  value = lock.is_a?(Hash) ? lock[FILES_KEY] : nil
  value.is_a?(Hash) ? value : {}
end

.legacy_path(project_root) ⇒ Object



2001
2002
2003
# File 'lib/kettle/jem.rb', line 2001

def legacy_path(project_root)
  File.join(project_root.to_s, LEGACY_KETTLE_LOCK_PATH)
end

.load(project_root:, config_path: nil) ⇒ Object



2005
2006
2007
2008
2009
2010
2011
2012
2013
2014
2015
2016
2017
2018
2019
2020
2021
# File 'lib/kettle/jem.rb', line 2005

def load(project_root:, config_path: nil)
  lock_path = path(project_root)
  legacy_lock_path = legacy_path(project_root)
  lock = if File.exist?(lock_path)
    data = YAML.safe_load_file(lock_path, permitted_classes: [], aliases: false)
    data.is_a?(Hash) ? data : {}
  elsif File.exist?(legacy_lock_path)
    data = YAML.safe_load_file(legacy_lock_path, permitted_classes: [], aliases: false)
    data.is_a?(Hash) ? data : {}
  else
    {}
  end
  legacy = config_path ? TemplateChecksums.load_state(config_path: config_path) : {}
  merge_legacy(lock, legacy)
rescue
  {}
end

.merge_legacy(lock, legacy) ⇒ Object



2023
2024
2025
2026
2027
2028
2029
2030
2031
2032
2033
2034
2035
2036
# File 'lib/kettle/jem.rb', line 2023

def merge_legacy(lock, legacy)
  return lock unless legacy.is_a?(Hash) && !legacy.empty?

  merged = lock.dup
  state = (merged[TEMPLATE_STATE_KEY].is_a?(Hash) ? merged[TEMPLATE_STATE_KEY].dup : {})
  state["version"] ||= legacy[TemplateChecksums::VERSION_SUBKEY]
  state["applied_at"] ||= legacy[TemplateChecksums::APPLIED_AT_SUBKEY]
  state["changelog_replay"] ||= legacy[TemplateChecksums::CHANGELOG_REPLAY_SUBKEY] if legacy[TemplateChecksums::CHANGELOG_REPLAY_SUBKEY]
  state["checksums"] ||= legacy[TemplateChecksums::CHECKSUMS_SUBKEY] if legacy[TemplateChecksums::CHECKSUMS_SUBKEY]
  merged["version"] ||= VERSION
  merged[TEMPLATE_STATE_KEY] = state unless state.empty?
  merged[FILES_KEY] ||= {}
  merged
end

.path(project_root) ⇒ Object



1997
1998
1999
# File 'lib/kettle/jem.rb', line 1997

def path(project_root)
  File.join(project_root.to_s, KETTLE_LOCK_PATH)
end

.remove_legacy(project_root) ⇒ Object



2044
2045
2046
2047
2048
2049
2050
# File 'lib/kettle/jem.rb', line 2044

def remove_legacy(project_root)
  legacy_lock_path = legacy_path(project_root)
  return false unless File.exist?(legacy_lock_path)

  File.delete(legacy_lock_path)
  true
end

.write(project_root:, lock:) ⇒ Object



2038
2039
2040
2041
2042
# File 'lib/kettle/jem.rb', line 2038

def write(project_root:, lock:)
  lock_path = path(project_root)
  FileUtils.mkdir_p(File.dirname(lock_path))
  File.write(lock_path, YAML.dump(lock).to_s)
end