Class: Datacite::Mapping::Date

Inherits:
Object
  • Object
show all
Includes:
Comparable, XML::Mapping
Defined in:
lib/datacite/mapping/date.rb

Overview

Represents a DataCite <date/> field, which can be a year, date (year-month-day or just year-month), ISO8601 datetime, or RKMS-ISO8601 date range.

Instance Attribute Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(type:, value:) ⇒ Date

Initializes a new Date

Parameters:

  • type (DateType)

    the type of date. Cannot be nil.

  • value (DateTime, Date, Integer, String)

    The value, as a DateTime, Date, or Integer, or as a String in any W3C DateTime format



70
71
72
73
# File 'lib/datacite/mapping/date.rb', line 70

def initialize(type:, value:)
  self.type = type
  self.value = value
end

Instance Attribute Details

#date_informationString

Returns information to clarify a date.

Returns:

  • (String)

    information to clarify a date



123
# File 'lib/datacite/mapping/date.rb', line 123

text_node :date_information, '@dateInformation', default_value: nil

#date_valueDateValue? (readonly)

Returns the single date/time represented by this <date/> field, if it does not represent a ragne.

Returns:

  • (DateValue, nil)

    the single date/time represented by this <date/> field, if it does not represent a ragne



59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
# File 'lib/datacite/mapping/date.rb', line 59

class Date
  include Comparable
  include XML::Mapping

  attr_reader :date_value, :range_start, :range_end

  # Initializes a new `Date`
  #
  # @param type [DateType] the type of date. Cannot be nil.
  # @param value [DateTime, Date, Integer, String] The value, as a `DateTime`, `Date`, or `Integer`,
  #   or as a `String` in any [W3C DateTime format](http://www.w3.org/TR/NOTE-datetime)
  def initialize(type:, value:)
    self.type = type
    self.value = value
  end

  def type=(val)
    raise ArgumentError, 'Date type cannot be nil' unless val

    @type = val
  end

  # rubocop:disable Metrics/MethodLength

  def value=(val) # rubocop:disable Metrics/AbcSize
    parts = val.to_s.split('/', -1) # negative limit so we don't drop trailing empty string
    @date_value, @range_start, @range_end = nil
    case parts.size
    when 1
      @date_value = DateValue.new(val)
    when 2
      @range_start, @range_end = parts.map(&:strip).map { |part| DateValue.new(part) unless part == '' }
      # puts "#{val} -> [#{range_start}, #{range_end}]"
    else
      raise ArgumentError, "Unable to parse date value #{val}"
    end
    @value = date_value ? date_value.to_s : "#{range_start}/#{range_end}"
  end
  # rubocop:enable Metrics/MethodLength

  def <=>(other)
    return nil unless other.instance_of?(self.class)

    %i[date_value range_start range_end type].each do |v|
      order = send(v) <=> other.send(v)
      return order if order.nonzero?
    end
    0
  end

  def hash
    [date_value, range_start, range_end, type].hash
  end

  def to_s
    @value
  end

  # @!attribute [rw] type
  #  @return [DateType] the type of date. Cannot be nil.
  typesafe_enum_node :type, '@dateType', class: DateType

  # @!attribute [rw] date_information
  #   @return [String] information to clarify a date
  text_node :date_information, '@dateInformation', default_value: nil

  # @!method value
  #   @return [String] The value as a string. May be any [W3C DateTime format](http://www.w3.org/TR/NOTE-datetime).
  text_node :value, 'text()'

  fallback_mapping :datacite_3, :_default
end

#range_endDateValue? (readonly)

Returns the end of the date range represented by this <date/> field, if it represents a range, and the range is not open on the upper end.

Returns:

  • (DateValue, nil)

    the end of the date range represented by this <date/> field, if it represents a range, and the range is not open on the upper end



59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
# File 'lib/datacite/mapping/date.rb', line 59

class Date
  include Comparable
  include XML::Mapping

  attr_reader :date_value, :range_start, :range_end

  # Initializes a new `Date`
  #
  # @param type [DateType] the type of date. Cannot be nil.
  # @param value [DateTime, Date, Integer, String] The value, as a `DateTime`, `Date`, or `Integer`,
  #   or as a `String` in any [W3C DateTime format](http://www.w3.org/TR/NOTE-datetime)
  def initialize(type:, value:)
    self.type = type
    self.value = value
  end

  def type=(val)
    raise ArgumentError, 'Date type cannot be nil' unless val

    @type = val
  end

  # rubocop:disable Metrics/MethodLength

  def value=(val) # rubocop:disable Metrics/AbcSize
    parts = val.to_s.split('/', -1) # negative limit so we don't drop trailing empty string
    @date_value, @range_start, @range_end = nil
    case parts.size
    when 1
      @date_value = DateValue.new(val)
    when 2
      @range_start, @range_end = parts.map(&:strip).map { |part| DateValue.new(part) unless part == '' }
      # puts "#{val} -> [#{range_start}, #{range_end}]"
    else
      raise ArgumentError, "Unable to parse date value #{val}"
    end
    @value = date_value ? date_value.to_s : "#{range_start}/#{range_end}"
  end
  # rubocop:enable Metrics/MethodLength

  def <=>(other)
    return nil unless other.instance_of?(self.class)

    %i[date_value range_start range_end type].each do |v|
      order = send(v) <=> other.send(v)
      return order if order.nonzero?
    end
    0
  end

  def hash
    [date_value, range_start, range_end, type].hash
  end

  def to_s
    @value
  end

  # @!attribute [rw] type
  #  @return [DateType] the type of date. Cannot be nil.
  typesafe_enum_node :type, '@dateType', class: DateType

  # @!attribute [rw] date_information
  #   @return [String] information to clarify a date
  text_node :date_information, '@dateInformation', default_value: nil

  # @!method value
  #   @return [String] The value as a string. May be any [W3C DateTime format](http://www.w3.org/TR/NOTE-datetime).
  text_node :value, 'text()'

  fallback_mapping :datacite_3, :_default
