bolognese 1.9.2 → 1.9.7
Sign up to get free protection for your applications and to get access to all the features.
- 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
|