bolognese 0.5 → 0.5.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/Gemfile.lock +1 -1
- data/lib/bolognese/author_utils.rb +6 -8
- data/lib/bolognese/crossref.rb +14 -10
- data/lib/bolognese/datacite.rb +15 -2
- data/lib/bolognese/datacite_utils.rb +1 -2
- data/lib/bolognese/metadata.rb +14 -0
- data/lib/bolognese/schema_org.rb +4 -0
- data/lib/bolognese/version.rb +1 -1
- data/spec/crossref_spec.rb +10 -1
- data/spec/datacite_spec.rb +4 -0
- metadata +1 -1
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: deb650206d9feee61ce70231a6e0d847dd7cb624
|
4
|
+
data.tar.gz: 129088964177fa28dd209875529bf3d502163bac
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 28d10eae1a9a8adc8c4e53f191d2f1cf8218327e6e144103d73cf9d4e38f2dff371d2f8a40ae6db9b40437ecc873fcce5054df05b155d297457dae2d2c4fe236
|
7
|
+
data.tar.gz: 6eb9ce2ba440d28822a4df0dccf9ade48d4bdee95d43dd034f1b2134e3ad8289b8998a49dd2a29189648e649e6d87894263e7a36377e256159a04811781a8db9
|
data/Gemfile.lock
CHANGED
@@ -12,7 +12,7 @@ module Bolognese
|
|
12
12
|
author = cleanup_author(author)
|
13
13
|
names = Namae.parse(author)
|
14
14
|
|
15
|
-
if names.blank? || is_personal_name?(author)
|
15
|
+
if names.blank? || !is_personal_name?(author)
|
16
16
|
{ "@type" => "Agent",
|
17
17
|
"@id" => orcid,
|
18
18
|
"Name" => author }.compact
|
@@ -48,17 +48,15 @@ module Bolognese
|
|
48
48
|
Array(authors).map { |author| get_one_author(author) }
|
49
49
|
end
|
50
50
|
|
51
|
-
#
|
51
|
+
# parse nameIdentifier from DataCite
|
52
52
|
def get_name_identifier(author)
|
53
53
|
name_identifier = author.dig("nameIdentifier", "text")
|
54
54
|
name_identifier = validate_orcid(name_identifier)
|
55
|
-
|
56
55
|
name_identifier_scheme = author.dig("nameIdentifier", "nameIdentifierScheme") || "ORCID"
|
57
|
-
|
58
|
-
|
59
|
-
|
60
|
-
|
61
|
-
end
|
56
|
+
|
57
|
+
return nil if name_identifier.blank? || name_identifier_scheme.upcase != "ORCID"
|
58
|
+
|
59
|
+
"http://orcid.org/" + name_identifier
|
62
60
|
end
|
63
61
|
end
|
64
62
|
end
|
data/lib/bolognese/crossref.rb
CHANGED
@@ -4,10 +4,10 @@ module Bolognese
|
|
4
4
|
# CrossRef types from https://api.crossref.org/types
|
5
5
|
CR_TO_SO_TRANSLATIONS = {
|
6
6
|
"Proceedings" => nil,
|
7
|
-
"ReferenceBook" =>
|
8
|
-
"JournalIssue" =>
|
7
|
+
"ReferenceBook" => "Book",
|
8
|
+
"JournalIssue" => "PublicationIssue",
|
9
9
|
"ProceedingsArticle" => nil,
|
10
|
-
"Other" =>
|
10
|
+
"Other" => "CreativeWork",
|
11
11
|
"Dissertation" => "Thesis",
|
12
12
|
"Dataset" => "Dataset",
|
13
13
|
"EditedBook" => "Book",
|
@@ -24,11 +24,11 @@ module Bolognese
|
|
24
24
|
"BookChapter" => "Chapter",
|
25
25
|
"StandardSeries" => nil,
|
26
26
|
"Monograph" => "Book",
|
27
|
-
"Component" =>
|
27
|
+
"Component" => "CreativeWork",
|
28
28
|
"ReferenceEntry" => nil,
|
29
|
-
"JournalVolume" =>
|
29
|
+
"JournalVolume" => "PublicationVolume",
|
30
30
|
"BookSet" => nil,
|
31
|
-
"PostedContent" =>
|
31
|
+
"PostedContent" => "ScholarlyArticle"
|
32
32
|
}
|
33
33
|
|
34
34
|
def initialize(id: nil, string: nil)
|
@@ -80,6 +80,14 @@ module Bolognese
|
|
80
80
|
bibliographic_metadata.dig("crossmark", "custom_metadata", "program") || {}
|
81
81
|
end
|
82
82
|
|
83
|
+
def resource_type_general
|
84
|
+
SO_TO_DC_TRANSLATIONS[type]
|
85
|
+
end
|
86
|
+
|
87
|
+
def type
|
88
|
+
CR_TO_SO_TRANSLATIONS[additional_type] || "ScholarlyArticle"
|
89
|
+
end
|
90
|
+
|
83
91
|
def additional_type
|
84
92
|
if metadata.dig("crossref", "journal").present?
|
85
93
|
metadata.dig("crossref", "journal").keys.last.camelize
|
@@ -88,10 +96,6 @@ module Bolognese
|
|
88
96
|
end
|
89
97
|
end
|
90
98
|
|
91
|
-
def type
|
92
|
-
CR_TO_SO_TRANSLATIONS[additional_type] || "CreativeWork"
|
93
|
-
end
|
94
|
-
|
95
99
|
def name
|
96
100
|
parse_attribute(bibliographic_metadata.dig("titles", "title"))
|
97
101
|
end
|
data/lib/bolognese/datacite.rb
CHANGED
@@ -48,9 +48,12 @@ module Bolognese
|
|
48
48
|
normalize_doi(doi)
|
49
49
|
end
|
50
50
|
|
51
|
+
def resource_type_general
|
52
|
+
metadata.dig("resourceType", "resourceTypeGeneral")
|
53
|
+
end
|
54
|
+
|
51
55
|
def type
|
52
|
-
|
53
|
-
DC_TO_SO_TRANSLATIONS[k.to_s.dasherize] || "CreativeWork"
|
56
|
+
DC_TO_SO_TRANSLATIONS[resource_type_general.to_s.dasherize] || "CreativeWork"
|
54
57
|
end
|
55
58
|
|
56
59
|
def additional_type
|
@@ -103,6 +106,8 @@ module Bolognese
|
|
103
106
|
Array.wrap(metadata.dig("dates", "date"))
|
104
107
|
end
|
105
108
|
|
109
|
+
#Accepted Available Copyrighted Collected Created Issued Submitted Updated Valid
|
110
|
+
|
106
111
|
def date(date_type)
|
107
112
|
dd = dates.find { |d| d["dateType"] == date_type } || {}
|
108
113
|
dd.fetch("text", nil)
|
@@ -120,6 +125,14 @@ module Bolognese
|
|
120
125
|
date("Updated")
|
121
126
|
end
|
122
127
|
|
128
|
+
def language
|
129
|
+
metadata.fetch("language", nil)
|
130
|
+
end
|
131
|
+
|
132
|
+
def spatial_coverage
|
133
|
+
|
134
|
+
end
|
135
|
+
|
123
136
|
def related_identifiers(relation_type)
|
124
137
|
Array(metadata.dig("relatedIdentifiers", "relatedIdentifier"))
|
125
138
|
.select { |r| relation_type.split(" ").include?(r["relationType"]) && %w(DOI URL).include?(r["relatedIdentifierType"]) }
|
@@ -28,7 +28,7 @@ module Bolognese
|
|
28
28
|
"http://creativecommons.org/licenses/by/4.0/" => "Creative Commons Attribution 4.0 (CC-BY 4.0)",
|
29
29
|
"http://creativecommons.org/licenses/by-nc/4.0/" => "Creative Commons Attribution Noncommercial 4.0 (CC-BY-NC 4.0)",
|
30
30
|
"http://creativecommons.org/licenses/by-sa/4.0/" => "Creative Commons Attribution Share Alike 4.0 (CC-BY-SA 4.0)",
|
31
|
-
"http://creativecommons.org/licenses/by-nc-nd/4.0/" => "Creative Commons Attribution Noncommercial No
|
31
|
+
"http://creativecommons.org/licenses/by-nc-nd/4.0/" => "Creative Commons Attribution Noncommercial No Derivatives 4.0 (CC-BY-NC-ND 4.0)"
|
32
32
|
}
|
33
33
|
|
34
34
|
SCHEMA = File.expand_path("../../../resources/kernel-4.0/metadata.xsd", __FILE__)
|
@@ -230,4 +230,3 @@ module Bolognese
|
|
230
230
|
end
|
231
231
|
end
|
232
232
|
end
|
233
|
-
|
data/lib/bolognese/metadata.rb
CHANGED
@@ -48,6 +48,18 @@ module Bolognese
|
|
48
48
|
|
49
49
|
end
|
50
50
|
|
51
|
+
def contributor
|
52
|
+
|
53
|
+
end
|
54
|
+
|
55
|
+
def language
|
56
|
+
|
57
|
+
end
|
58
|
+
|
59
|
+
def spatial_coverage
|
60
|
+
|
61
|
+
end
|
62
|
+
|
51
63
|
def as_schema_org
|
52
64
|
{ "@context" => "http://schema.org",
|
53
65
|
"@type" => type,
|
@@ -62,11 +74,13 @@ module Bolognese
|
|
62
74
|
"license" => license,
|
63
75
|
"version" => version,
|
64
76
|
"keywords" => keywords,
|
77
|
+
"language" => language,
|
65
78
|
"dateCreated" => date_created,
|
66
79
|
"datePublished" => date_published,
|
67
80
|
"dateModified" => date_modified,
|
68
81
|
"pageStart" => page_start,
|
69
82
|
"pageEnd" => page_end,
|
83
|
+
"spatialCoverage" => spatial_coverage,
|
70
84
|
"isPartOf" => is_part_of,
|
71
85
|
"hasPart" => has_part,
|
72
86
|
"citation" => citation,
|
data/lib/bolognese/schema_org.rb
CHANGED
data/lib/bolognese/version.rb
CHANGED
data/spec/crossref_spec.rb
CHANGED
@@ -10,6 +10,7 @@ describe Bolognese::Crossref, vcr: true do
|
|
10
10
|
expect(subject.id).to eq("https://doi.org/10.7554/elife.01567")
|
11
11
|
expect(subject.type).to eq("ScholarlyArticle")
|
12
12
|
expect(subject.additional_type).to eq("JournalArticle")
|
13
|
+
expect(subject.resource_type_general).to eq("Text")
|
13
14
|
expect(subject.author).to eq([{"@type"=>"Person", "givenName"=>"Martial", "familyName"=>"Sankar"},
|
14
15
|
{"@type"=>"Person", "givenName"=>"Kaisa", "familyName"=>"Nieminen"},
|
15
16
|
{"@type"=>"Person", "givenName"=>"Laura", "familyName"=>"Ragni"},
|
@@ -31,6 +32,7 @@ describe Bolognese::Crossref, vcr: true do
|
|
31
32
|
expect(subject.id).to eq(id)
|
32
33
|
expect(subject.type).to eq("ScholarlyArticle")
|
33
34
|
expect(subject.additional_type).to eq("JournalArticle")
|
35
|
+
expect(subject.resource_type_general).to eq("Text")
|
34
36
|
expect(subject.author).to eq([{"@type"=>"Person", "givenName"=>"Markus", "familyName"=>"Ralser"},
|
35
37
|
{"@type"=>"Person", "givenName"=>"Gino", "familyName"=>"Heeren"},
|
36
38
|
{"@type"=>"Person", "givenName"=>"Michael", "familyName"=>"Breitenbach"},
|
@@ -50,8 +52,9 @@ describe Bolognese::Crossref, vcr: true do
|
|
50
52
|
id = "https://doi.org/10.1101/097196"
|
51
53
|
subject = Bolognese::Crossref.new(id: id)
|
52
54
|
expect(subject.id).to eq(id)
|
53
|
-
expect(subject.type).to eq("
|
55
|
+
expect(subject.type).to eq("ScholarlyArticle")
|
54
56
|
expect(subject.additional_type).to eq("PostedContent")
|
57
|
+
expect(subject.resource_type_general).to eq("Text")
|
55
58
|
expect(subject.author.count).to eq(10)
|
56
59
|
expect(subject.author.last).to eq("@type"=>"Person", "@id"=>"http://orcid.org/0000-0003-4060-7360", "givenName"=>"Timothy", "familyName"=>"Clark")
|
57
60
|
expect(subject.name).to eq("A Data Citation Roadmap for Scholarly Data Repositories")
|
@@ -69,6 +72,7 @@ describe Bolognese::Crossref, vcr: true do
|
|
69
72
|
expect(subject.id).to eq("https://doi.org/10.1890/0012-9658(2006)87%5B2832:tiopma%5D2.0.co;2")
|
70
73
|
expect(subject.type).to eq("ScholarlyArticle")
|
71
74
|
expect(subject.additional_type).to eq("JournalArticle")
|
75
|
+
expect(subject.resource_type_general).to eq("Text")
|
72
76
|
expect(subject.author).to eq([{"@type"=>"Person", "givenName"=>"A.", "familyName"=>"Fenton"}, {"@type"=>"Person", "givenName"=>"S. A.", "familyName"=>"Rands"}])
|
73
77
|
expect(subject.license).to eq("http://doi.wiley.com/10.1002/tdm_license_1")
|
74
78
|
expect(subject.name).to eq("THE IMPACT OF PARASITE MANIPULATION AND PREDATOR FORAGING BEHAVIOR ON PREDATOR–PREY COMMUNITIES")
|
@@ -86,6 +90,7 @@ describe Bolognese::Crossref, vcr: true do
|
|
86
90
|
expect(subject.id).to eq("https://doi.org/10.1155/2012/291294")
|
87
91
|
expect(subject.type).to eq("ScholarlyArticle")
|
88
92
|
expect(subject.additional_type).to eq("JournalArticle")
|
93
|
+
expect(subject.resource_type_general).to eq("Text")
|
89
94
|
expect(subject.author).to eq([{"@type"=>"Person", "givenName"=>"Wendy", "familyName"=>"Thanassi"},
|
90
95
|
{"@type"=>"Person", "givenName"=>"Art", "familyName"=>"Noda"},
|
91
96
|
{"@type"=>"Person",
|
@@ -112,6 +117,7 @@ describe Bolognese::Crossref, vcr: true do
|
|
112
117
|
expect(subject.id).to eq(id)
|
113
118
|
expect(subject.type).to eq("ScholarlyArticle")
|
114
119
|
expect(subject.additional_type).to eq("JournalArticle")
|
120
|
+
expect(subject.resource_type_general).to eq("Text")
|
115
121
|
expect(subject.author).to eq([{"@type"=>"Person", "givenName"=>"Sarah E.", "familyName"=>"Beck"},
|
116
122
|
{"@type"=>"Person", "givenName"=>"Suzanne E.", "familyName"=>"Queen"},
|
117
123
|
{"@type"=>"Person", "givenName"=>"Kenneth W.", "familyName"=>"Witwer"},
|
@@ -151,6 +157,7 @@ describe Bolognese::Crossref, vcr: true do
|
|
151
157
|
expect(subject.id).to eq("https://doi.org/10.7554/elife.01567")
|
152
158
|
expect(subject.type).to eq("ScholarlyArticle")
|
153
159
|
expect(subject.additional_type).to eq("JournalArticle")
|
160
|
+
expect(subject.resource_type_general).to eq("Text")
|
154
161
|
expect(subject.author).to eq([{"@type"=>"Person", "givenName"=>"Martial", "familyName"=>"Sankar"},
|
155
162
|
{"@type"=>"Person", "givenName"=>"Kaisa", "familyName"=>"Nieminen"},
|
156
163
|
{"@type"=>"Person", "givenName"=>"Laura", "familyName"=>"Ragni"},
|
@@ -171,6 +178,7 @@ describe Bolognese::Crossref, vcr: true do
|
|
171
178
|
it "with data citation" do
|
172
179
|
expect(subject.validation_errors).to be_empty
|
173
180
|
datacite = Maremma.from_xml(subject.as_datacite).fetch("resource", {})
|
181
|
+
expect(datacite.dig("resourceType", "resourceTypeGeneral")).to eq("Text")
|
174
182
|
expect(datacite.dig("titles", "title")).to eq("Automated quantitative histology reveals vascular morphodynamics during Arabidopsis hypocotyl secondary growth")
|
175
183
|
expect(datacite.dig("relatedIdentifiers", "relatedIdentifier").count).to eq(25)
|
176
184
|
end
|
@@ -180,6 +188,7 @@ describe Bolognese::Crossref, vcr: true do
|
|
180
188
|
subject = Bolognese::Crossref.new(id: id)
|
181
189
|
expect(subject.validation_errors).to be_empty
|
182
190
|
datacite = Maremma.from_xml(subject.as_datacite).fetch("resource", {})
|
191
|
+
expect(datacite.dig("resourceType", "resourceTypeGeneral")).to eq("Text")
|
183
192
|
expect(datacite.dig("creators", "creator").count).to eq(7)
|
184
193
|
expect(datacite.dig("creators", "creator").first).to eq("creatorName"=>"Thanassi, Wendy", "givenName"=>"Wendy", "familyName"=>"Thanassi")
|
185
194
|
end
|
data/spec/datacite_spec.rb
CHANGED
@@ -10,6 +10,7 @@ describe Bolognese::Datacite, vcr: true do
|
|
10
10
|
expect(subject.id).to eq("https://doi.org/10.5061/dryad.8515")
|
11
11
|
expect(subject.type).to eq("Dataset")
|
12
12
|
expect(subject.additional_type).to eq("DataPackage")
|
13
|
+
expect(subject.resource_type_general).to eq("Dataset")
|
13
14
|
expect(subject.author).to eq([{"@type"=>"Person", "givenName"=>"Benjamin", "familyName"=>"Ollomo"},
|
14
15
|
{"@type"=>"Person", "givenName"=>"Patrick", "familyName"=>"Durand"},
|
15
16
|
{"@type"=>"Person", "givenName"=>"Franck", "familyName"=>"Prugnolle"},
|
@@ -35,6 +36,7 @@ describe Bolognese::Datacite, vcr: true do
|
|
35
36
|
expect(subject.id).to eq("https://doi.org/10.5438/4k3m-nyvg")
|
36
37
|
expect(subject.type).to eq("ScholarlyArticle")
|
37
38
|
expect(subject.additional_type).to eq("BlogPosting")
|
39
|
+
expect(subject.resource_type_general).to eq("Text")
|
38
40
|
expect(subject.author).to eq([{"@type"=>"Person", "@id"=>"http://orcid.org/0000-0003-1419-2405", "givenName"=>"Martin", "familyName"=>"Fenner"}])
|
39
41
|
expect(subject.name).to eq("Eating your own Dog Food")
|
40
42
|
expect(subject.alternate_name).to eq("MS-49-3632-5083")
|
@@ -54,6 +56,7 @@ describe Bolognese::Datacite, vcr: true do
|
|
54
56
|
expect(subject.id).to eq("https://doi.org/10.4230/lipics.tqc.2013.93")
|
55
57
|
expect(subject.type).to eq("ScholarlyArticle")
|
56
58
|
expect(subject.additional_type).to eq("ConferencePaper")
|
59
|
+
expect(subject.resource_type_general).to eq("Text")
|
57
60
|
expect(subject.author).to eq([{"@type"=>"Person", "givenName"=>"Nathaniel", "familyName"=>"Johnston"}])
|
58
61
|
expect(subject.name).to eq("The Minimum Size of Qubit Unextendible Product Bases")
|
59
62
|
expect(subject.description).to start_with("We investigate the problem of constructing unextendible product bases in the qubit case")
|
@@ -77,6 +80,7 @@ describe Bolognese::Datacite, vcr: true do
|
|
77
80
|
expect(subject.id).to eq("https://doi.org/10.5061/dryad.8515")
|
78
81
|
expect(subject.type).to eq("Dataset")
|
79
82
|
expect(subject.additional_type).to eq("DataPackage")
|
83
|
+
expect(subject.resource_type_general).to eq("Dataset")
|
80
84
|
expect(subject.author).to eq([{"@type"=>"Person", "givenName"=>"Benjamin", "familyName"=>"Ollomo"},
|
81
85
|
{"@type"=>"Person", "givenName"=>"Patrick", "familyName"=>"Durand"},
|
82
86
|
{"@type"=>"Person", "givenName"=>"Franck", "familyName"=>"Prugnolle"},
|