sul-dlss/moab-versioning

View on GitHub
lib/serializer/manifest.rb

Summary

Maintainability
A
0 mins
Test Coverage
A
100%
# frozen_string_literal: true

module Serializer
  # Subclass of {Serializable} that adds methods for marshalling/unmarshalling data
  # to a persistent XML file format.
  #
  # ====Data Model
  # * {Serializable} = utility methods to faciliate serialization to Hash, JSON, or YAML
  #   * <b>{Manifest} = subclass adds methods for marshalling/unmarshalling data to XML file format</b>
  #
  # @see Serializable
  # @note Copyright (c) 2012 by The Board of Trustees of the Leland Stanford Junior University.
  #   All rights reserved.  See {file:LICENSE.rdoc} for details.
  class Manifest < Serializer::Serializable
    include HappyMapper

    # @api internal
    # @param filename [String] Optional filename if one wishes to override the default filename
    # @return [String] Returns the standard filename (derived from the class name) to be used for serializing an object
    def self.xml_filename(filename = nil)
      if filename
        filename
      else
        cname = name.split(/::/).last
        "#{cname[0, 1].downcase}#{cname[1..]}.xml"
      end
    end

    # @api internal
    # @param parent_dir [Pathname,String] The location of the directory in which the xml file is located
    # @param filename [String] Optional filename if one wishes to override the default filename
    # @return [Pathname] The location of the xml file
    def self.xml_pathname(parent_dir, filename = nil)
      Pathname.new(parent_dir).join(xml_filename(filename))
    end

    # @api external
    # @param parent_dir [Pathname,String] The location of the directory in which the xml file is located
    # @param filename [String] Optional filename if one wishes to override the default filename
    # @return [Boolean] Returns true if the xml file exists
    def self.xml_pathname_exist?(parent_dir, filename = nil)
      xml_pathname(parent_dir, filename).exist?
    end

    # @api external
    # @param parent_dir [Pathname,String] The location of the directory in which the xml file is located
    # @param filename [String] Optional filename if one wishes to override the default filename
    # @return [Serializable] Read the xml file and return the parsed XML
    # @example {include:file:spec/features/serializer/read_xml_spec.rb}
    def self.read_xml_file(parent_dir, filename = nil)
      parse(xml_pathname(parent_dir, filename).read)
    end

    # @api external
    # @param xml_object [Serializable]
    # @param parent_dir [Pathname,String] The location of the directory in which the xml file is located
    # @param filename [String] Optional filename if one wishes to override the default filename
    # @return [void] Serializize the in-memory object to a xml file instance
    def self.write_xml_file(xml_object, parent_dir, filename = nil)
      parent_dir.mkpath
      xml_pathname(parent_dir, filename).open('w') do |f|
        xml_builder = Nokogiri::XML::Builder.new(encoding: 'UTF-8')
        xml_builder = xml_object.to_xml(xml_builder)
        f << xml_builder.to_xml
      end
      nil
    end

    # @api external
    # @param parent_dir [Pathname,String] The location of the directory in which the xml file is located
    # @param filename [String] Optional filename if one wishes to override the default filename
    # @return [void] Serializize the in-memory object to a xml file instance
    # @example {include:file:spec/features/serializer/write_xml_spec.rb}
    def write_xml_file(parent_dir, filename = nil)
      self.class.write_xml_file(self, parent_dir, filename)
    end
  end
end