bolognese 1.0.29 → 1.0.30
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/Gemfile.lock +2 -2
- data/lib/bolognese/author_utils.rb +33 -56
- data/lib/bolognese/datacite_utils.rb +15 -7
- data/lib/bolognese/metadata.rb +13 -18
- data/lib/bolognese/metadata_utils.rb +41 -20
- data/lib/bolognese/readers/bibtex_reader.rb +21 -17
- data/lib/bolognese/readers/citeproc_reader.rb +28 -7
- data/lib/bolognese/readers/codemeta_reader.rb +21 -8
- data/lib/bolognese/readers/crossref_reader.rb +31 -23
- data/lib/bolognese/readers/datacite_json_reader.rb +1 -47
- data/lib/bolognese/readers/datacite_reader.rb +26 -16
- data/lib/bolognese/readers/ris_reader.rb +20 -13
- data/lib/bolognese/readers/schema_org_reader.rb +26 -22
- data/lib/bolognese/utils.rb +139 -39
- data/lib/bolognese/version.rb +1 -1
- data/lib/bolognese/writers/bibtex_writer.rb +7 -5
- data/lib/bolognese/writers/citation_writer.rb +1 -1
- data/lib/bolognese/writers/codemeta_writer.rb +2 -2
- data/lib/bolognese/writers/crosscite_writer.rb +1 -34
- data/lib/bolognese/writers/datacite_json_writer.rb +1 -29
- data/lib/bolognese/writers/jats_writer.rb +9 -9
- data/lib/bolognese/writers/ris_writer.rb +5 -5
- data/lib/bolognese/writers/schema_org_writer.rb +9 -9
- data/spec/author_utils_spec.rb +17 -47
- data/spec/cli_spec.rb +1 -1
- data/spec/fixtures/crosscite.json +10 -4
- data/spec/fixtures/datacite-example-polygon-v4.1.xml +163 -0
- data/spec/fixtures/datacite-seriesinformation.xml +41 -0
- data/spec/fixtures/datacite.json +12 -8
- data/spec/fixtures/vcr_cassettes/Bolognese_Metadata/get_series_information/only_title.yml +37 -0
- data/spec/fixtures/vcr_cassettes/Bolognese_Metadata/get_series_information/title_and_pages.yml +37 -0
- data/spec/fixtures/vcr_cassettes/Bolognese_Metadata/get_series_information/title_volume_and_pages.yml +37 -0
- data/spec/fixtures/vcr_cassettes/Bolognese_Metadata/get_series_information/title_volume_issue_and_pages.yml +37 -0
- data/spec/fixtures/vcr_cassettes/Bolognese_Metadata/is_personal_name_/has_orcid_id.yml +37 -0
- data/spec/fixtures/vcr_cassettes/Bolognese_Metadata/to_schema_org_identifiers/with_identifiers.yml +37 -0
- data/spec/readers/bibtex_reader_spec.rb +5 -5
- data/spec/readers/citeproc_reader_spec.rb +4 -4
- data/spec/readers/codemeta_reader_spec.rb +39 -18
- data/spec/readers/crosscite_reader_spec.rb +2 -2
- data/spec/readers/crossref_reader_spec.rb +26 -32
- data/spec/readers/datacite_json_reader_spec.rb +2 -2
- data/spec/readers/datacite_reader_spec.rb +156 -101
- data/spec/readers/ris_reader_spec.rb +7 -7
- data/spec/readers/schema_org_reader_spec.rb +34 -28
- data/spec/utils_spec.rb +37 -6
- data/spec/writers/bibtex_writer_spec.rb +1 -0
- data/spec/writers/codemeta_writer_spec.rb +1 -1
- data/spec/writers/crosscite_writer_spec.rb +13 -6
- data/spec/writers/datacite_json_writer_spec.rb +13 -5
- data/spec/writers/datacite_writer_spec.rb +18 -18
- data/spec/writers/schema_org_writer_spec.rb +40 -14
- metadata +10 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 968c22fa1751729204364c0b2e5bf39b7718402122babccde0f6eaf0ccca71a6
|
4
|
+
data.tar.gz: fded31c2e41b95272b2bcb42ccd3a6e7760c82ed98dbceea022d2d7b90cd5029
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 7e67269661948b71dc7c398594835e800eab6261aed23abe970125d68c19dfcfd30476993ac923bd23923e1a5f8d6fb66a766fadf93cfd1c42745811f36ed8e7
|
7
|
+
data.tar.gz: 81fd6cd2910f372d232c329e8187a85d3e89ffa039dc769df56d104f1d6314b15cbb80d4d9b08dab900389c5f2600446016458d141cfec37d251f653a1de95b1
|
data/Gemfile.lock
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
PATH
|
2
2
|
remote: .
|
3
3
|
specs:
|
4
|
-
bolognese (1.0.
|
4
|
+
bolognese (1.0.30)
|
5
5
|
activesupport (>= 4.2.5, < 6)
|
6
6
|
benchmark_methods (~> 0.7)
|
7
7
|
bibtex-ruby (~> 4.1)
|
@@ -120,7 +120,7 @@ GEM
|
|
120
120
|
rack (2.0.6)
|
121
121
|
rack-test (0.8.3)
|
122
122
|
rack (>= 1.0, < 3)
|
123
|
-
rake (12.3.
|
123
|
+
rake (12.3.2)
|
124
124
|
rdf (3.0.7)
|
125
125
|
hamster (~> 3.0)
|
126
126
|
link_header (~> 0.0, >= 0.0.8)
|
@@ -13,36 +13,42 @@ module Bolognese
|
|
13
13
|
}
|
14
14
|
|
15
15
|
def get_one_author(author)
|
16
|
-
|
17
|
-
|
18
|
-
return nil
|
19
|
-
elsif author.fetch("type", nil).present?
|
20
|
-
type = author.fetch("type").titleize
|
21
|
-
elsif author.fetch("creatorName", nil).is_a?(Hash)
|
22
|
-
type = author.dig("creatorName", "nameType") == "Organizational" ? "Organization" : "Person"
|
23
|
-
else
|
24
|
-
type = nil
|
25
|
-
end
|
16
|
+
# malformed XML
|
17
|
+
return nil if author.fetch("creatorName", nil).is_a?(Array)
|
26
18
|
|
27
|
-
name_identifiers = get_name_identifiers(author)
|
28
|
-
id = author.fetch("id", nil).presence || name_identifiers.first
|
29
|
-
identifier = name_identifiers.length > 1 ? name_identifiers.unwrap : nil
|
30
19
|
name = parse_attributes(author.fetch("creatorName", nil)) ||
|
31
|
-
parse_attributes(author.fetch("contributorName", nil))
|
32
|
-
author.fetch("name", nil)
|
33
|
-
|
20
|
+
parse_attributes(author.fetch("contributorName", nil))
|
34
21
|
given_name = parse_attributes(author.fetch("givenName", nil))
|
35
22
|
family_name = parse_attributes(author.fetch("familyName", nil))
|
36
23
|
name = cleanup_author(name)
|
37
|
-
name = [family_name, given_name].join(", ") if
|
24
|
+
name = [family_name, given_name].join(", ") if family_name.present? && given_name.present?
|
38
25
|
contributor_type = parse_attributes(author.fetch("contributorType", nil))
|
39
26
|
|
40
|
-
|
41
|
-
|
27
|
+
name_type = parse_attributes(author.fetch("creatorName", nil), content: "nameType", first: true) || parse_attributes(author.fetch("contributorName", nil), content: "nameType", first: true)
|
28
|
+
name_type = family_name.present? ? "Personal" : nil if name_type.blank?
|
29
|
+
|
30
|
+
name_identifiers = Array.wrap(author.fetch("nameIdentifier", nil)).map do |ni|
|
31
|
+
if ni["nameIdentifierScheme"] == "ORCID"
|
32
|
+
{
|
33
|
+
"nameIdentifier" => normalize_orcid(ni["__content__"]),
|
34
|
+
"nameIdentifierScheme" => "ORCID" }.compact
|
35
|
+
elsif ni["schemeURI"].present?
|
36
|
+
{
|
37
|
+
"nameIdentifier" => ni["schemeURI"].to_s + ni["__content__"].to_s,
|
38
|
+
"nameIdentifierScheme" => ni["nameIdentifierScheme"] }.compact
|
39
|
+
else
|
40
|
+
{
|
41
|
+
"nameIdentifier" => ni["__content__"],
|
42
|
+
"nameIdentifierScheme" => ni["nameIdentifierScheme"] }.compact
|
43
|
+
end
|
44
|
+
end.presence
|
45
|
+
|
46
|
+
author = { "nameType" => name_type,
|
42
47
|
"name" => name,
|
43
48
|
"givenName" => given_name,
|
44
49
|
"familyName" => family_name,
|
45
|
-
"
|
50
|
+
"nameIdentifiers" => name_identifiers,
|
51
|
+
"affiliation" => parse_attributes(author.fetch("affiliation", nil), first: true),
|
46
52
|
"contributorType" => contributor_type }.compact
|
47
53
|
|
48
54
|
return author if family_name.present?
|
@@ -54,21 +60,21 @@ module Bolognese
|
|
54
60
|
if parsed_name.present?
|
55
61
|
given_name = parsed_name.given
|
56
62
|
family_name = parsed_name.family
|
57
|
-
name = [
|
63
|
+
name = [family_name, given_name].join(", ")
|
58
64
|
else
|
59
65
|
given_name = nil
|
60
66
|
family_name = nil
|
61
67
|
end
|
62
68
|
|
63
|
-
{ "
|
64
|
-
"id" => id,
|
69
|
+
{ "nameType" => "Personal",
|
65
70
|
"name" => name,
|
66
71
|
"givenName" => given_name,
|
67
72
|
"familyName" => family_name,
|
68
|
-
"
|
73
|
+
"nameIdentifiers" => name_identifiers,
|
74
|
+
"affiliation" => parse_attributes(author.fetch("affiliation", nil), first: true),
|
69
75
|
"contributorType" => contributor_type }.compact
|
70
76
|
else
|
71
|
-
{ "
|
77
|
+
{ "nameType" => name_type, "name" => name }.compact
|
72
78
|
end
|
73
79
|
end
|
74
80
|
|
@@ -87,8 +93,8 @@ module Bolognese
|
|
87
93
|
end
|
88
94
|
|
89
95
|
def is_personal_name?(author)
|
90
|
-
return false if author.fetch("
|
91
|
-
return true if author.fetch("
|
96
|
+
return false if author.fetch("nameType", nil) == "Organizational"
|
97
|
+
return true if Array.wrap(author.fetch("nameIdentifiers", nil)).find { |a| a["nameIdentifierScheme"] == "ORCID" }.present? ||
|
92
98
|
author.fetch("familyName", "").present? ||
|
93
99
|
(author.fetch("name", "").include?(",") &&
|
94
100
|
author.fetch("name", "").exclude?(";")) ||
|
@@ -108,35 +114,6 @@ module Bolognese
|
|
108
114
|
Array.wrap(authors).map { |author| get_one_author(author) }.compact
|
109
115
|
end
|
110
116
|
|
111
|
-
# parse nameIdentifier from DataCite
|
112
|
-
def get_name_identifiers(author)
|
113
|
-
name_identifiers = Array.wrap(author.fetch("nameIdentifier", nil)).reduce([]) do |sum, n|
|
114
|
-
n = { "__content__" => n } if n.is_a?(String)
|
115
|
-
|
116
|
-
scheme = n.fetch("nameIdentifierScheme", nil)
|
117
|
-
scheme_uri = n.fetch("schemeURI", nil) || IDENTIFIER_SCHEME_URIS.fetch(scheme, "https://orcid.org")
|
118
|
-
scheme_uri = "https://orcid.org/" if validate_orcid_scheme(scheme_uri)
|
119
|
-
scheme_uri << '/' unless scheme_uri.present? && scheme_uri.end_with?('/')
|
120
|
-
|
121
|
-
identifier = n.fetch("__content__", nil)
|
122
|
-
if scheme_uri == "https://orcid.org/"
|
123
|
-
identifier = validate_orcid(identifier)
|
124
|
-
else
|
125
|
-
identifier = identifier.gsub(" ", "-")
|
126
|
-
end
|
127
|
-
|
128
|
-
if identifier.present? && scheme_uri.present?
|
129
|
-
sum << scheme_uri + identifier
|
130
|
-
else
|
131
|
-
sum
|
132
|
-
end
|
133
|
-
end
|
134
|
-
|
135
|
-
# return array of name identifiers, ORCID ID is first element if multiple
|
136
|
-
name_identifiers.select { |n| n.start_with?("https://orcid.org") } +
|
137
|
-
name_identifiers.reject { |n| n.start_with?("https://orcid.org") }
|
138
|
-
end
|
139
|
-
|
140
117
|
def authors_as_string(authors)
|
141
118
|
Array.wrap(authors).map do |a|
|
142
119
|
if a["familyName"].present?
|
@@ -67,12 +67,14 @@ module Bolognese
|
|
67
67
|
|
68
68
|
def insert_person(xml, person, type)
|
69
69
|
person_name = person["familyName"].present? ? [person["familyName"], person["givenName"]].compact.join(", ") : person["name"]
|
70
|
-
attributes =
|
70
|
+
attributes = { "nameType" => person["nameType"] }.compact
|
71
71
|
|
72
72
|
xml.send(type + "Name", person_name, attributes)
|
73
73
|
xml.givenName(person["givenName"]) if person["givenName"].present?
|
74
74
|
xml.familyName(person["familyName"]) if person["familyName"].present?
|
75
|
-
|
75
|
+
Array.wrap(person["nameIdentifiers"]).each do |ni|
|
76
|
+
xml.nameIdentifier(ni["nameIdentifier"], 'nameIdentifierScheme' => ni["nameIdentifierScheme"])
|
77
|
+
end
|
76
78
|
end
|
77
79
|
|
78
80
|
def insert_titles(xml)
|
@@ -92,7 +94,7 @@ module Bolognese
|
|
92
94
|
end
|
93
95
|
|
94
96
|
def insert_publisher(xml)
|
95
|
-
xml.publisher(publisher ||
|
97
|
+
xml.publisher(publisher || container && container["title"])
|
96
98
|
end
|
97
99
|
|
98
100
|
def insert_publication_year(xml)
|
@@ -107,11 +109,12 @@ module Bolognese
|
|
107
109
|
end
|
108
110
|
|
109
111
|
def insert_alternate_identifiers(xml)
|
112
|
+
alternate_identifiers = Array.wrap(identifiers).select { |r| r["identifierType"] != "DOI" }
|
110
113
|
return xml unless alternate_identifiers.present?
|
111
114
|
|
112
115
|
xml.alternateIdentifiers do
|
113
116
|
Array.wrap(alternate_identifiers).each do |alternate_identifier|
|
114
|
-
xml.alternateIdentifier(alternate_identifier["
|
117
|
+
xml.alternateIdentifier(alternate_identifier["identifier"], 'alternateIdentifierType' => alternate_identifier["identifierType"])
|
115
118
|
end
|
116
119
|
end
|
117
120
|
end
|
@@ -207,11 +210,16 @@ module Bolognese
|
|
207
210
|
end
|
208
211
|
|
209
212
|
def insert_descriptions(xml)
|
210
|
-
return xml unless descriptions.present? ||
|
213
|
+
return xml unless descriptions.present? || container && container["title"].present?
|
211
214
|
|
212
215
|
xml.descriptions do
|
213
|
-
if
|
214
|
-
|
216
|
+
if container && container["title"].present?
|
217
|
+
title = [container["title"]]
|
218
|
+
volume = "#{container["volume"]}" if container["volume"].present?
|
219
|
+
volume += "(#{container["issue"]})" if container["issue"].present?
|
220
|
+
pages = [container["firstPage"], container["lastPage"]].compact.join("-") if container["firstPage"].present?
|
221
|
+
series_information = [title, volume, pages].compact.join(", ")
|
222
|
+
xml.description(series_information, 'descriptionType' => "SeriesInformation")
|
215
223
|
end
|
216
224
|
|
217
225
|
Array.wrap(descriptions).each do |description|
|
data/lib/bolognese/metadata.rb
CHANGED
@@ -8,10 +8,10 @@ module Bolognese
|
|
8
8
|
|
9
9
|
attr_accessor :string, :from, :sandbox, :meta, :regenerate, :issue
|
10
10
|
attr_reader :doc, :page_start, :page_end
|
11
|
-
attr_writer :id, :provider_id, :client_id, :doi, :
|
11
|
+
attr_writer :id, :provider_id, :client_id, :doi, :identifiers, :creators, :contributors, :titles, :publisher,
|
12
12
|
:rights_list, :dates, :publication_year, :volume, :url, :version_info,
|
13
|
-
:subjects, :contributor, :descriptions, :
|
14
|
-
:formats, :schema_version, :meta, :
|
13
|
+
:subjects, :contributor, :descriptions, :language, :sizes,
|
14
|
+
:formats, :schema_version, :meta, :container, :agency,
|
15
15
|
:format, :funding_references, :state, :geo_locations,
|
16
16
|
:types, :content_url, :related_identifiers, :style, :locale
|
17
17
|
|
@@ -49,7 +49,7 @@ module Bolognese
|
|
49
49
|
"client_id" => options[:client_id],
|
50
50
|
"content_url" => options[:content_url],
|
51
51
|
"creators" => options[:creators],
|
52
|
-
"contributors" => options[:
|
52
|
+
"contributors" => options[:contributors],
|
53
53
|
"titles" => options[:titles],
|
54
54
|
"publisher" => options[:publisher],
|
55
55
|
"publication_year" => options[:publication_year] }
|
@@ -83,8 +83,8 @@ module Bolognese
|
|
83
83
|
:contributors,
|
84
84
|
:titles,
|
85
85
|
:types,
|
86
|
-
:
|
87
|
-
:
|
86
|
+
:identifiers,
|
87
|
+
:container,
|
88
88
|
:publisher,
|
89
89
|
:funding_references,
|
90
90
|
:dates,
|
@@ -101,8 +101,7 @@ module Bolognese
|
|
101
101
|
).compact
|
102
102
|
|
103
103
|
# generate name for method to call dynamically
|
104
|
-
@meta = @from.present? ? send("read_" + @from, { string: string, sandbox: options[:sandbox] }.merge(read_options)) : {}
|
105
|
-
@identifier = normalize_doi(options[:doi] || input, options) || @meta.fetch("id", nil) || @meta.fetch("identifier", nil)
|
104
|
+
@meta = @from.present? ? send("read_" + @from, { string: string, sandbox: options[:sandbox], doi: options[:doi], id: id }.merge(read_options)) : {}
|
106
105
|
end
|
107
106
|
|
108
107
|
def id
|
@@ -110,7 +109,7 @@ module Bolognese
|
|
110
109
|
end
|
111
110
|
|
112
111
|
def doi
|
113
|
-
@doi ||=
|
112
|
+
@doi ||= meta.fetch("doi", nil)
|
114
113
|
end
|
115
114
|
|
116
115
|
def provider_id
|
@@ -122,7 +121,7 @@ module Bolognese
|
|
122
121
|
end
|
123
122
|
|
124
123
|
def exists?
|
125
|
-
(@state || meta.fetch("state",
|
124
|
+
(@state || meta.fetch("state", nil)) != "not_found"
|
126
125
|
end
|
127
126
|
|
128
127
|
def valid?
|
@@ -182,8 +181,8 @@ module Bolognese
|
|
182
181
|
@publication_year ||= meta.fetch("publication_year", nil)
|
183
182
|
end
|
184
183
|
|
185
|
-
def
|
186
|
-
@
|
184
|
+
def container
|
185
|
+
@container ||= meta.fetch("container", nil)
|
187
186
|
end
|
188
187
|
|
189
188
|
def geo_locations
|
@@ -198,8 +197,8 @@ module Bolognese
|
|
198
197
|
@publisher ||= meta.fetch("publisher", nil)
|
199
198
|
end
|
200
199
|
|
201
|
-
def
|
202
|
-
@
|
200
|
+
def identifiers
|
201
|
+
@identifiers ||= meta.fetch("identifiers", nil)
|
203
202
|
end
|
204
203
|
|
205
204
|
def content_url
|
@@ -214,10 +213,6 @@ module Bolognese
|
|
214
213
|
@state ||= meta.fetch("state", nil)
|
215
214
|
end
|
216
215
|
|
217
|
-
def identifier
|
218
|
-
@identifier ||= meta.fetch("id", nil)
|
219
|
-
end
|
220
|
-
|
221
216
|
def types
|
222
217
|
@types ||= meta.fetch("types", nil)
|
223
218
|
end
|
@@ -62,7 +62,6 @@ module Bolognese
|
|
62
62
|
include Bolognese::Writers::TurtleWriter
|
63
63
|
|
64
64
|
attr_reader :name_detector, :reverse
|
65
|
-
attr_writer :first_page, :last_page
|
66
65
|
|
67
66
|
# replace DOI in XML if provided in options
|
68
67
|
def raw
|
@@ -79,21 +78,9 @@ module Bolognese
|
|
79
78
|
(from == "datacite") && regenerate.blank? && raw.present?
|
80
79
|
end
|
81
80
|
|
82
|
-
def volume
|
83
|
-
@volume ||= meta.fetch("volume", nil)
|
84
|
-
end
|
85
|
-
|
86
|
-
def first_page
|
87
|
-
@first_page ||= meta.fetch("first_page", nil)
|
88
|
-
end
|
89
|
-
|
90
|
-
def last_page
|
91
|
-
@last_page ||= meta.fetch("last_page", nil)
|
92
|
-
end
|
93
|
-
|
94
81
|
def container_title
|
95
|
-
if
|
96
|
-
|
82
|
+
if container.present?
|
83
|
+
container["title"]
|
97
84
|
elsif types["citeproc"] == "article-journal"
|
98
85
|
publisher
|
99
86
|
else
|
@@ -124,9 +111,11 @@ module Bolognese
|
|
124
111
|
end
|
125
112
|
|
126
113
|
def citeproc_hsh
|
114
|
+
page = container.to_h["firstPage"].present? ? [container["firstPage"], container["lastPage"]].join("-") : nil
|
115
|
+
|
127
116
|
{
|
128
117
|
"type" => types["citeproc"],
|
129
|
-
"id" =>
|
118
|
+
"id" => id,
|
130
119
|
"categories" => Array.wrap(subjects).map { |k| parse_attributes(k, content: "subject", first: true) }.presence,
|
131
120
|
"language" => language,
|
132
121
|
"author" => to_citeproc(creators),
|
@@ -136,16 +125,48 @@ module Bolognese
|
|
136
125
|
"abstract" => parse_attributes(descriptions, content: "description", first: true),
|
137
126
|
"container-title" => container_title,
|
138
127
|
"DOI" => doi,
|
139
|
-
"
|
140
|
-
"
|
128
|
+
"volume" => container.to_h["volume"],
|
129
|
+
"issue" => container.to_h["issue"],
|
130
|
+
"page" => page,
|
141
131
|
"publisher" => publisher,
|
142
132
|
"title" => parse_attributes(titles, content: "title", first: true),
|
143
133
|
"URL" => url,
|
144
|
-
"version" => version_info
|
145
|
-
"volume" => volume
|
134
|
+
"version" => version_info
|
146
135
|
}.compact.symbolize_keys
|
147
136
|
end
|
148
137
|
|
138
|
+
def crosscite_hsh
|
139
|
+
{
|
140
|
+
"id" => id,
|
141
|
+
"doi" => doi,
|
142
|
+
"url" => url,
|
143
|
+
"types" => types,
|
144
|
+
"creators" => creators,
|
145
|
+
"titles" => titles,
|
146
|
+
"publisher" => publisher,
|
147
|
+
"container" => container,
|
148
|
+
"subjects" => subjects,
|
149
|
+
"contributors" => contributors,
|
150
|
+
"dates" => dates,
|
151
|
+
"publication_year" => publication_year,
|
152
|
+
"language" => language,
|
153
|
+
"identifiers" => identifiers,
|
154
|
+
"sizes" => sizes,
|
155
|
+
"formats" => formats,
|
156
|
+
"version" => version_info,
|
157
|
+
"rights_list" => rights_list,
|
158
|
+
"descriptions" => descriptions,
|
159
|
+
"geo_locations" => geo_locations,
|
160
|
+
"funding_references" => funding_references,
|
161
|
+
"related_identifiers" => related_identifiers,
|
162
|
+
"schema_version" => schema_version,
|
163
|
+
"provider_id" => provider_id,
|
164
|
+
"client_id" => client_id,
|
165
|
+
"agency" => agency,
|
166
|
+
"state" => state
|
167
|
+
}.compact
|
168
|
+
end
|
169
|
+
|
149
170
|
def style
|
150
171
|
@style ||= "apa"
|
151
172
|
end
|
@@ -40,14 +40,14 @@ module Bolognese
|
|
40
40
|
"citeproc" => BIB_TO_CP_TRANSLATIONS[meta.try(:type).to_s] || "misc",
|
41
41
|
"ris" => BIB_TO_RIS_TRANSLATIONS[meta.try(:type).to_s] || "GEN"
|
42
42
|
}.compact
|
43
|
-
doi = meta.try(:doi).to_s.presence
|
43
|
+
doi = meta.try(:doi).to_s.presence || options[:doi]
|
44
44
|
|
45
|
-
|
46
|
-
|
47
|
-
|
48
|
-
|
49
|
-
|
50
|
-
|
45
|
+
creators = Array(meta.try(:author)).map do |a|
|
46
|
+
{ "nameType" => "Personal",
|
47
|
+
"name" => [a.last, a.first].join(", "),
|
48
|
+
"givenName" => a.first,
|
49
|
+
"familyName" => a.last }.compact
|
50
|
+
end
|
51
51
|
|
52
52
|
related_identifiers = if meta.try(:journal).present? && meta.try(:issn).to_s.presence
|
53
53
|
[{ "type" => "Periodical",
|
@@ -59,16 +59,22 @@ module Bolognese
|
|
59
59
|
nil
|
60
60
|
end
|
61
61
|
|
62
|
-
|
63
|
-
|
62
|
+
container = if meta.try(:journal).present?
|
63
|
+
first_page = meta.try(:pages).present? ? meta.try(:pages).split("-").map(&:strip).first : nil
|
64
|
+
last_page = meta.try(:pages).present? ? meta.try(:pages).split("-").map(&:strip).last : nil
|
65
|
+
|
66
|
+
{ "type" => "Journal",
|
64
67
|
"title" => meta.journal.to_s,
|
65
|
-
"
|
68
|
+
"identifier" => meta.try(:issn).to_s.presence,
|
69
|
+
"identifierType" => meta.try(:issn).present? ? "ISSN" : nil,
|
70
|
+
"volume" => meta.try(:volume).to_s.presence,
|
71
|
+
"firstPage" => first_page,
|
72
|
+
"lastPage" => last_page }.compact
|
66
73
|
else
|
67
74
|
nil
|
68
75
|
end
|
69
76
|
|
70
|
-
|
71
|
-
state = doi.present? || read_options.present? ? "findable" : "not_found"
|
77
|
+
state = meta.try(:doi).to_s.present? || read_options.present? ? "findable" : "not_found"
|
72
78
|
dates = if meta.try(:date).present?
|
73
79
|
[{ "date" => meta.date.to_s,
|
74
80
|
"dateType" => "Issued" }]
|
@@ -79,18 +85,16 @@ module Bolognese
|
|
79
85
|
|
80
86
|
{ "id" => normalize_doi(doi),
|
81
87
|
"types" => types,
|
88
|
+
"identifiers" => [{ "identifier" => normalize_doi(doi), "identifierType" => "DOI" }],
|
82
89
|
"doi" => doi,
|
83
90
|
"url" => meta.try(:url).to_s.presence,
|
84
91
|
"titles" => meta.try(:title).present? ? [{ "title" => meta.try(:title).to_s }] : [],
|
85
|
-
"creators" =>
|
86
|
-
"
|
92
|
+
"creators" => creators,
|
93
|
+
"container" => container,
|
87
94
|
"publisher" => meta.try(:publisher).to_s.presence,
|
88
95
|
"related_identifiers" => related_identifiers,
|
89
96
|
"dates" => dates,
|
90
97
|
"publication_year" => publication_year,
|
91
|
-
"volume" => meta.try(:volume).to_s.presence,
|
92
|
-
"page_first" => page_first,
|
93
|
-
"page_last" => page_last,
|
94
98
|
"descriptions" => meta.try(:abstract).present? ? [{ "description" => meta.try(:abstract) && sanitize(meta.abstract.to_s).presence, "descriptionType" => "Abstract" }] : [],
|
95
99
|
"rights_list" => meta.try(:copyright).present? ? [{ "rightsUri" => meta.try(:copyright).to_s.presence }.compact] : [],
|
96
100
|
"state" => state
|