datacite-mapping 0.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +7 -0
- data/.gitignore +42 -0
- data/.rubocop.yml +28 -0
- data/.ruby-version +1 -0
- data/.travis.yml +2 -0
- data/.yardopts +2 -0
- data/CHANGES.md +3 -0
- data/Gemfile +3 -0
- data/LICENSE.md +22 -0
- data/README.md +168 -0
- data/Rakefile +49 -0
- data/datacite-mapping.gemspec +37 -0
- data/examples/reading.rb +75 -0
- data/examples/writing.rb +49 -0
- data/lib/datacite/mapping.rb +36 -0
- data/lib/datacite/mapping/alternate_identifier.rb +45 -0
- data/lib/datacite/mapping/contributor.rb +125 -0
- data/lib/datacite/mapping/creator.rb +48 -0
- data/lib/datacite/mapping/date.rb +153 -0
- data/lib/datacite/mapping/description.rb +121 -0
- data/lib/datacite/mapping/geo_location.rb +49 -0
- data/lib/datacite/mapping/geo_location_box.rb +137 -0
- data/lib/datacite/mapping/geo_location_point.rb +102 -0
- data/lib/datacite/mapping/identifier.rb +45 -0
- data/lib/datacite/mapping/module_info.rb +12 -0
- data/lib/datacite/mapping/name_identifier.rb +48 -0
- data/lib/datacite/mapping/related_identifier.rb +209 -0
- data/lib/datacite/mapping/resource.rb +201 -0
- data/lib/datacite/mapping/resource_type.rb +83 -0
- data/lib/datacite/mapping/rights.rb +36 -0
- data/lib/datacite/mapping/subject.rb +55 -0
- data/lib/datacite/mapping/title.rb +69 -0
- data/spec/.rubocop.yml +7 -0
- data/spec/data/resource.xml +61 -0
- data/spec/rspec_custom_matchers.rb +69 -0
- data/spec/spec_helper.rb +31 -0
- data/spec/unit/datacite/mapping/alternate_identifier_spec.rb +60 -0
- data/spec/unit/datacite/mapping/contributor_spec.rb +129 -0
- data/spec/unit/datacite/mapping/creator_spec.rb +125 -0
- data/spec/unit/datacite/mapping/date_spec.rb +246 -0
- data/spec/unit/datacite/mapping/description_spec.rb +89 -0
- data/spec/unit/datacite/mapping/geo_location_box_spec.rb +241 -0
- data/spec/unit/datacite/mapping/geo_location_point_spec.rb +148 -0
- data/spec/unit/datacite/mapping/geo_location_spec.rb +116 -0
- data/spec/unit/datacite/mapping/identifier_spec.rb +75 -0
- data/spec/unit/datacite/mapping/name_identifier_spec.rb +89 -0
- data/spec/unit/datacite/mapping/related_identifier_spec.rb +157 -0
- data/spec/unit/datacite/mapping/resource_spec.rb +727 -0
- data/spec/unit/datacite/mapping/resource_type_spec.rb +69 -0
- data/spec/unit/datacite/mapping/rights_spec.rb +78 -0
- data/spec/unit/datacite/mapping/subject_spec.rb +108 -0
- data/spec/unit/datacite/mapping/title_spec.rb +113 -0
- metadata +262 -0
data/examples/writing.rb
ADDED
@@ -0,0 +1,49 @@
|
|
1
|
+
#!/usr/bin/env ruby
|
2
|
+
|
3
|
+
require 'datacite/mapping'
|
4
|
+
include Datacite::Mapping
|
5
|
+
|
6
|
+
# Based on "Example for a simple dataset"
|
7
|
+
# http://schema.datacite.org/meta/kernel-3/example/datacite-example-dataset-v3.0.xml
|
8
|
+
resource = Resource.new(
|
9
|
+
identifier: Identifier.new(value: '10.5072/D3P26Q35R-Test'),
|
10
|
+
creators: [
|
11
|
+
Creator.new(name: 'Fosmire, Michael'),
|
12
|
+
Creator.new(name: 'Wertz, Ruth'),
|
13
|
+
Creator.new(name: 'Purzer, Senay')
|
14
|
+
],
|
15
|
+
titles: [
|
16
|
+
Title.new(value: 'Critical Engineering Literacy Test (CELT)')
|
17
|
+
],
|
18
|
+
publisher: 'Purdue University Research Repository (PURR)',
|
19
|
+
publication_year: 2013,
|
20
|
+
subjects: [
|
21
|
+
Subject.new(value: 'Assessment'),
|
22
|
+
Subject.new(value: 'Information Literacy'),
|
23
|
+
Subject.new(value: 'Engineering'),
|
24
|
+
Subject.new(value: 'Undergraduate Students'),
|
25
|
+
Subject.new(value: 'CELT'),
|
26
|
+
Subject.new(value: 'Purdue University')
|
27
|
+
],
|
28
|
+
language: 'en',
|
29
|
+
resource_type: ResourceType.new(resource_type_general: ResourceTypeGeneral::DATASET, value: 'Dataset'),
|
30
|
+
version: '1',
|
31
|
+
descriptions: [
|
32
|
+
Description.new(
|
33
|
+
type: DescriptionType::ABSTRACT,
|
34
|
+
value: 'We developed an instrument, Critical Engineering Literacy Test (CELT), which is a multiple choice instrument
|
35
|
+
designed to measure undergraduate students’ scientific and information literacy skills. It requires students to
|
36
|
+
first read a technical memo and, based on the memo’s arguments, answer eight multiple choice and six open-ended
|
37
|
+
response questions. We collected data from 143 first-year engineering students and conducted an item analysis. The
|
38
|
+
KR-20 reliability of the instrument was .39. Item difficulties ranged between .17 to .83. The results indicate low
|
39
|
+
reliability index but acceptable levels of item difficulties and item discrimination indices. Students were most
|
40
|
+
challenged when answering items measuring scientific and mathematical literacy (i.e., identifying incorrect
|
41
|
+
information).'
|
42
|
+
)
|
43
|
+
]
|
44
|
+
)
|
45
|
+
|
46
|
+
xml = resource.save_to_xml
|
47
|
+
formatter = REXML::Formatters::Pretty.new
|
48
|
+
formatter.compact = true
|
49
|
+
formatter.write(xml, $stdout)
|
@@ -0,0 +1,36 @@
|
|
1
|
+
# Module for working with the [DataCite metadata schema](https://schema.datacite.org/meta/kernel-3/index.html)
|
2
|
+
module Datacite
|
3
|
+
# Maps DataCite XML to Ruby objects
|
4
|
+
module Mapping
|
5
|
+
|
6
|
+
Dir.glob(File.expand_path('../mapping/*.rb', __FILE__)).sort.each(&method(:require))
|
7
|
+
|
8
|
+
class << self
|
9
|
+
attr_writer :log
|
10
|
+
end
|
11
|
+
|
12
|
+
# Gets the logger for the module. Default logger logs to `$stdout`.
|
13
|
+
# @return [Logger] the logger
|
14
|
+
def self.log
|
15
|
+
self.log_device = $stdout unless @log
|
16
|
+
@log
|
17
|
+
end
|
18
|
+
|
19
|
+
# Sets the log device. Defaults to `$stdout`
|
20
|
+
# @param value [IO] the log device
|
21
|
+
def self.log_device=(value)
|
22
|
+
@log = new_logger(logdev: value)
|
23
|
+
end
|
24
|
+
|
25
|
+
private
|
26
|
+
|
27
|
+
def self.new_logger(logdev:, level: Logger::DEBUG, shift_age: 10, shift_size: 1024 * 1024)
|
28
|
+
logger = Logger.new(logdev, shift_age, shift_size)
|
29
|
+
logger.level = level
|
30
|
+
logger.formatter = proc do |severity, datetime, progname, msg|
|
31
|
+
"#{datetime.to_time.utc} #{severity} -#{progname}- #{msg}\n"
|
32
|
+
end
|
33
|
+
logger
|
34
|
+
end
|
35
|
+
end
|
36
|
+
end
|
@@ -0,0 +1,45 @@
|
|
1
|
+
require 'xml/mapping_extensions'
|
2
|
+
|
3
|
+
module Datacite
|
4
|
+
module Mapping
|
5
|
+
|
6
|
+
# An identifier or identifiers other than the primary {Identifier}
|
7
|
+
# applied to the {Resource}.
|
8
|
+
class AlternateIdentifier
|
9
|
+
include XML::Mapping
|
10
|
+
|
11
|
+
root_element_name 'alternateIdentifier'
|
12
|
+
|
13
|
+
text_node :type, '@alternateIdentifierType'
|
14
|
+
text_node :value, 'text()'
|
15
|
+
|
16
|
+
alias_method :_type=, :type=
|
17
|
+
private :_type=
|
18
|
+
alias_method :_value=, :value=
|
19
|
+
private :_value=
|
20
|
+
|
21
|
+
# Initializes a new {AlternateIdentifier}
|
22
|
+
# @param type [String] the identifier type
|
23
|
+
# @param value [String] the identifier value
|
24
|
+
def initialize(type:, value:)
|
25
|
+
self.type = type
|
26
|
+
self.value = value
|
27
|
+
end
|
28
|
+
|
29
|
+
# Sets the type. Cannot be nil.
|
30
|
+
# @param val [String] the identifier type
|
31
|
+
def type=(val)
|
32
|
+
fail ArgumentError, 'No identifier type provided' unless val
|
33
|
+
self._type = val
|
34
|
+
end
|
35
|
+
|
36
|
+
# Sets the value. Cannot be nil.
|
37
|
+
# @param val [String] the value
|
38
|
+
def value=(val)
|
39
|
+
fail ArgumentError, 'No identifier value provided' unless val
|
40
|
+
self._value = val
|
41
|
+
end
|
42
|
+
|
43
|
+
end
|
44
|
+
end
|
45
|
+
end
|
@@ -0,0 +1,125 @@
|
|
1
|
+
require 'xml/mapping_extensions'
|
2
|
+
require_relative 'name_identifier'
|
3
|
+
|
4
|
+
module Datacite
|
5
|
+
module Mapping
|
6
|
+
|
7
|
+
# Controlled vocabulary of contributor types.
|
8
|
+
class ContributorType < TypesafeEnum::Base
|
9
|
+
# @!parse CONTACT_PERSON = ContactPerson
|
10
|
+
new :CONTACT_PERSON, 'ContactPerson'
|
11
|
+
|
12
|
+
# @!parse DATA_COLLECTOR = DataCollector
|
13
|
+
new :DATA_COLLECTOR, 'DataCollector'
|
14
|
+
|
15
|
+
# @!parse DATA_CURATOR = DataCurator
|
16
|
+
new :DATA_CURATOR, 'DataCurator'
|
17
|
+
|
18
|
+
# @!parse DATA_MANAGER = DataManager
|
19
|
+
new :DATA_MANAGER, 'DataManager'
|
20
|
+
|
21
|
+
# @!parse DISTRIBUTOR = Distributor
|
22
|
+
new :DISTRIBUTOR, 'Distributor'
|
23
|
+
|
24
|
+
# @!parse EDITOR = Editor
|
25
|
+
new :EDITOR, 'Editor'
|
26
|
+
|
27
|
+
# @!parse FUNDER = Funder
|
28
|
+
new :FUNDER, 'Funder'
|
29
|
+
|
30
|
+
# @!parse HOSTING_INSTITUTION = HostingInstitution
|
31
|
+
new :HOSTING_INSTITUTION, 'HostingInstitution'
|
32
|
+
|
33
|
+
# @!parse PRODUCER = Producer
|
34
|
+
new :PRODUCER, 'Producer'
|
35
|
+
|
36
|
+
# @!parse PROJECT_LEADER = ProjectLeader
|
37
|
+
new :PROJECT_LEADER, 'ProjectLeader'
|
38
|
+
|
39
|
+
# @!parse PROJECT_MANAGER = ProjectManager
|
40
|
+
new :PROJECT_MANAGER, 'ProjectManager'
|
41
|
+
|
42
|
+
# @!parse PROJECT_MEMBER = ProjectMember
|
43
|
+
new :PROJECT_MEMBER, 'ProjectMember'
|
44
|
+
|
45
|
+
# @!parse REGISTRATION_AGENCY = RegistrationAgency
|
46
|
+
new :REGISTRATION_AGENCY, 'RegistrationAgency'
|
47
|
+
|
48
|
+
# @!parse REGISTRATION_AUTHORITY = RegistrationAuthority
|
49
|
+
new :REGISTRATION_AUTHORITY, 'RegistrationAuthority'
|
50
|
+
|
51
|
+
# @!parse RELATED_PERSON = RelatedPerson
|
52
|
+
new :RELATED_PERSON, 'RelatedPerson'
|
53
|
+
|
54
|
+
# @!parse RESEARCHER = Researcher
|
55
|
+
new :RESEARCHER, 'Researcher'
|
56
|
+
|
57
|
+
# @!parse RESEARCH_GROUP = ResearchGroup
|
58
|
+
new :RESEARCH_GROUP, 'ResearchGroup'
|
59
|
+
|
60
|
+
# @!parse RIGHTS_HOLDER = RightsHolder
|
61
|
+
new :RIGHTS_HOLDER, 'RightsHolder'
|
62
|
+
|
63
|
+
# @!parse SPONSOR = Sponsor
|
64
|
+
new :SPONSOR, 'Sponsor'
|
65
|
+
|
66
|
+
# @!parse SUPERVISOR = Supervisor
|
67
|
+
new :SUPERVISOR, 'Supervisor'
|
68
|
+
|
69
|
+
# @!parse WORK_PACKAGE_LEADER = WorkPackageLeader
|
70
|
+
new :WORK_PACKAGE_LEADER, 'WorkPackageLeader'
|
71
|
+
|
72
|
+
# @!parse OTHER = Other
|
73
|
+
new :OTHER, 'Other'
|
74
|
+
|
75
|
+
end
|
76
|
+
|
77
|
+
# The institution or person responsible for collecting, creating, or otherwise contributing to the developement of the dataset.
|
78
|
+
class Contributor
|
79
|
+
include XML::Mapping
|
80
|
+
|
81
|
+
# @!attribute [rw] name
|
82
|
+
# @return [String] the personal name of the contributor, in the format `Family, Given`. Cannot be empty or nil
|
83
|
+
text_node :name, 'contributorName'
|
84
|
+
|
85
|
+
# @!attribute [rw] identifier
|
86
|
+
# @return [NameIdentifier, nil] an identifier for the contributor. Optional.
|
87
|
+
object_node :identifier, 'nameIdentifier', class: NameIdentifier, default_value: nil
|
88
|
+
|
89
|
+
# @!attribute [rw] affiliations
|
90
|
+
# @return [Array<String>] the contributor's affiliations. Defaults to an empty list.
|
91
|
+
array_node :affiliations, 'affiliation', class: String, default_value: []
|
92
|
+
|
93
|
+
# @!attribute [rw] type
|
94
|
+
# @return [ContributorType] the contributor type. Cannot be nil.
|
95
|
+
typesafe_enum_node :type, '@contributorType', class: ContributorType
|
96
|
+
|
97
|
+
alias_method :_name=, :name=
|
98
|
+
alias_method :_type=, :type=
|
99
|
+
private :_name=
|
100
|
+
private :_type=
|
101
|
+
|
102
|
+
# Initializes a new {Contributor}.
|
103
|
+
# @param name [String] the personal name of the contributor, in the format `Family, Given`. Cannot be empty or nil
|
104
|
+
# @param identifier [NameIdentifier, nil] an identifier for the contributor. Optional.
|
105
|
+
# @param affiliations [Array<Affiliation>] the contributor's affiliations. Defaults to an empty list.
|
106
|
+
# @param type [ContributorType] the contributor type. Cannot be nil.
|
107
|
+
def initialize(name:, identifier: nil, affiliations: nil, type:)
|
108
|
+
self.name = name
|
109
|
+
self.identifier = identifier
|
110
|
+
self.affiliations = affiliations || []
|
111
|
+
self.type = type
|
112
|
+
end
|
113
|
+
|
114
|
+
def name=(value)
|
115
|
+
fail ArgumentError, 'Name cannot be empty or nil' unless value && !value.empty?
|
116
|
+
self._name = value
|
117
|
+
end
|
118
|
+
|
119
|
+
def type=(value)
|
120
|
+
fail ArgumentError, 'Type cannot be nil' unless value
|
121
|
+
self._type = value
|
122
|
+
end
|
123
|
+
end
|
124
|
+
end
|
125
|
+
end
|
@@ -0,0 +1,48 @@
|
|
1
|
+
require 'xml/mapping'
|
2
|
+
require_relative 'name_identifier'
|
3
|
+
|
4
|
+
module Datacite
|
5
|
+
module Mapping
|
6
|
+
# The main researchers involved working on the data, or the authors of the publication in priority order.
|
7
|
+
class Creator
|
8
|
+
include XML::Mapping
|
9
|
+
|
10
|
+
# @!attribute [rw] name
|
11
|
+
# @return [String] The personal name of the creator, in the format `Family, Given`. Cannot be empty or nil.
|
12
|
+
text_node :name, 'creatorName'
|
13
|
+
|
14
|
+
# @!attribute [rw] identifier
|
15
|
+
# @return [NameIdentifier, nil] An identifier for the creator. Optional.
|
16
|
+
object_node :identifier, 'nameIdentifier', class: NameIdentifier, default_value: nil
|
17
|
+
|
18
|
+
# @!attribute [rw] affiliations
|
19
|
+
# @return [Array<Affiliation>, nil] The creator's affiliations. Defaults to an empty list.
|
20
|
+
array_node :affiliations, 'affiliation', class: String, default_value: []
|
21
|
+
|
22
|
+
alias_method :_name=, :name=
|
23
|
+
private :_name=
|
24
|
+
|
25
|
+
alias_method :_affiliations=, :affiliations=
|
26
|
+
private :_affiliations=
|
27
|
+
|
28
|
+
# Initializes a new {Creator}.
|
29
|
+
# @param name [String] The personal name of the creator, in the format `Family, Given`. Cannot be empty or nil.
|
30
|
+
# @param identifier [NameIdentifier, nil] An identifier for the creator. Optional.
|
31
|
+
# @param affiliations [Array<Affiliation>, nil] The creator's affiliations. Defaults to an empty list.
|
32
|
+
def initialize(name:, identifier: nil, affiliations: [])
|
33
|
+
self.name = name
|
34
|
+
self.identifier = identifier
|
35
|
+
self.affiliations = affiliations
|
36
|
+
end
|
37
|
+
|
38
|
+
def name=(value)
|
39
|
+
fail ArgumentError, 'Name cannot be empty or nil' unless value && !value.empty?
|
40
|
+
self._name = value
|
41
|
+
end
|
42
|
+
|
43
|
+
def affiliations=(value)
|
44
|
+
self._affiliations = value || []
|
45
|
+
end
|
46
|
+
end
|
47
|
+
end
|
48
|
+
end
|
@@ -0,0 +1,153 @@
|
|
1
|
+
require 'xml/mapping_extensions'
|
2
|
+
|
3
|
+
module Datacite
|
4
|
+
module Mapping
|
5
|
+
|
6
|
+
# Controlled vocabulary of date types.
|
7
|
+
class DateType < TypesafeEnum::Base
|
8
|
+
# @!parse ACCEPTED = Accepted
|
9
|
+
new :ACCEPTED, 'Accepted'
|
10
|
+
|
11
|
+
# @!parse AVAILABLE = Available
|
12
|
+
new :AVAILABLE, 'Available'
|
13
|
+
|
14
|
+
# @!parse COPYRIGHTED = Copyrighted
|
15
|
+
new :COPYRIGHTED, 'Copyrighted'
|
16
|
+
|
17
|
+
# @!parse COLLECTED = Collected
|
18
|
+
new :COLLECTED, 'Collected'
|
19
|
+
|
20
|
+
# @!parse CREATED = Created
|
21
|
+
new :CREATED, 'Created'
|
22
|
+
|
23
|
+
# @!parse ISSUED = Issued
|
24
|
+
new :ISSUED, 'Issued'
|
25
|
+
|
26
|
+
# @!parse SUBMITTED = Submitted
|
27
|
+
new :SUBMITTED, 'Submitted'
|
28
|
+
|
29
|
+
# @!parse UPDATED = Updated
|
30
|
+
new :UPDATED, 'Updated'
|
31
|
+
|
32
|
+
# @!parse VALID = Valid
|
33
|
+
new :VALID, 'Valid'
|
34
|
+
|
35
|
+
end
|
36
|
+
|
37
|
+
# Represents a DataCite `<date/>` field, which can be a year, date (year-month-day or just year-month),
|
38
|
+
# or ISO8601 datetime.
|
39
|
+
#
|
40
|
+
# @!attribute [r] year
|
41
|
+
# @return [Integer] The year.
|
42
|
+
# @!attribute [r] month
|
43
|
+
# @return [Integer, nil] The month. Can be `nil` if no month was specified.
|
44
|
+
# @!attribute [r] day
|
45
|
+
# @return [Integer, nil] The day. Can be `nil` if no day was specified.
|
46
|
+
# @!attribute [r] hour
|
47
|
+
# @return [Integer, nil] The hour. Can be `nil` if no hour was specified.
|
48
|
+
# @!attribute [r] minute
|
49
|
+
# @return [Integer, nil] The minutes. Can be `nil` if no minutes were specified.
|
50
|
+
# @!attribute [r] sec
|
51
|
+
# @return [Integer, nil] The seconds. Can be `nil` if no seconds were specified.
|
52
|
+
# @!attribute [r] nsec
|
53
|
+
# @return [Integer, nil] The nanoseconds. Can be `nil` if no nanoseconds were specified.
|
54
|
+
class Date
|
55
|
+
include XML::Mapping
|
56
|
+
|
57
|
+
# @!attribute [rw] type
|
58
|
+
# @return [DateType] the type of date. Cannot be nil.
|
59
|
+
typesafe_enum_node :type, '@dateType', class: DateType
|
60
|
+
alias_method :_type=, :type=
|
61
|
+
private :_type=
|
62
|
+
|
63
|
+
# @!method value
|
64
|
+
# @return [String] The value as a string. May be any [W3C DateTime format](http://www.w3.org/TR/NOTE-datetime).
|
65
|
+
text_node :value, 'text()'
|
66
|
+
alias_method :_value=, :value=
|
67
|
+
private :_value=
|
68
|
+
|
69
|
+
attr_reader :year
|
70
|
+
attr_reader :month
|
71
|
+
attr_reader :day
|
72
|
+
attr_reader :hour
|
73
|
+
attr_reader :minute
|
74
|
+
attr_reader :sec
|
75
|
+
attr_reader :nsec
|
76
|
+
|
77
|
+
# Initializes a new `Date`
|
78
|
+
#
|
79
|
+
# @param type [DateType] the type of date. Cannot be nil.
|
80
|
+
# @param value [DateTime, Date, Integer, String] The value, as a `DateTime`, `Date`, or `Integer`,
|
81
|
+
# or as a `String` in any [W3C DateTime format](http://www.w3.org/TR/NOTE-datetime)
|
82
|
+
def initialize(type:, value:)
|
83
|
+
self.type = type
|
84
|
+
self.value = value
|
85
|
+
end
|
86
|
+
|
87
|
+
def type=(val)
|
88
|
+
fail ArgumentError, 'Date type cannot be nil' unless val
|
89
|
+
self._type = val
|
90
|
+
end
|
91
|
+
|
92
|
+
# Sets the value.
|
93
|
+
#
|
94
|
+
# @param val [DateTime, Date, Integer, String] The value, as a `DateTime`, `Date`, or `Integer`,
|
95
|
+
# or as a `String` in any [W3C DateTime format](http://www.w3.org/TR/NOTE-datetime)
|
96
|
+
def value=(val) # rubocop:disable Metrics/MethodLength, Metrics/AbcSize, Metrics/CyclomaticComplexity, Metrics/PerceivedComplexity
|
97
|
+
@date_time = to_datetime(val)
|
98
|
+
@date = @date_time ? @date_time.to_date : to_date(val)
|
99
|
+
@year = to_year(val)
|
100
|
+
@month = to_month(val)
|
101
|
+
@day = to_day(val)
|
102
|
+
new_value = val.respond_to?(:iso8601) ? val.iso8601 : val.to_s
|
103
|
+
if new_value.include?('T')
|
104
|
+
@hour = @date_time.hour if @date_time
|
105
|
+
@minute = @date_time.minute if @date_time
|
106
|
+
@sec = @date_time.sec if @date_time
|
107
|
+
@nsec = @date_time.to_time.nsec if @date_time
|
108
|
+
end
|
109
|
+
fail ArgumentError, "Unable to parse date value '#{val}'" unless @year
|
110
|
+
self._value = new_value
|
111
|
+
end
|
112
|
+
|
113
|
+
private
|
114
|
+
|
115
|
+
def to_year(val)
|
116
|
+
return val if val.is_a?(Integer)
|
117
|
+
return val.year if val.respond_to?(:year)
|
118
|
+
matchdata = val.to_s.match(/^[0-9]+/)
|
119
|
+
matchdata[0].to_i if matchdata
|
120
|
+
end
|
121
|
+
|
122
|
+
def to_month(val)
|
123
|
+
return val.month if val.respond_to?(:month)
|
124
|
+
matchdata = val.to_s.match(/^[0-9]+-([0-9]+)/)
|
125
|
+
matchdata[1].to_i if matchdata
|
126
|
+
end
|
127
|
+
|
128
|
+
def to_day(val)
|
129
|
+
return val.day if val.respond_to?(:day)
|
130
|
+
matchdata = val.to_s.match(/^[0-9]+-[0-9]+-([0-9]+)/)
|
131
|
+
matchdata[1].to_i if matchdata
|
132
|
+
end
|
133
|
+
|
134
|
+
def to_datetime(val)
|
135
|
+
return val if val.is_a?(DateTime)
|
136
|
+
DateTime.parse(val.to_s)
|
137
|
+
rescue ArgumentError => e
|
138
|
+
Mapping.log.debug("Can't extract DateTime from date value '#{val}': #{e}")
|
139
|
+
nil
|
140
|
+
end
|
141
|
+
|
142
|
+
def to_date(val)
|
143
|
+
return val if val.is_a?(::Date)
|
144
|
+
return ::Date.parse(val.iso8601) if val.respond_to?(:iso8601)
|
145
|
+
::Date.parse(val.to_s)
|
146
|
+
rescue ArgumentError => e
|
147
|
+
Mapping.log.debug("Can't extract Date from date value '#{val}': #{e}")
|
148
|
+
nil
|
149
|
+
end
|
150
|
+
|
151
|
+
end
|
152
|
+
end
|
153
|
+
end
|