class Vara::ProductMetadataProcessor

Constants

EXCLUSIVE_KEYS
REQUIRED_AWS_KEYS
REQUIRED_RELEASE_KEYS

Attributes

external_release_paths[R]
product_dir[R]
versioner[R]

Public Class Methods

new(product_dir, versioner, external_release_paths: []) click to toggle source

@param product_dir [String] path to product directory root @param versioner [Vara::PrereleaseVersioner,Vara::StaticVersioner]

# File lib/vara/product_metadata_processor.rb, line 11
def initialize(product_dir, versioner, external_release_paths: [])
  @product_dir = product_dir
  @versioner = versioner
  @external_release_paths = external_release_paths
end

Public Instance Methods

process() click to toggle source

Composes metadata_parts/binaries.yml and metadata_parts/handcraft.yml into the properly named product metadata file under metadata/, expanding placeholders as necessary @return [String] The path to the generated metadata file

# File lib/vara/product_metadata_processor.rb, line 20
def process
  metadata = merged_metadata

  external_release_paths.each do |external_release_path|
    update_release(external_release_path, metadata)
  end

  processed = versioner.update_metadata(metadata)
  save_processed_metadata(processed)
end

Private Instance Methods

merged_metadata() click to toggle source
# File lib/vara/product_metadata_processor.rb, line 39
def merged_metadata
  binaries_path = File.join(product_dir, 'metadata_parts', 'binaries.yml')
  binaries = YAML.load_file(binaries_path)
  log.info("Composing metadata: loaded #{binaries_path}")

  handcraft_path = File.join(product_dir, 'metadata_parts', 'handcraft.yml')
  handcraft = YAML.load_file(handcraft_path)
  log.info("Composing metadata: loaded #{handcraft_path}")

  binaries.merge(handcraft)
end
missing_aws_keys(external_release) click to toggle source
# File lib/vara/product_metadata_processor.rb, line 94
def missing_aws_keys(external_release)
  REQUIRED_AWS_KEYS.select do |required_aws_key|
    !external_release['aws'].key?(required_aws_key)
  end
end
save_processed_metadata(processed_metadata_hash) click to toggle source
# File lib/vara/product_metadata_processor.rb, line 100
def save_processed_metadata(processed_metadata_hash)
  product_name = processed_metadata_hash.fetch('name').tr('-', '_')
  metadata_dir = File.join(product_dir, 'metadata')

  FileUtils.mkdir_p(metadata_dir)

  out_path = File.join(metadata_dir, "#{product_name}.yml")

  File.open(out_path, 'w') do |out|
    YAML.dump(processed_metadata_hash, out)
  end

  out_path
end
update_release(external_release_path, metadata) click to toggle source
# File lib/vara/product_metadata_processor.rb, line 51
def update_release(external_release_path, metadata)
  log.info("Updating metadata: using #{File.expand_path(external_release_path)}")

  external_releases = YAML.load_file(external_release_path)

  external_releases.each do |release|
    external_release = validate_release(release, external_release_path)

    replace = metadata['releases'].find_index do |r|
      r['name'] == external_release['name']
    end

    raise "Specified release #{external_release['name']} does not exist in binaries.yml" unless replace

    metadata['releases'][replace] = external_release
  end
end
validate_release(external_release, external_release_path) click to toggle source
# File lib/vara/product_metadata_processor.rb, line 69
def validate_release(external_release, external_release_path)
  missing_keys = REQUIRED_RELEASE_KEYS - external_release.keys.to_a
  specified_release = "Specified release #{File.basename(external_release_path)} "

  raise specified_release + "is missing required keywords: #{missing_keys}" unless missing_keys.empty?

  exclusive_key_count = (EXCLUSIVE_KEYS - external_release.keys.to_a).length
  case
  when exclusive_key_count < 1
    raise specified_release + "contains more than one of the following keys, but only one is allowed: #{EXCLUSIVE_KEYS}"
  when exclusive_key_count > 1
    raise specified_release + "requires one of the following keys: #{EXCLUSIVE_KEYS}"
  end

  if external_release.key?('aws')
    missing_aws_keys = missing_aws_keys(external_release)

    raise specified_release + "is missing required aws hash keywords: #{missing_aws_keys}" unless missing_aws_keys.empty?
  end

  extra_keys = external_release.keys.to_a - REQUIRED_RELEASE_KEYS - EXCLUSIVE_KEYS
  raise specified_release + "has extra keywords: #{extra_keys}" unless extra_keys.empty?
  external_release
end