Sha256: 24136972edc91277f7595970caf117a5a42e9f9fec2d8abc6f43b911c30df03f

Contents?: true

Size: 1.47 KB

Versions: 1

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

1 entries across 1 versions & 1 rubygems

Version Path
datacite-mapping-0.3.0 lib/datacite/mapping/read_only_nodes.rb