diff options
Diffstat (limited to 'app/services/packages/rpm/repository_metadata/build_repomd_xml_service.rb')
-rw-r--r-- | app/services/packages/rpm/repository_metadata/build_repomd_xml_service.rb | 56 |
1 files changed, 56 insertions, 0 deletions
diff --git a/app/services/packages/rpm/repository_metadata/build_repomd_xml_service.rb b/app/services/packages/rpm/repository_metadata/build_repomd_xml_service.rb new file mode 100644 index 00000000000..cb80faa12c0 --- /dev/null +++ b/app/services/packages/rpm/repository_metadata/build_repomd_xml_service.rb @@ -0,0 +1,56 @@ +# frozen_string_literal: true +module Packages + module Rpm + module RepositoryMetadata + class BuildRepomdXmlService + ROOT_ATTRIBUTES = { + xmlns: 'http://linux.duke.edu/metadata/repo', + 'xmlns:rpm': 'http://linux.duke.edu/metadata/rpm' + }.freeze + ALLOWED_DATA_VALUE_KEYS = %i[checksum open-checksum location timestamp size open-size].freeze + + # Expected `data` structure + # + # data = { + # filelists: { + # checksum: { type: "sha256", value: "123" }, + # location: { href: "repodata/123-filelists.xml.gz" }, + # ... + # }, + # ... + # } + def initialize(data) + @data = data + end + + def execute + Nokogiri::XML::Builder.new(encoding: 'UTF-8') do |xml| + xml.repomd(ROOT_ATTRIBUTES) do + xml.revision Time.now.to_i + build_data_info(xml) + end + end.to_xml + end + + private + + attr_reader :data + + def build_data_info(xml) + data.each do |filename, info| + xml.data(type: filename) do + build_file_info(info, xml) + end + end + end + + def build_file_info(info, xml) + info.slice(*ALLOWED_DATA_VALUE_KEYS).each do |key, attributes| + value = attributes.delete(:value) + xml.method_missing(key, value, attributes) + end + end + end + end + end +end |