bolognese 1.9.2 → 1.9.7
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/CHANGELOG.md +52 -6
- data/Gemfile.lock +21 -15
- data/bolognese.gemspec +1 -1
- data/lib/bolognese/author_utils.rb +8 -3
- data/lib/bolognese/doi_utils.rb +3 -2
- data/lib/bolognese/readers/crossref_reader.rb +21 -4
- data/lib/bolognese/readers/datacite_reader.rb +25 -5
- data/lib/bolognese/utils.rb +6 -6
- data/lib/bolognese/version.rb +1 -1
- data/lib/bolognese/writers/jats_writer.rb +3 -1
- data/spec/doi_utils_spec.rb +12 -0
- data/spec/fixtures/datacite-geolocationpolygons-multiple.xml +20 -0
- data/spec/metadata_spec.rb +1 -1
- data/spec/readers/crossref_reader_spec.rb +14 -0
- data/spec/readers/datacite_json_reader_spec.rb +1 -1
- data/spec/readers/datacite_reader_spec.rb +10 -2
- data/spec/utils_spec.rb +14 -1
- data/spec/writers/schema_org_writer_spec.rb +1 -1
- metadata +5 -5
checksums.yaml
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
---
|
|
2
2
|
SHA256:
|
|
3
|
-
metadata.gz:
|
|
4
|
-
data.tar.gz:
|
|
3
|
+
metadata.gz: a01fe4851a13d779fd983f0fd3dc3c3e14a9374ddee6f9802f305e11c802156e
|
|
4
|
+
data.tar.gz: 49d2105471c6bc0270c5e6c326f4564503668537a7ffc26a241293ca2f0ae877
|
|
5
5
|
SHA512:
|
|
6
|
-
metadata.gz:
|
|
7
|
-
data.tar.gz:
|
|
6
|
+
metadata.gz: 6e6d56a5bb01f18d4bc5812520828d73c19ec9f52f5a3650d31ba9c58f7a19715b59161c8f4bfdfe1cdaf565a94bfc9963b928a1587d86c4cd17ee0579f9b77a
|
|
7
|
+
data.tar.gz: 0ca356314c8b16aadb0e9d0f30ebc21e77ee13baf2e73d90a9b8437e83201fa56f3091d6df802824bde0e3b900cc3aa09166caac75c6131378dccc48551de3b1
|
data/CHANGELOG.md
CHANGED
|
@@ -1,5 +1,51 @@
|
|
|
1
1
|
# Changelog
|
|
2
2
|
|
|
3
|
+
## [Unreleased](https://github.com/datacite/bolognese/tree/HEAD)
|
|
4
|
+
|
|
5
|
+
[Full Changelog](https://github.com/datacite/bolognese/compare/1.9.5...HEAD)
|
|
6
|
+
|
|
7
|
+
**Fixed bugs:**
|
|
8
|
+
|
|
9
|
+
- Missing affiliationIdentiifer when used with schemaURI raises an error [\#116](https://github.com/datacite/bolognese/issues/116)
|
|
10
|
+
- Optional numberType being treated as required generating error [\#112](https://github.com/datacite/bolognese/issues/112)
|
|
11
|
+
|
|
12
|
+
**Closed issues:**
|
|
13
|
+
|
|
14
|
+
- Book metadata seems to be ignored [\#113](https://github.com/datacite/bolognese/issues/113)
|
|
15
|
+
- Namespaced XML Tags [\#109](https://github.com/datacite/bolognese/issues/109)
|
|
16
|
+
|
|
17
|
+
**Merged pull requests:**
|
|
18
|
+
|
|
19
|
+
- Fix missing affiliation identifier [\#117](https://github.com/datacite/bolognese/pull/117) ([richardhallett](https://github.com/richardhallett))
|
|
20
|
+
|
|
21
|
+
## [1.9.5](https://github.com/datacite/bolognese/tree/1.9.5) (2021-04-20)
|
|
22
|
+
|
|
23
|
+
[Full Changelog](https://github.com/datacite/bolognese/compare/1.9.4...1.9.5)
|
|
24
|
+
|
|
25
|
+
## [1.9.4](https://github.com/datacite/bolognese/tree/1.9.4) (2021-04-13)
|
|
26
|
+
|
|
27
|
+
[Full Changelog](https://github.com/datacite/bolognese/compare/1.9.3...1.9.4)
|
|
28
|
+
|
|
29
|
+
**Implemented enhancements:**
|
|
30
|
+
|
|
31
|
+
- Should we resolve the Namespace URL for schema [\#62](https://github.com/datacite/bolognese/issues/62)
|
|
32
|
+
|
|
33
|
+
**Fixed bugs:**
|
|
34
|
+
|
|
35
|
+
- Singular geoLocationPolygons are wrapped in additional array [\#110](https://github.com/datacite/bolognese/issues/110)
|
|
36
|
+
|
|
37
|
+
**Merged pull requests:**
|
|
38
|
+
|
|
39
|
+
- Support returning single geoLocationPolygon [\#111](https://github.com/datacite/bolognese/pull/111) ([richardhallett](https://github.com/richardhallett))
|
|
40
|
+
|
|
41
|
+
## [1.9.3](https://github.com/datacite/bolognese/tree/1.9.3) (2021-03-26)
|
|
42
|
+
|
|
43
|
+
[Full Changelog](https://github.com/datacite/bolognese/compare/1.9.2...1.9.3)
|
|
44
|
+
|
|
45
|
+
## [1.9.2](https://github.com/datacite/bolognese/tree/1.9.2) (2021-03-25)
|
|
46
|
+
|
|
47
|
+
[Full Changelog](https://github.com/datacite/bolognese/compare/1.9.1...1.9.2)
|
|
48
|
+
|
|
3
49
|
## [1.9.1](https://github.com/datacite/bolognese/tree/1.9.1) (2021-03-25)
|
|
4
50
|
|
|
5
51
|
[Full Changelog](https://github.com/datacite/bolognese/compare/1.9...1.9.1)
|
|
@@ -973,14 +1019,14 @@
|
|
|
973
1019
|
|
|
974
1020
|
[Full Changelog](https://github.com/datacite/bolognese/compare/v.0.11.15...v.0.11.16)
|
|
975
1021
|
|
|
976
|
-
## [v.0.11.15](https://github.com/datacite/bolognese/tree/v.0.11.15) (2018-08-01)
|
|
977
|
-
|
|
978
|
-
[Full Changelog](https://github.com/datacite/bolognese/compare/v.0.11.14...v.0.11.15)
|
|
979
|
-
|
|
980
1022
|
**Fixed bugs:**
|
|
981
1023
|
|
|
982
1024
|
- Handle xs:string attribute [\#32](https://github.com/datacite/bolognese/issues/32)
|
|
983
1025
|
|
|
1026
|
+
## [v.0.11.15](https://github.com/datacite/bolognese/tree/v.0.11.15) (2018-08-01)
|
|
1027
|
+
|
|
1028
|
+
[Full Changelog](https://github.com/datacite/bolognese/compare/v.0.11.14...v.0.11.15)
|
|
1029
|
+
|
|
984
1030
|
## [v.0.11.14](https://github.com/datacite/bolognese/tree/v.0.11.14) (2018-07-28)
|
|
985
1031
|
|
|
986
1032
|
[Full Changelog](https://github.com/datacite/bolognese/compare/v.0.11.3...v.0.11.14)
|
|
@@ -1462,8 +1508,10 @@
|
|
|
1462
1508
|
**Closed issues:**
|
|
1463
1509
|
|
|
1464
1510
|
- Fix error handling alternate names in ris writer [\#14](https://github.com/datacite/bolognese/issues/14)
|
|
1511
|
+
- Error displaying container-title [\#13](https://github.com/datacite/bolognese/issues/13)
|
|
1465
1512
|
- Error parsing funding information [\#12](https://github.com/datacite/bolognese/issues/12)
|
|
1466
1513
|
- crossref author id to orcid id? [\#10](https://github.com/datacite/bolognese/issues/10)
|
|
1514
|
+
- Support funding information [\#7](https://github.com/datacite/bolognese/issues/7)
|
|
1467
1515
|
- datacite: support subjectScheme and subjectURI [\#4](https://github.com/datacite/bolognese/issues/4)
|
|
1468
1516
|
|
|
1469
1517
|
## [v.0.9.21](https://github.com/datacite/bolognese/tree/v.0.9.21) (2017-06-03)
|
|
@@ -1472,10 +1520,8 @@
|
|
|
1472
1520
|
|
|
1473
1521
|
**Closed issues:**
|
|
1474
1522
|
|
|
1475
|
-
- Error displaying container-title [\#13](https://github.com/datacite/bolognese/issues/13)
|
|
1476
1523
|
- Abstract should be a string in Citeproc writer [\#11](https://github.com/datacite/bolognese/issues/11)
|
|
1477
1524
|
- the Bolognese gem doesn't properly handle the optional language attribute. [\#8](https://github.com/datacite/bolognese/issues/8)
|
|
1478
|
-
- Support funding information [\#7](https://github.com/datacite/bolognese/issues/7)
|
|
1479
1525
|
- datacite: support xml:lang in title [\#3](https://github.com/datacite/bolognese/issues/3)
|
|
1480
1526
|
|
|
1481
1527
|
## [v.0.9.20](https://github.com/datacite/bolognese/tree/v.0.9.20) (2017-05-13)
|
data/Gemfile.lock
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
PATH
|
|
2
2
|
remote: .
|
|
3
3
|
specs:
|
|
4
|
-
bolognese (1.9.
|
|
4
|
+
bolognese (1.9.7)
|
|
5
5
|
activesupport (>= 4.2.5)
|
|
6
6
|
benchmark_methods (~> 0.7)
|
|
7
7
|
bibtex-ruby (>= 5.1.0)
|
|
@@ -19,7 +19,7 @@ PATH
|
|
|
19
19
|
loofah (~> 2.0, >= 2.0.3)
|
|
20
20
|
maremma (>= 4.7, < 5)
|
|
21
21
|
namae (~> 1.0)
|
|
22
|
-
nokogiri (~> 1.
|
|
22
|
+
nokogiri (~> 1.11.2)
|
|
23
23
|
oj (~> 3.10)
|
|
24
24
|
oj_mimic_json (~> 1.0, >= 1.0.1)
|
|
25
25
|
postrank-uri (~> 1.0, >= 1.0.18)
|
|
@@ -30,7 +30,7 @@ PATH
|
|
|
30
30
|
GEM
|
|
31
31
|
remote: https://rubygems.org/
|
|
32
32
|
specs:
|
|
33
|
-
activesupport (6.1.3)
|
|
33
|
+
activesupport (6.1.3.2)
|
|
34
34
|
concurrent-ruby (~> 1.0, >= 1.0.2)
|
|
35
35
|
i18n (>= 1.6, < 2)
|
|
36
36
|
minitest (>= 5.1)
|
|
@@ -38,6 +38,7 @@ GEM
|
|
|
38
38
|
zeitwerk (~> 2.3)
|
|
39
39
|
addressable (2.7.0)
|
|
40
40
|
public_suffix (>= 2.0.2, < 5.0)
|
|
41
|
+
amazing_print (1.3.0)
|
|
41
42
|
benchmark_methods (0.7)
|
|
42
43
|
bibtex-ruby (6.0.0)
|
|
43
44
|
latex-decode (~> 0.0)
|
|
@@ -54,15 +55,17 @@ GEM
|
|
|
54
55
|
crass (1.0.6)
|
|
55
56
|
csl (1.5.2)
|
|
56
57
|
namae (~> 1.0)
|
|
57
|
-
csl-styles (1.0.1.
|
|
58
|
+
csl-styles (1.0.1.11)
|
|
58
59
|
csl (~> 1.0)
|
|
59
60
|
diff-lcs (1.4.4)
|
|
60
61
|
docile (1.3.5)
|
|
61
|
-
ebnf (2.1.
|
|
62
|
+
ebnf (2.1.3)
|
|
63
|
+
amazing_print (~> 1.2)
|
|
62
64
|
htmlentities (~> 4.3)
|
|
63
65
|
rdf (~> 3.1)
|
|
64
66
|
scanf (~> 1.0)
|
|
65
67
|
sxp (~> 1.1)
|
|
68
|
+
unicode-types (~> 1.6)
|
|
66
69
|
edtf (3.0.6)
|
|
67
70
|
activesupport (>= 3.0, < 7.0)
|
|
68
71
|
excon (0.71.1)
|
|
@@ -81,7 +84,7 @@ GEM
|
|
|
81
84
|
concurrent-ruby (~> 1.0)
|
|
82
85
|
hashdiff (1.0.1)
|
|
83
86
|
htmlentities (4.3.4)
|
|
84
|
-
i18n (1.8.
|
|
87
|
+
i18n (1.8.10)
|
|
85
88
|
concurrent-ruby (~> 1.0)
|
|
86
89
|
iso8601 (0.9.1)
|
|
87
90
|
json (2.5.1)
|
|
@@ -101,10 +104,10 @@ GEM
|
|
|
101
104
|
optimist (~> 3)
|
|
102
105
|
latex-decode (0.3.2)
|
|
103
106
|
link_header (0.0.8)
|
|
104
|
-
loofah (2.9.
|
|
107
|
+
loofah (2.9.1)
|
|
105
108
|
crass (~> 1.0.2)
|
|
106
109
|
nokogiri (>= 1.5.9)
|
|
107
|
-
maremma (4.7.
|
|
110
|
+
maremma (4.7.4)
|
|
108
111
|
activesupport (>= 4.2.5)
|
|
109
112
|
addressable (>= 2.3.6)
|
|
110
113
|
builder (~> 3.2, >= 3.2.2)
|
|
@@ -112,17 +115,18 @@ GEM
|
|
|
112
115
|
faraday (~> 0.17.3)
|
|
113
116
|
faraday-encoding (~> 0.0.4)
|
|
114
117
|
faraday_middleware (~> 0.14.0)
|
|
115
|
-
nokogiri (~> 1.
|
|
118
|
+
nokogiri (~> 1.11.2)
|
|
116
119
|
oj (>= 2.8.3)
|
|
117
120
|
oj_mimic_json (~> 1.0, >= 1.0.1)
|
|
118
|
-
mini_portile2 (2.
|
|
121
|
+
mini_portile2 (2.5.0)
|
|
119
122
|
minitest (5.14.4)
|
|
120
123
|
multi_json (1.15.0)
|
|
121
124
|
multipart-post (2.1.1)
|
|
122
125
|
namae (1.1.1)
|
|
123
|
-
nokogiri (1.
|
|
124
|
-
mini_portile2 (~> 2.
|
|
125
|
-
|
|
126
|
+
nokogiri (1.11.2)
|
|
127
|
+
mini_portile2 (~> 2.5.0)
|
|
128
|
+
racc (~> 1.4)
|
|
129
|
+
oj (3.11.5)
|
|
126
130
|
oj_mimic_json (1.0.1)
|
|
127
131
|
optimist (3.0.1)
|
|
128
132
|
postrank-uri (1.0.24)
|
|
@@ -130,6 +134,7 @@ GEM
|
|
|
130
134
|
nokogiri (>= 1.8.0)
|
|
131
135
|
public_suffix (>= 2.0.0, < 2.1)
|
|
132
136
|
public_suffix (2.0.5)
|
|
137
|
+
racc (1.5.2)
|
|
133
138
|
rack (2.2.3)
|
|
134
139
|
rack-test (0.8.3)
|
|
135
140
|
rack (>= 1.0, < 3)
|
|
@@ -154,7 +159,7 @@ GEM
|
|
|
154
159
|
rdf-turtle (3.1.3)
|
|
155
160
|
ebnf (~> 2.1)
|
|
156
161
|
rdf (~> 3.1, >= 3.1.8)
|
|
157
|
-
rdf-vocab (3.1.
|
|
162
|
+
rdf-vocab (3.1.13)
|
|
158
163
|
rdf (~> 3.1, >= 3.1.12)
|
|
159
164
|
rdf-xsd (3.1.1)
|
|
160
165
|
rdf (~> 3.1)
|
|
@@ -189,6 +194,7 @@ GEM
|
|
|
189
194
|
tilt (2.0.10)
|
|
190
195
|
tzinfo (2.0.4)
|
|
191
196
|
concurrent-ruby (~> 1.0)
|
|
197
|
+
unicode-types (1.6.0)
|
|
192
198
|
unicode_utils (1.4.0)
|
|
193
199
|
vcr (3.0.3)
|
|
194
200
|
webmock (3.12.1)
|
|
@@ -213,4 +219,4 @@ DEPENDENCIES
|
|
|
213
219
|
webmock (~> 3.0, >= 3.0.1)
|
|
214
220
|
|
|
215
221
|
BUNDLED WITH
|
|
216
|
-
2.2.
|
|
222
|
+
2.2.18
|
data/bolognese.gemspec
CHANGED
|
@@ -18,7 +18,7 @@ Gem::Specification.new do |s|
|
|
|
18
18
|
# Declare dependencies here, rather than in the Gemfile
|
|
19
19
|
s.add_dependency 'maremma', '>= 4.7', '< 5'
|
|
20
20
|
s.add_dependency 'faraday', '~> 0.17.3'
|
|
21
|
-
s.add_dependency 'nokogiri', '~> 1.
|
|
21
|
+
s.add_dependency 'nokogiri', '~> 1.11.2'
|
|
22
22
|
s.add_dependency 'loofah', '~> 2.0', '>= 2.0.3'
|
|
23
23
|
s.add_dependency 'builder', '~> 3.2', '>= 3.2.2'
|
|
24
24
|
s.add_dependency 'activesupport', '>= 4.2.5'
|
|
@@ -138,14 +138,19 @@ module Bolognese
|
|
|
138
138
|
|
|
139
139
|
def get_affiliations(affiliations)
|
|
140
140
|
Array.wrap(affiliations).map do |a|
|
|
141
|
+
affiliation_identifier = nil
|
|
141
142
|
if a.is_a?(String)
|
|
142
143
|
name = a.squish
|
|
143
|
-
affiliation_identifier = nil
|
|
144
144
|
affiliation_identifier_scheme = nil
|
|
145
145
|
scheme_uri = nil
|
|
146
146
|
else
|
|
147
|
-
|
|
148
|
-
|
|
147
|
+
if a["affiliationIdentifier"].present?
|
|
148
|
+
affiliation_identifier = a["affiliationIdentifier"]
|
|
149
|
+
if a["schemeURI"].present?
|
|
150
|
+
schemeURI = a["schemeURI"].end_with?("/") ? a["schemeURI"] : a["schemeURI"] + "/"
|
|
151
|
+
end
|
|
152
|
+
affiliation_identifier = !affiliation_identifier.to_s.start_with?("https://") && schemeURI.present? ? normalize_id(schemeURI + affiliation_identifier) : normalize_id(affiliation_identifier)
|
|
153
|
+
end
|
|
149
154
|
name = a["__content__"].to_s.squish.presence
|
|
150
155
|
affiliation_identifier_scheme = a["affiliationIdentifierScheme"]
|
|
151
156
|
scheme_uri = a["SchemeURI"]
|
data/lib/bolognese/doi_utils.rb
CHANGED
|
@@ -9,10 +9,11 @@ module Bolognese
|
|
|
9
9
|
end
|
|
10
10
|
|
|
11
11
|
def validate_funder_doi(doi)
|
|
12
|
-
doi = Array(/\A(?:(http|https):\/(\/)?(dx\.)?(doi.org|handle.test.datacite.org)\/)?(doi:)?(10\.13039\/)?(
|
|
12
|
+
doi = Array(/\A(?:(http|https):\/(\/)?(dx\.)?(doi.org|handle.test.datacite.org)\/)?(doi:)?(10\.13039\/)?([1-9]\d+)\z/.match(doi)).last
|
|
13
|
+
|
|
13
14
|
# remove non-printing whitespace and downcase
|
|
14
15
|
if doi.present?
|
|
15
|
-
doi.delete("\u200B").downcase
|
|
16
|
+
doi.delete("\u200B").downcase
|
|
16
17
|
"https://doi.org/10.13039/#{doi}"
|
|
17
18
|
end
|
|
18
19
|
end
|
|
@@ -56,10 +56,10 @@ module Bolognese
|
|
|
56
56
|
# book_series_metadata.dig("publisher", "publisher_name")
|
|
57
57
|
# end
|
|
58
58
|
when "conference"
|
|
59
|
-
event_metadata = meta.dig("crossref", "conference", "event_metadata") ||
|
|
59
|
+
event_metadata = meta.dig("crossref", "conference", "event_metadata") || {}
|
|
60
60
|
bibliographic_metadata = meta.dig("crossref", "conference", "conference_paper").to_h
|
|
61
61
|
when "journal"
|
|
62
|
-
journal_metadata = meta.dig("crossref", "journal", "journal_metadata") ||
|
|
62
|
+
journal_metadata = meta.dig("crossref", "journal", "journal_metadata") || {}
|
|
63
63
|
journal_issue = meta.dig("crossref", "journal", "journal_issue") || {}
|
|
64
64
|
journal_article = meta.dig("crossref", "journal", "journal_article") || {}
|
|
65
65
|
bibliographic_metadata = journal_article.presence || journal_issue.presence || journal_metadata
|
|
@@ -140,7 +140,8 @@ module Bolognese
|
|
|
140
140
|
state = meta.present? || read_options.present? ? "findable" : "not_found"
|
|
141
141
|
|
|
142
142
|
related_identifiers = Array.wrap(crossref_is_part_of(journal_metadata)) + Array.wrap(crossref_references(bibliographic_metadata))
|
|
143
|
-
|
|
143
|
+
|
|
144
|
+
container = if journal_metadata.present?
|
|
144
145
|
issn = normalize_issn(journal_metadata.to_h.fetch("issn", nil))
|
|
145
146
|
|
|
146
147
|
{ "type" => "Journal",
|
|
@@ -151,6 +152,19 @@ module Bolognese
|
|
|
151
152
|
"issue" => parse_attributes(journal_issue.dig("issue")),
|
|
152
153
|
"firstPage" => bibliographic_metadata.dig("pages", "first_page") || parse_attributes(journal_article.to_h.dig("publisher_item", "item_number"), first: true),
|
|
153
154
|
"lastPage" => bibliographic_metadata.dig("pages", "last_page") }.compact
|
|
155
|
+
|
|
156
|
+
# By using book_metadata, we can account for where resource_type is `BookChapter` and not assume its a whole book
|
|
157
|
+
elsif book_metadata.present?
|
|
158
|
+
identifiers = crossref_alternate_identifiers(book_metadata)
|
|
159
|
+
|
|
160
|
+
{
|
|
161
|
+
"type" => "Book",
|
|
162
|
+
"title" => book_metadata.dig("titles", "title"),
|
|
163
|
+
"firstPage" => bibliographic_metadata.dig("pages", "first_page"),
|
|
164
|
+
"lastPage" => bibliographic_metadata.dig("pages", "last_page"),
|
|
165
|
+
"identifiers" => identifiers,
|
|
166
|
+
}.compact
|
|
167
|
+
|
|
154
168
|
elsif book_series_metadata.to_h.fetch("series_metadata", nil).present?
|
|
155
169
|
issn = normalize_issn(book_series_metadata.dig("series_metadata", "issn"))
|
|
156
170
|
|
|
@@ -162,7 +176,10 @@ module Bolognese
|
|
|
162
176
|
end
|
|
163
177
|
|
|
164
178
|
id = normalize_doi(options[:doi] || options[:id] || bibliographic_metadata.dig("doi_data", "doi"))
|
|
165
|
-
|
|
179
|
+
|
|
180
|
+
# Let sections override this in case of alternative metadata structures, such as book chapters, which
|
|
181
|
+
# have their meta inside `content_item`, but the main book indentifers inside of `book_metadata`
|
|
182
|
+
identifiers ||= crossref_alternate_identifiers(bibliographic_metadata)
|
|
166
183
|
|
|
167
184
|
{ "id" => id,
|
|
168
185
|
"types" => types,
|
|
@@ -203,6 +203,15 @@ module Bolognese
|
|
|
203
203
|
"schemeType" => rii["schemeType"]
|
|
204
204
|
}.compact
|
|
205
205
|
|
|
206
|
+
number = ri["number"]
|
|
207
|
+
if number.is_a?(String)
|
|
208
|
+
number = number
|
|
209
|
+
numberType = nil
|
|
210
|
+
else
|
|
211
|
+
number = ri.dig("number", "__content__")
|
|
212
|
+
numberType = ri.dig("number", "numberType")
|
|
213
|
+
end
|
|
214
|
+
|
|
206
215
|
{
|
|
207
216
|
"relationType" => ri["relationType"],
|
|
208
217
|
"relatedItemType" => ri["relatedItemType"],
|
|
@@ -212,8 +221,8 @@ module Bolognese
|
|
|
212
221
|
"publicationYear" => ri["publicationYear"],
|
|
213
222
|
"volume" => ri["volume"],
|
|
214
223
|
"issue" => ri["issue"],
|
|
215
|
-
"number" =>
|
|
216
|
-
"numberType" =>
|
|
224
|
+
"number" => number,
|
|
225
|
+
"numberType" => numberType,
|
|
217
226
|
"firstPage" => ri["firstPage"],
|
|
218
227
|
"lastPage" => ri["lastPage"],
|
|
219
228
|
"publisher" => ri["publisher"],
|
|
@@ -226,6 +235,19 @@ module Bolognese
|
|
|
226
235
|
if !gl.is_a?(Hash) || gl["geoLocationPoint"].is_a?(String) || gl["geoLocationBox"].is_a?(String) || gl["geoLocationPolygon"].is_a?(String)
|
|
227
236
|
nil
|
|
228
237
|
else
|
|
238
|
+
|
|
239
|
+
# Handle scenario where multiple geoLocationPolygons are allowed within a single geoLocation
|
|
240
|
+
# we want to return an array if it's already an array (i.e. multiple geoLocationPolygons)
|
|
241
|
+
# vs if it's singular just return the object
|
|
242
|
+
# This is for backwards compatability to allow both scenarios.
|
|
243
|
+
if gl.dig("geoLocationPolygon").kind_of?(Array)
|
|
244
|
+
geoLocationPolygon = gl.dig("geoLocationPolygon").map do |glp|
|
|
245
|
+
Array.wrap(glp.dig("polygonPoint")).map { |glpp| { "polygonPoint" => glpp } }.compact.presence
|
|
246
|
+
end.compact.presence
|
|
247
|
+
else
|
|
248
|
+
geoLocationPolygon = Array.wrap(gl.dig("geoLocationPolygon", "polygonPoint")).map { |glp| { "polygonPoint" => glp } }.compact.presence
|
|
249
|
+
end
|
|
250
|
+
|
|
229
251
|
{
|
|
230
252
|
"geoLocationPoint" => {
|
|
231
253
|
"pointLatitude" => gl.dig("geoLocationPoint", "pointLatitude"),
|
|
@@ -237,9 +259,7 @@ module Bolognese
|
|
|
237
259
|
"southBoundLatitude" => gl.dig("geoLocationBox", "southBoundLatitude"),
|
|
238
260
|
"northBoundLatitude" => gl.dig("geoLocationBox", "northBoundLatitude")
|
|
239
261
|
}.compact.presence,
|
|
240
|
-
"geoLocationPolygon" =>
|
|
241
|
-
Array.wrap(glp.dig("polygonPoint")).map { |glpp| { "polygonPoint" => glpp } }.compact.presence
|
|
242
|
-
end.compact.presence,
|
|
262
|
+
"geoLocationPolygon" => geoLocationPolygon,
|
|
243
263
|
"geoLocationPlace" => parse_attributes(gl["geoLocationPlace"], first: true).to_s.strip.presence
|
|
244
264
|
}.compact
|
|
245
265
|
end
|
data/lib/bolognese/utils.rb
CHANGED
|
@@ -1306,8 +1306,8 @@ module Bolognese
|
|
|
1306
1306
|
return [{
|
|
1307
1307
|
"subject" => sanitize(hsh["__content__"] || hsh["subject"]),
|
|
1308
1308
|
"subjectScheme" => hsh["subjectScheme"],
|
|
1309
|
-
"schemeUri" => hsh["schemeURI"],
|
|
1310
|
-
"valueUri" => hsh["valueURI"],
|
|
1309
|
+
"schemeUri" => hsh["schemeURI"] || hsh["schemeUri"],
|
|
1310
|
+
"valueUri" => hsh["valueURI"] || hsh["valueUri"],
|
|
1311
1311
|
"classificationCode" => hsh["classificationCode"],
|
|
1312
1312
|
"lang" => hsh["lang"] }.compact,
|
|
1313
1313
|
{
|
|
@@ -1339,8 +1339,8 @@ module Bolognese
|
|
|
1339
1339
|
"subject" => sanitize(hsh["__content__"] || hsh["subject"]),
|
|
1340
1340
|
"subjectScheme" => hsh["subjectScheme"],
|
|
1341
1341
|
"classificationCode" => hsh["classificationCode"],
|
|
1342
|
-
"schemeUri" => hsh["schemeURI"],
|
|
1343
|
-
"valueUri" => hsh["valueURI"],
|
|
1342
|
+
"schemeUri" => hsh["schemeURI"] || hsh["schemeUri"],
|
|
1343
|
+
"valueUri" => hsh["valueURI"] || hsh["valueUri"],
|
|
1344
1344
|
"lang" => hsh["lang"] }.compact,
|
|
1345
1345
|
{
|
|
1346
1346
|
"subject" => "FOS: " + subject["fosLabel"],
|
|
@@ -1352,8 +1352,8 @@ module Bolognese
|
|
|
1352
1352
|
"subject" => sanitize(hsh["__content__"] || hsh["subject"]),
|
|
1353
1353
|
"subjectScheme" => hsh["subjectScheme"],
|
|
1354
1354
|
"classificationCode" => hsh["classificationCode"],
|
|
1355
|
-
"schemeUri" => hsh["schemeURI"],
|
|
1356
|
-
"valueUri" => hsh["valueURI"],
|
|
1355
|
+
"schemeUri" => hsh["schemeURI"] || hsh["schemeUri"],
|
|
1356
|
+
"valueUri" => hsh["valueURI"] || hsh["valueUri"],
|
|
1357
1357
|
"lang" => hsh["lang"] }.compact]
|
|
1358
1358
|
end
|
|
1359
1359
|
end
|
data/lib/bolognese/version.rb
CHANGED
|
@@ -76,7 +76,9 @@ module Bolognese
|
|
|
76
76
|
end
|
|
77
77
|
|
|
78
78
|
def insert_source(xml)
|
|
79
|
-
if
|
|
79
|
+
if is_chapter?
|
|
80
|
+
xml.source(publisher)
|
|
81
|
+
elsif is_article? || is_data?
|
|
80
82
|
xml.source(container && container["title"] || publisher)
|
|
81
83
|
else
|
|
82
84
|
xml.source(parse_attributes(titles, content: "title", first: true))
|
data/spec/doi_utils_spec.rb
CHANGED
|
@@ -272,6 +272,18 @@ describe Bolognese::Metadata, vcr: true do
|
|
|
272
272
|
response = subject.validate_funder_doi(doi)
|
|
273
273
|
expect(response).to be_nil
|
|
274
274
|
end
|
|
275
|
+
|
|
276
|
+
it { expect(subject.validate_funder_doi("10.13039/100000050")).to eq "https://doi.org/10.13039/100000050" }
|
|
277
|
+
it { expect(subject.validate_funder_doi("10.13039/100006492")).to eq "https://doi.org/10.13039/100006492" }
|
|
278
|
+
it { expect(subject.validate_funder_doi('http://handle.test.datacite.org/10.13039/100000080')).to eq "https://doi.org/10.13039/100000080" }
|
|
279
|
+
it { expect(subject.validate_funder_doi('https://doi.org/10.13039/100000001')).to eq "https://doi.org/10.13039/100000001" }
|
|
280
|
+
it { expect(subject.validate_funder_doi('http://doi.org/10.13039/501100001711')).to eq "https://doi.org/10.13039/501100001711" }
|
|
281
|
+
it { expect(subject.validate_funder_doi('https://dx.doi.org/10.13039/501100001711')).to eq "https://doi.org/10.13039/501100001711" }
|
|
282
|
+
it { expect(subject.validate_funder_doi('doi:10.13039/501100001711')).to eq "https://doi.org/10.13039/501100001711" }
|
|
283
|
+
it { expect(subject.validate_funder_doi('10.13039/501100001711')).to eq "https://doi.org/10.13039/501100001711" }
|
|
284
|
+
it { expect(subject.validate_funder_doi('501100001711')).to eq "https://doi.org/10.13039/501100001711" }
|
|
285
|
+
it { expect(subject.validate_funder_doi("https://doi.org/10.13039/5monkeymonkey")).to be_nil }
|
|
286
|
+
it { expect(subject.validate_funder_doi('10.13039/5monkeymonkey')).to be_nil }
|
|
275
287
|
end
|
|
276
288
|
|
|
277
289
|
context "validate prefix" do
|
|
@@ -52,5 +52,25 @@
|
|
|
52
52
|
</polygonPoint>
|
|
53
53
|
</geoLocationPolygon>
|
|
54
54
|
</geoLocation>
|
|
55
|
+
<geoLocation>
|
|
56
|
+
<geoLocationPolygon>
|
|
57
|
+
<polygonPoint>
|
|
58
|
+
<pointLongitude>65</pointLongitude>
|
|
59
|
+
<pointLatitude>80</pointLatitude>
|
|
60
|
+
</polygonPoint>
|
|
61
|
+
<polygonPoint>
|
|
62
|
+
<pointLongitude>55</pointLongitude>
|
|
63
|
+
<pointLatitude>75</pointLatitude>
|
|
64
|
+
</polygonPoint>
|
|
65
|
+
<polygonPoint>
|
|
66
|
+
<pointLongitude>45</pointLongitude>
|
|
67
|
+
<pointLatitude>73</pointLatitude>
|
|
68
|
+
</polygonPoint>
|
|
69
|
+
<polygonPoint>
|
|
70
|
+
<pointLongitude>65</pointLongitude>
|
|
71
|
+
<pointLatitude>80</pointLatitude>
|
|
72
|
+
</polygonPoint>
|
|
73
|
+
</geoLocationPolygon>
|
|
74
|
+
</geoLocation>
|
|
55
75
|
</geoLocations>
|
|
56
76
|
</resource>
|
data/spec/metadata_spec.rb
CHANGED
|
@@ -153,7 +153,7 @@ describe Bolognese::Metadata, vcr: true do
|
|
|
153
153
|
it "missing_comma" do
|
|
154
154
|
json = IO.read(fixture_path + "datacite_software_missing_comma.json")
|
|
155
155
|
response = subject.jsonlint(json)
|
|
156
|
-
expect(response).to eq(["expected comma, not a string (after doi) at line 4, column 11 [parse.c:
|
|
156
|
+
expect(response).to eq(["expected comma, not a string (after doi) at line 4, column 11 [parse.c:388]"])
|
|
157
157
|
end
|
|
158
158
|
|
|
159
159
|
it "overlapping_keys" do
|
|
@@ -372,6 +372,11 @@ describe Bolognese::Metadata, vcr: true do
|
|
|
372
372
|
expect(subject.publication_year).to eq("2015")
|
|
373
373
|
expect(subject.publisher).to eq("Springer Science and Business Media LLC")
|
|
374
374
|
expect(subject.agency).to eq("crossref")
|
|
375
|
+
expect(subject.container["type"]).to eq("Book")
|
|
376
|
+
expect(subject.container["title"]).to eq("Shoulder Stiffness")
|
|
377
|
+
expect(subject.container["firstPage"]).to eq("155")
|
|
378
|
+
expect(subject.container["lastPage"]).to eq("158")
|
|
379
|
+
expect(subject.container["identifiers"]).to eq([{"identifier"=>"978-3-662-46369-7", "identifierType"=>"ISBN"}])
|
|
375
380
|
end
|
|
376
381
|
|
|
377
382
|
it "another book chapter" do
|
|
@@ -387,6 +392,10 @@ describe Bolognese::Metadata, vcr: true do
|
|
|
387
392
|
expect(subject.publication_year).to eq("2018")
|
|
388
393
|
expect(subject.publisher).to eq("Springer Science and Business Media LLC")
|
|
389
394
|
expect(subject.agency).to eq("crossref")
|
|
395
|
+
expect(subject.container["type"]).to eq("Book Series")
|
|
396
|
+
expect(subject.container["title"]).to eq("SpringerBriefs in Medical Earth Sciences")
|
|
397
|
+
expect(subject.container["identifier"]).to eq("2523-3629")
|
|
398
|
+
expect(subject.container["identifierType"]).to eq("ISSN")
|
|
390
399
|
end
|
|
391
400
|
|
|
392
401
|
it "yet another book chapter" do
|
|
@@ -402,6 +411,11 @@ describe Bolognese::Metadata, vcr: true do
|
|
|
402
411
|
expect(subject.publication_year).to eq("2012")
|
|
403
412
|
expect(subject.publisher).to eq("IGI Global")
|
|
404
413
|
expect(subject.agency).to eq("crossref")
|
|
414
|
+
expect(subject.container["type"]).to eq("Book")
|
|
415
|
+
expect(subject.container["title"]).to eq("Graph-Based Methods in Computer Vision")
|
|
416
|
+
expect(subject.container["firstPage"]).to eq("72")
|
|
417
|
+
expect(subject.container["lastPage"]).to eq("94")
|
|
418
|
+
expect(subject.container["identifiers"]).to eq([{"identifier"=>"9781466618916", "identifierType"=>"ISBN"}])
|
|
405
419
|
end
|
|
406
420
|
|
|
407
421
|
it "missing creator" do
|
|
@@ -46,7 +46,7 @@ describe Bolognese::Metadata, vcr: true do
|
|
|
46
46
|
input = fixture_path + "datacite_software_missing_comma.json"
|
|
47
47
|
subject = Bolognese::Metadata.new(input: input, from: "datacite_json", show_errors: true)
|
|
48
48
|
expect(subject.valid?).to be false
|
|
49
|
-
expect(subject.errors).to eq(["expected comma, not a string (after doi) at line 4, column 11 [parse.c:
|
|
49
|
+
expect(subject.errors).to eq(["expected comma, not a string (after doi) at line 4, column 11 [parse.c:388]"])
|
|
50
50
|
expect(subject.codemeta).to be_nil
|
|
51
51
|
end
|
|
52
52
|
|
|
@@ -1314,7 +1314,7 @@ describe Bolognese::Metadata, vcr: true do
|
|
|
1314
1314
|
expect(subject.agency).to eq("datacite")
|
|
1315
1315
|
expect(subject.schema_version).to eq("http://datacite.org/schema/kernel-4")
|
|
1316
1316
|
expect(subject.geo_locations.first["geoLocationPlace"]).to eq("Zandmotor, sand suppletion area on the Dutch coast.")
|
|
1317
|
-
expect(subject.geo_locations.first["geoLocationPolygon"]
|
|
1317
|
+
expect(subject.geo_locations.first["geoLocationPolygon"].first).to eq("polygonPoint"=>{"pointLatitude"=>"52.03913926329928", "pointLongitude"=>"4.1738852605822"})
|
|
1318
1318
|
end
|
|
1319
1319
|
|
|
1320
1320
|
it "Schema 4.4 from string" do
|
|
@@ -1562,7 +1562,15 @@ describe Bolognese::Metadata, vcr: true do
|
|
|
1562
1562
|
{"polygonPoint"=>{"pointLatitude"=>"73", "pointLongitude"=>"45"}},
|
|
1563
1563
|
{"polygonPoint"=>{"pointLatitude"=>"80", "pointLongitude"=>"65"}}
|
|
1564
1564
|
]
|
|
1565
|
-
] }
|
|
1565
|
+
] },
|
|
1566
|
+
{ "geoLocationPolygon"=>
|
|
1567
|
+
[
|
|
1568
|
+
{"polygonPoint"=>{"pointLatitude"=>"80", "pointLongitude"=>"65"}},
|
|
1569
|
+
{"polygonPoint"=>{"pointLatitude"=>"75", "pointLongitude"=>"55"}},
|
|
1570
|
+
{"polygonPoint"=>{"pointLatitude"=>"73", "pointLongitude"=>"45"}},
|
|
1571
|
+
{"polygonPoint"=>{"pointLatitude"=>"80", "pointLongitude"=>"65"}}
|
|
1572
|
+
]
|
|
1573
|
+
}
|
|
1566
1574
|
]
|
|
1567
1575
|
)
|
|
1568
1576
|
end
|
data/spec/utils_spec.rb
CHANGED
|
@@ -539,7 +539,7 @@ describe Bolognese::Metadata, vcr: true do
|
|
|
539
539
|
expect(response).to eq({"rightsUri"=>"info:eu-repo/semantics/openAccess"})
|
|
540
540
|
end
|
|
541
541
|
end
|
|
542
|
-
|
|
542
|
+
|
|
543
543
|
context "fos" do
|
|
544
544
|
it "name_to_fos match" do
|
|
545
545
|
name = "Biological sciences"
|
|
@@ -583,10 +583,23 @@ describe Bolognese::Metadata, vcr: true do
|
|
|
583
583
|
"subjectScheme"=>"Fields of Science and Technology (FOS)"}])
|
|
584
584
|
end
|
|
585
585
|
|
|
586
|
+
it "hsh_to_fos for with schemeUri in hash" do
|
|
587
|
+
hsh = {
|
|
588
|
+
"subject" => "FOS: Computer and information sciences",
|
|
589
|
+
"subjectScheme" => "Fields of Science and Technology (FOS)",
|
|
590
|
+
"schemeUri" => "http://www.oecd.org/science/inno/38235147.pdf"}
|
|
591
|
+
response = subject.hsh_to_fos(hsh)
|
|
592
|
+
expect(response).to eq([{
|
|
593
|
+
"subject" => "FOS: Computer and information sciences",
|
|
594
|
+
"subjectScheme" => "Fields of Science and Technology (FOS)",
|
|
595
|
+
"schemeUri" => "http://www.oecd.org/science/inno/38235147.pdf"}])
|
|
596
|
+
end
|
|
597
|
+
|
|
586
598
|
it "hsh_to_fos no match" do
|
|
587
599
|
hsh = { "__content__"=>"Random tag" }
|
|
588
600
|
response = subject.hsh_to_fos(hsh)
|
|
589
601
|
expect(response).to eq([{"subject"=>"Random tag"}])
|
|
590
602
|
end
|
|
603
|
+
|
|
591
604
|
end
|
|
592
605
|
end
|
|
@@ -281,7 +281,7 @@ describe Bolognese::Metadata, vcr: true do
|
|
|
281
281
|
expect(json["name"]).to eq("Meteo measurements at the Sand Motor")
|
|
282
282
|
expect(json["author"]).to eq("@type"=>"Person", "familyName"=>"Den Heijer", "givenName"=>"C", "name"=>"C Den Heijer")
|
|
283
283
|
expect(json["includedInDataCatalog"]).to be_nil
|
|
284
|
-
expect(json["spatialCoverage"].dig("geo", "polygon")
|
|
284
|
+
expect(json["spatialCoverage"].dig("geo", "polygon").length).to eq(34)
|
|
285
285
|
expect(json["spatialCoverage"].dig("geo", "polygon")[0].first).to eq(["4.1738852605822", "52.03913926329928"])
|
|
286
286
|
end
|
|
287
287
|
|
metadata
CHANGED
|
@@ -1,14 +1,14 @@
|
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
|
2
2
|
name: bolognese
|
|
3
3
|
version: !ruby/object:Gem::Version
|
|
4
|
-
version: 1.9.
|
|
4
|
+
version: 1.9.7
|
|
5
5
|
platform: ruby
|
|
6
6
|
authors:
|
|
7
7
|
- Martin Fenner
|
|
8
8
|
autorequire:
|
|
9
9
|
bindir: bin
|
|
10
10
|
cert_chain: []
|
|
11
|
-
date: 2021-
|
|
11
|
+
date: 2021-05-26 00:00:00.000000000 Z
|
|
12
12
|
dependencies:
|
|
13
13
|
- !ruby/object:Gem::Dependency
|
|
14
14
|
name: maremma
|
|
@@ -50,14 +50,14 @@ dependencies:
|
|
|
50
50
|
requirements:
|
|
51
51
|
- - "~>"
|
|
52
52
|
- !ruby/object:Gem::Version
|
|
53
|
-
version: 1.
|
|
53
|
+
version: 1.11.2
|
|
54
54
|
type: :runtime
|
|
55
55
|
prerelease: false
|
|
56
56
|
version_requirements: !ruby/object:Gem::Requirement
|
|
57
57
|
requirements:
|
|
58
58
|
- - "~>"
|
|
59
59
|
- !ruby/object:Gem::Version
|
|
60
|
-
version: 1.
|
|
60
|
+
version: 1.11.2
|
|
61
61
|
- !ruby/object:Gem::Dependency
|
|
62
62
|
name: loofah
|
|
63
63
|
requirement: !ruby/object:Gem::Requirement
|
|
@@ -1274,7 +1274,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
|
1274
1274
|
- !ruby/object:Gem::Version
|
|
1275
1275
|
version: '0'
|
|
1276
1276
|
requirements: []
|
|
1277
|
-
rubygems_version: 3.0.3
|
|
1277
|
+
rubygems_version: 3.0.3.1
|
|
1278
1278
|
signing_key:
|
|
1279
1279
|
specification_version: 4
|
|
1280
1280
|
summary: Ruby client library for conversion of DOI Metadata
|