datacite-mapping 0.2.0 → 0.2.1
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 +4 -4
- data/CHANGES.md +6 -1
- data/README.md +2 -0
- data/lib/datacite/mapping/date.rb +19 -1
- data/lib/datacite/mapping/date_value.rb +10 -6
- data/lib/datacite/mapping/module_info.rb +1 -1
- data/spec/unit/datacite/mapping/date_spec.rb +36 -0
- data/spec/unit/datacite/mapping/date_value_spec.rb +27 -15
- metadata +2 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 31f2287ef40248012202b33a003f19aa2d43b2dd
|
4
|
+
data.tar.gz: 1c48f2fd6d1d77d78c4c0dac2aa3e794ed9d32e3
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: d40f600f404342223fa28d062f23086b2d22b19875f2b324a23b1bb6b4dba8526b2637b32aaf6d74337dd26ce6bcf26e152a221510e6bc512901ef36747a3f0e
|
7
|
+
data.tar.gz: 674b3c269064d693e6d06b3aad48cb3f4cd2346600240d14e2a08a90955a3a023e0f79e822cb309db2f19b7c52b016d70921e2b0cd252c0f7546031a545ebeaf
|
data/CHANGES.md
CHANGED
@@ -1,4 +1,9 @@
|
|
1
|
-
## 0.2.
|
1
|
+
## 0.2.1 (28 September 2016)
|
2
|
+
|
3
|
+
- Fixed issue where `Datacite::Mapping::Date` objects initialized with Ruby
|
4
|
+
`Dates` or `Datetimes` couldn't be serialized to XML.
|
5
|
+
|
6
|
+
## 0.2.0 (26 September 2016)
|
2
7
|
|
3
8
|
- Datacite 4.0 support:
|
4
9
|
- reading supports both Datacite 3 and Datacite 4
|
data/README.md
CHANGED
@@ -88,6 +88,8 @@ To create XML from a `Resource` object, use `Resource.write_xml`, `Resource.save
|
|
88
88
|
| file path | `Resource.save_to_file` |
|
89
89
|
| `REXML::Element` | `Resource.save_xml` |
|
90
90
|
|
91
|
+
Example:
|
92
|
+
|
91
93
|
```ruby
|
92
94
|
resource.write_xml
|
93
95
|
# => "<resource xsi:schemaLocation='http://datacite.org/schema/kernel-4 …
|
@@ -49,6 +49,7 @@ module Datacite
|
|
49
49
|
# @return [DateValue, nil] the end of the date range represented by this `<date/> field`,
|
50
50
|
# if it represents a range, and the range is not open on the upper end
|
51
51
|
class Date
|
52
|
+
include Comparable
|
52
53
|
include XML::Mapping
|
53
54
|
|
54
55
|
attr_reader :date_value
|
@@ -81,7 +82,24 @@ module Datacite
|
|
81
82
|
else
|
82
83
|
fail ArgumentError, "Unable to parse date value #{val}"
|
83
84
|
end
|
84
|
-
@value =
|
85
|
+
@value = date_value ? date_value.to_s : "#{range_start}/#{range_end}"
|
86
|
+
end
|
87
|
+
|
88
|
+
def <=>(other)
|
89
|
+
return nil unless other.class == self.class
|
90
|
+
[:date_value, :range_start, :range_end].each do |v|
|
91
|
+
order = send(v) <=> other.send(v)
|
92
|
+
return order if order.nonzero?
|
93
|
+
end
|
94
|
+
0
|
95
|
+
end
|
96
|
+
|
97
|
+
def hash
|
98
|
+
[date_value, range_start, range_end].hash
|
99
|
+
end
|
100
|
+
|
101
|
+
def to_s
|
102
|
+
@value
|
85
103
|
end
|
86
104
|
|
87
105
|
private
|
@@ -32,6 +32,7 @@ module Datacite
|
|
32
32
|
attr_reader :nsec
|
33
33
|
attr_reader :date
|
34
34
|
attr_reader :zone
|
35
|
+
attr_reader :iso_value
|
35
36
|
|
36
37
|
# Creates a new {DateValue}.
|
37
38
|
#
|
@@ -43,7 +44,7 @@ module Datacite
|
|
43
44
|
@year = to_year(val)
|
44
45
|
@month = to_month(val)
|
45
46
|
@day = to_day(val)
|
46
|
-
iso_value = val.respond_to?(:iso8601) ? val.iso8601 : val.to_s
|
47
|
+
@iso_value = val.respond_to?(:iso8601) ? val.iso8601 : val.to_s
|
47
48
|
if datetime && iso_value.include?('T')
|
48
49
|
@hour = datetime.hour
|
49
50
|
@minute = datetime.minute
|
@@ -68,11 +69,14 @@ module Datacite
|
|
68
69
|
end
|
69
70
|
|
70
71
|
def to_s
|
71
|
-
|
72
|
-
|
73
|
-
|
74
|
-
|
75
|
-
|
72
|
+
@str_value = begin
|
73
|
+
str_value = iso_value
|
74
|
+
if nsec && nsec != 0
|
75
|
+
frac_str = (nsec / 1e9).to_s.sub('0', '')
|
76
|
+
str_value.sub!(/(T[0-9]+:[0-9]+:[0-9]+)/, "\\1#{frac_str}") unless str_value.include?(frac_str)
|
77
|
+
end
|
78
|
+
str_value
|
79
|
+
end
|
76
80
|
end
|
77
81
|
|
78
82
|
private
|
@@ -29,6 +29,24 @@ module Datacite
|
|
29
29
|
it 'fails on range-like non-ranges' do
|
30
30
|
expect { Date.new(value: '5/18/72', type: DateType::VALID) }.to raise_error(ArgumentError)
|
31
31
|
end
|
32
|
+
|
33
|
+
it 'saves closed ranges to XML' do
|
34
|
+
date = Date.new(value: '1997-07-16T19:30+10:00/1997-07-17T15:30-05:00', type: DateType::AVAILABLE)
|
35
|
+
expected_xml = '<date dateType="Available">1997-07-16T19:30+10:00/1997-07-17T15:30-05:00</date>'
|
36
|
+
expect(date.save_to_xml).to be_xml(expected_xml)
|
37
|
+
end
|
38
|
+
|
39
|
+
it 'saves right open ranges to XML' do
|
40
|
+
date = Date.new(value: '1997-07-16T19:30+10:00/', type: DateType::AVAILABLE)
|
41
|
+
expected_xml = '<date dateType="Available">1997-07-16T19:30+10:00/</date>'
|
42
|
+
expect(date.save_to_xml).to be_xml(expected_xml)
|
43
|
+
end
|
44
|
+
|
45
|
+
it 'saves left open ranges to XML' do
|
46
|
+
date = Date.new(value: '/1997-07-17T15:30-05:00', type: DateType::AVAILABLE)
|
47
|
+
expected_xml = '<date dateType="Available">/1997-07-17T15:30-05:00</date>'
|
48
|
+
expect(date.save_to_xml).to be_xml(expected_xml)
|
49
|
+
end
|
32
50
|
end
|
33
51
|
|
34
52
|
describe 'type=' do
|
@@ -51,6 +69,24 @@ module Datacite
|
|
51
69
|
expected_xml = '<date dateType="Available">1914-08-04T11:01:06.0123+01:00</date>'
|
52
70
|
expect(d.save_to_xml).to be_xml(expected_xml)
|
53
71
|
end
|
72
|
+
|
73
|
+
it 'writes XML with all value types' do
|
74
|
+
{
|
75
|
+
with_date_time: DateTime.new(1914, 8, 4, 11, 1, 6.0123, '+1'),
|
76
|
+
with_date: ::Date.new(1914, 8, 4),
|
77
|
+
with_year: 1914,
|
78
|
+
with_year_str: '1914',
|
79
|
+
with_year_month: '1914-08',
|
80
|
+
iso8601: '1914-08-04T11:01+01:00',
|
81
|
+
iso8601_secs: '1914-08-04T11:01:06+01:00',
|
82
|
+
iso8601_frac: '1914-08-04T11:01:06.0123+01:00'
|
83
|
+
}.each do |k, v|
|
84
|
+
d = Date.new(value: v, type: DateType::AVAILABLE)
|
85
|
+
xml = d.save_to_xml
|
86
|
+
parsed = Date.parse_xml(xml)
|
87
|
+
expect(parsed).to eq(d), "Expected #{d}, got #{parsed} for #{k}"
|
88
|
+
end
|
89
|
+
end
|
54
90
|
end
|
55
91
|
|
56
92
|
describe '#load_from_xml' do
|
@@ -4,6 +4,9 @@ module Datacite
|
|
4
4
|
module Mapping
|
5
5
|
describe DateValue do
|
6
6
|
|
7
|
+
attr_reader :values
|
8
|
+
attr_reader :dates
|
9
|
+
|
7
10
|
before(:all) do
|
8
11
|
@values = {
|
9
12
|
with_date_time: DateTime.new(1914, 8, 4, 11, 1, 6.0123, '+1'),
|
@@ -15,12 +18,12 @@ module Datacite
|
|
15
18
|
iso8601_secs: '1914-08-04T11:01:06+01:00',
|
16
19
|
iso8601_frac: '1914-08-04T11:01:06.0123+01:00'
|
17
20
|
}
|
18
|
-
@dates =
|
21
|
+
@dates = values.map { |format, v| [format, DateValue.new(v)] }.to_h
|
19
22
|
end
|
20
23
|
|
21
24
|
describe '#initialize' do
|
22
25
|
it 'accepts a DateTime' do
|
23
|
-
d =
|
26
|
+
d = dates[:with_date_time]
|
24
27
|
expect(d).to be_a(DateValue)
|
25
28
|
expect(d.year).to eq(1914)
|
26
29
|
expect(d.month).to eq(8)
|
@@ -33,7 +36,7 @@ module Datacite
|
|
33
36
|
end
|
34
37
|
|
35
38
|
it 'accepts a DateValue' do
|
36
|
-
d =
|
39
|
+
d = dates[:with_date]
|
37
40
|
expect(d).to be_a(DateValue)
|
38
41
|
expect(d.year).to eq(1914)
|
39
42
|
expect(d.month).to eq(8)
|
@@ -42,26 +45,26 @@ module Datacite
|
|
42
45
|
end
|
43
46
|
|
44
47
|
it 'accepts a year as an integer' do
|
45
|
-
d =
|
48
|
+
d = dates[:with_year]
|
46
49
|
expect(d).to be_a(DateValue)
|
47
50
|
expect(d.year).to eq(1914)
|
48
51
|
end
|
49
52
|
|
50
53
|
it 'accepts a year as a string' do
|
51
|
-
d =
|
54
|
+
d = dates[:with_year_str]
|
52
55
|
expect(d).to be_a(DateValue)
|
53
56
|
expect(d.year).to eq(1914)
|
54
57
|
end
|
55
58
|
|
56
59
|
it 'accepts a year-month string' do
|
57
|
-
d =
|
60
|
+
d = dates[:with_year_month]
|
58
61
|
expect(d).to be_a(DateValue)
|
59
62
|
expect(d.year).to eq(1914)
|
60
63
|
expect(d.month).to eq(8)
|
61
64
|
end
|
62
65
|
|
63
66
|
it 'accepts an ISO 8601 DateValue string with hours and minutes' do
|
64
|
-
d =
|
67
|
+
d = dates[:iso8601]
|
65
68
|
expect(d).to be_a(DateValue)
|
66
69
|
expect(d.year).to eq(1914)
|
67
70
|
expect(d.month).to eq(8)
|
@@ -72,7 +75,7 @@ module Datacite
|
|
72
75
|
end
|
73
76
|
|
74
77
|
it 'accepts an ISO 8601 DateValue string with hours, minutes, and seconds' do
|
75
|
-
d =
|
78
|
+
d = dates[:iso8601_secs]
|
76
79
|
expect(d).to be_a(DateValue)
|
77
80
|
expect(d.year).to eq(1914)
|
78
81
|
expect(d.month).to eq(8)
|
@@ -84,7 +87,7 @@ module Datacite
|
|
84
87
|
end
|
85
88
|
|
86
89
|
it 'accepts an ISO 8601 DateValue string with hours, minutes, seconds, and fractional seconds' do
|
87
|
-
d =
|
90
|
+
d = dates[:iso8601_frac]
|
88
91
|
expect(d).to be_a(DateValue)
|
89
92
|
expect(d.year).to eq(1914)
|
90
93
|
expect(d.month).to eq(8)
|
@@ -129,12 +132,21 @@ module Datacite
|
|
129
132
|
end
|
130
133
|
|
131
134
|
describe '#to_s' do
|
132
|
-
it '
|
133
|
-
|
134
|
-
|
135
|
-
|
136
|
-
|
137
|
-
|
135
|
+
it 'returns an ISO-8601 string for all formats' do
|
136
|
+
expected = {
|
137
|
+
with_date_time: '1914-08-04T11:01:06.0123+01:00',
|
138
|
+
with_date: '1914-08-04',
|
139
|
+
with_year: '1914',
|
140
|
+
with_year_str: '1914',
|
141
|
+
with_year_month: '1914-08',
|
142
|
+
iso8601: '1914-08-04T11:01+01:00',
|
143
|
+
iso8601_secs: '1914-08-04T11:01:06+01:00',
|
144
|
+
iso8601_frac: '1914-08-04T11:01:06.0123+01:00'
|
145
|
+
}
|
146
|
+
dates.each do |format, v|
|
147
|
+
actual_str = v.to_s
|
148
|
+
expected_str = expected[format]
|
149
|
+
expect(actual_str).to eq(expected_str), "expected '#{expected_str}' for #{format}, got '#{actual_str}'"
|
138
150
|
end
|
139
151
|
end
|
140
152
|
end
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: datacite-mapping
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.2.
|
4
|
+
version: 0.2.1
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- David Moles
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2016-09-
|
11
|
+
date: 2016-09-28 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: typesafe_enum
|