Sha256: af6b4b84e3da7eba9a88d8cb3a14182ced7a0ae0800bad0092116ddc974b15c2

Contents?: true

Size: 1.47 KB

Versions: 2

Compression:

Stored size: 1.47 KB

Contents

# frozen_string_literal: true

require 'xml/mapping'

module XML
  class XXPath
    attr_reader :xpathstr
  end
end

module Datacite
  module Mapping

    module ReadOnlyNodes
      def warn_reason
        @warn_reason ||= @options[:warn_reason]
      end

      def value_from(obj)
        obj.send(@attrname)
      end

      def value_str(val)
        return "[ #{val.map(&:to_s).join(', ')} ]" if val.is_a?(Array)

        "'#{val}'"
      end

      def obj_to_xml(obj, _xml)
        val = value_from(obj)
        return unless val

        warn_ignored(val)
      end

      def warn_ignored(val)
        warning = "ignoring #{@attrname} #{value_str(val)}"
        warning = "#{warn_reason}; #{warning}" if warn_reason
        ReadOnlyNodes.warn(warning)
      end

      # public to allow testing
      def self.warn(warning)
        super
      end
    end

    class ReadOnlyTextNode < XML::Mapping::TextNode
      def warn_ignored(val)
        raise ArgumentError, "Expected string, got #{val}" unless val.respond_to?(:strip)
        return if val.strip.empty?

        super
      end
      include ReadOnlyNodes
    end
    XML::Mapping.add_node_class ReadOnlyTextNode

    class ReadOnlyArrayNode < XML::Mapping::ArrayNode
      def warn_ignored(val)
        raise ArgumentError, "Expected array, got #{val}" unless val.respond_to?(:empty?)
        return if val.empty?

        super
      end
      include ReadOnlyNodes
    end
    XML::Mapping.add_node_class ReadOnlyArrayNode

  end
end

Version data entries

2 entries across 2 versions & 1 rubygems

Version Path
datacite-mapping-0.4.1 lib/datacite/mapping/read_only_nodes.rb
datacite-mapping-0.4.0 lib/datacite/mapping/read_only_nodes.rb