class ManifestToYaml
Convert a storage manifest to Yaml
Constants
- XMLNS
Public Instance Methods
Source
# File app/lib/util/manifest_to_yaml.rb, line 70 def load_paths(xmlbody) ark = '' keys = {} xml = Nokogiri::XML(xmlbody).remove_namespaces! xml.xpath('/objectInfo/object').each do |doc| ark = doc['id'] end xml.xpath('/objectInfo/versions/version').each do |doc| v = doc['id'].to_i doc.xpath('manifest').each do |m| m.xpath('file').each do |f| keys["#{ark}/#{v}/#{f['id']}"] = f.xpath('digest').text end end end keys end
Source
# File app/lib/util/manifest_to_yaml.rb, line 11 def load_xml(xmlbody) manifest = {} xml = Nokogiri::XML(xmlbody).remove_namespaces! xml.xpath('/objectInfo/object').each do |doc| manifest[:ark] = doc['id'] manifest[:versions] = [] doc.xpath('lastAddVersion').each do |el| manifest[:last_add_version] = el.text end manifest[:files] = {} end last_version = xml.xpath('/objectInfo/versions/version[last()]/@id').text.to_i xml.xpath('/objectInfo/versions/version').each do |doc| v = doc['id'].to_i doc.xpath('manifest').each do |m| manifest[:versions] << { num: v, created: m['created'] } m.xpath('file').each do |f| key = f.xpath('key').text.split('|')[1] manifest[:files][f['id']] = manifest[:files].fetch(f['id'], {}) file = manifest[:files][f['id']] file[:versions] = file.fetch(:versions, {}) vers = file[:versions] if key.to_i == v vers[v] = vers.fetch(v, {}) rec = vers[v] rec[:creation_date] = f.xpath('creationDate').text rec[:digest] = f.xpath('digest').text rec[:digestType] = f.xpath('digestType').text rec[:size] = f.xpath('size').text.to_i rec[:mime_type] = f.xpath('mimeType').text rec[:key] = f.xpath('key').text rec[:current] = true if v == last_version else vers[key.to_i][:refs] = vers[key.to_i].fetch(:refs, []) vers[key.to_i][:refs].append(v) if v == last_version vers[key.to_i][:current] = true vers[key.to_i].delete(:refs) if vers[key.to_i][:refs].length == v - key.to_i end end end end end manifest[:files] = manifest[:files].sort.to_h manifest[:files].each_key do |f| current = false manifest[:files][f][:versions].each_value do |fv| next unless fv.key?(:current) current = true break end manifest[:files][f][:DELETED] = true unless current end manifest = JSON.parse(manifest.to_json) "# See https://github.com/CDLUC3/merritt-tinker/tree/main/yaml-manifest for more info\n#{YAML.dump(manifest)}" end
Source
# File app/lib/util/manifest_to_yaml.rb, line 88 def load_xml_diff(old, curr) pathsold = load_paths(old) pathscurr = load_paths(curr) diff = {} pathsold.each do |k, v| next if pathsold[k] == pathscurr[k] diff[v] = diff.fetch(v, { oldpath: [], newpath: [] }) diff[v].fetch(:oldpath, []).append(k) end pathscurr.each do |k, v| next if pathsold[k] == pathscurr[k] diff[v] = diff.fetch(v, { oldpath: [], newpath: [] }) diff[v].fetch(:newpath, []).append(k) end diff end