end

#range_startDateValue? (readonly)

Returns the start of the date range represented by this <date/> field, if it represents a range, and the range is not open on the lower end.

Returns:

  • (DateValue, nil)

    the start of the date range represented by this <date/> field, if it represents a range, and the range is not open on the lower end



59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
# File 'lib/datacite/mapping/date.rb', line 59

class Date
  include Comparable
  include XML::Mapping

  attr_reader :date_value, :range_start, :range_end

  # Initializes a new `Date`
  #
  # @param type [DateType] the type of date. Cannot be nil.
  # @param value [DateTime, Date, Integer, String] The value, as a `DateTime`, `Date`, or `Integer`,
  #   or as a `String` in any [W3C DateTime format](http://www.w3.org/TR/NOTE-datetime)
  def initialize(type:, value:)
    self.type = type
    self.value = value
  end

  def type=(val)
    raise ArgumentError, 'Date type cannot be nil' unless val

    @type = val
  end

  # rubocop:disable Metrics/MethodLength

  def value=(val) # rubocop:disable Metrics/AbcSize
    parts = val.to_s.split('/', -1) # negative limit so we don't drop trailing empty string
    @date_value, @range_start, @range_end = nil
    case parts.size
    when 1
      @date_value = DateValue.new(val)
    when 2
      @range_start, @range_end = parts.map(&:strip).map { |part| DateValue.new(part) unless part == '' }
      # puts "#{val} -> [#{range_start}, #{range_end}]"
    else
      raise ArgumentError, "Unable to parse date value #{val}"
    end
    @value = date_value ? date_value.to_s : "#{range_start}/#{range_end}"
  end
  # rubocop:enable Metrics/MethodLength

  def <=>(other)
    return nil unless other.instance_of?(self.class)

    %i[date_value range_start range_end type].each do |v|
      order = send(v) <=> other.send(v)
      return order if order.nonzero?
    end
    0
  end

  def hash
    [date_value, range_start, range_end, type].hash
  end

  def to_s
    @value
  end

  # @!attribute [rw] type
  #  @return [DateType] the type of date. Cannot be nil.
  typesafe_enum_node :type, '@dateType', class: DateType

  # @!attribute [rw] date_information
  #   @return [String] information to clarify a date
  text_node :date_information, '@dateInformation', default_value: nil

  # @!method value
  #   @return [String] The value as a string. May be any [W3C DateTime format](http://www.w3.org/TR/NOTE-datetime).
  text_node :value, 'text()'

  fallback_mapping :datacite_3, :_default
end

#typeDateType

Returns the type of date. Cannot be nil.

Returns:

  • (DateType)

    the type of date. Cannot be nil.



119
# File 'lib/datacite/mapping/date.rb', line 119

typesafe_enum_node :type, '@dateType', class: DateType

Instance Method Details

#<=>(other)

rubocop:enable Metrics/MethodLength



99
100
101
102
103
104
105
106
107
# File 'lib/datacite/mapping/date.rb', line 99

def <=>(other)
  return nil unless other.instance_of?(self.class)

  %i[date_value range_start range_end type].each do |v|
    order = send(v) <=> other.send(v)
    return order if order.nonzero?
  end
  0
end

#hash



109
110
111
# File 'lib/datacite/mapping/date.rb', line 109

def hash
  [date_value, range_start, range_end, type].hash
end

#to_s



113
114
115
# File 'lib/datacite/mapping/date.rb', line 113

def to_s
  @value
end

#valueString

Returns The value as a string. May be any W3C DateTime format.

Returns:



127
# File 'lib/datacite/mapping/date.rb', line 127

text_node :value, 'text()'

#value=(val)

rubocop:disable Metrics/MethodLength



83
84
85
86
87
88
89
90
91
92
93
94
95
96
# File 'lib/datacite/mapping/date.rb', line 83

def value=(val) # rubocop:disable Metrics/AbcSize
  parts = val.to_s.split('/', -1) # negative limit so we don't drop trailing empty string
  @date_value, @range_start, @range_end = nil
  case parts.size
  when 1
    @date_value = DateValue.new(val)
  when 2
    @range_start, @range_end = parts.map(&:strip).map { |part| DateValue.new(part) unless part == '' }
    # puts "#{val} -> [#{range_start}, #{range_end}]"
  else
    raise ArgumentError, "Unable to parse date value #{val}"
  end
  @value = date_value ? date_value.to_s : "#{range_start}/#{range_end}"
end