bolognese 0.7 → 0.7.1
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/.gitignore +1 -0
- data/Gemfile.lock +1 -1
- data/README.md +64 -0
- data/lib/bolognese/author_utils.rb +12 -0
- data/lib/bolognese/cli.rb +3 -2
- data/lib/bolognese/codemeta.rb +3 -3
- data/lib/bolognese/crossref.rb +4 -4
- data/lib/bolognese/datacite.rb +2 -2
- data/lib/bolognese/metadata.rb +1 -6
- data/lib/bolognese/schema_org.rb +4 -4
- data/lib/bolognese/utils.rb +52 -6
- data/lib/bolognese/version.rb +1 -1
- data/spec/author_utils_spec.rb +39 -0
- data/spec/cli_spec.rb +23 -0
- data/spec/codemeta_spec.rb +120 -40
- data/spec/fixtures/codemeta.json +0 -1
- data/spec/fixtures/maremma/codemeta.json +36 -0
- data/spec/fixtures/vcr_cassettes/Bolognese_Codemeta/get_metadata/maremma.yml +97 -0
- data/spec/fixtures/vcr_cassettes/Bolognese_Codemeta/get_metadata/maremma_schema_org_JSON.yml +97 -0
- data/spec/fixtures/vcr_cassettes/Bolognese_Codemeta/get_metadata/no_codemeta_json.yml +66 -0
- data/spec/fixtures/vcr_cassettes/Bolognese_Codemeta/get_metadata/not_found_error.yml +66 -0
- data/spec/fixtures/vcr_cassettes/Bolognese_Codemeta/get_metadata_as_bibtex/maremma.yml +97 -0
- data/spec/fixtures/vcr_cassettes/Bolognese_Codemeta/get_metadata_as_datacite_xml/maremma.yml +97 -0
- data/spec/fixtures/vcr_cassettes/Bolognese_Codemeta/get_metadata_as_schema_org_JSON/maremma.yml +97 -0
- data/spec/fixtures/vcr_cassettes/Bolognese_Crossref/authors_as_string/author.yml +930 -0
- data/spec/fixtures/vcr_cassettes/Bolognese_Crossref/authors_as_string/no_author.yml +930 -0
- data/spec/fixtures/vcr_cassettes/Bolognese_Crossref/authors_as_string/single_author.yml +930 -0
- data/spec/fixtures/vcr_cassettes/Bolognese_Crossref/authors_as_string/with_organization.yml +930 -0
- data/spec/fixtures/vcr_cassettes/Bolognese_Datacite/insert_person/creator_given_and_family_name.yml +173 -0
- data/spec/fixtures/vcr_cassettes/Bolognese_SchemaOrg/get_metadata_as_bibtex/with_data_citation.yml +653 -0
- data/spec/metadata_spec.rb +12 -2
- data/spec/schema_org_spec.rb +15 -1
- metadata +16 -2
- data/lib/bolognese/github.rb +0 -106
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: e529a85cd30e24af04203358d96f53dfe7c17526
|
4
|
+
data.tar.gz: 588daf5d103c64b25e4c06709dc6815c32f67587
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: b0d7078349cd7b70cf40e996099c1017b9dbf9487580236aa8c8fa974ef28dc61ad7508ccf827c4ee9ea0a7fdd9c51ba9fa9e37554ecb807ab17a7bca8ee9673
|
7
|
+
data.tar.gz: 2772cbe1d11e52aa3835279161e826552dc3ddda889109d460d8a79996f94202784b689ce65172a9ee0af08c2e65f51d8dbd99a3e01a152f86231e400e65f9f4
|
data/.gitignore
CHANGED
data/Gemfile.lock
CHANGED
data/README.md
CHANGED
@@ -868,6 +868,70 @@ bolognese https://blog.datacite.org/eating-your-own-dog-food -t bibtex
|
|
868
868
|
}
|
869
869
|
```
|
870
870
|
|
871
|
+
Convert Codemeta to schema.org/JSON-LD:
|
872
|
+
|
873
|
+
```
|
874
|
+
bolognese https://github.com/datacite/maremma
|
875
|
+
|
876
|
+
{
|
877
|
+
"@context":"http://schema.org",
|
878
|
+
"@type":"SoftwareSourceCode",
|
879
|
+
"@id":"https://doi.org/10.5438/qeg0-3gm3",
|
880
|
+
"url":"https://github.com/datacite/maremma",
|
881
|
+
"name":"Maremma: a Ruby library for simplified network calls",
|
882
|
+
"author":{
|
883
|
+
"@type":"person",
|
884
|
+
"@id":"http://orcid.org/0000-0003-0077-4738",
|
885
|
+
"name":"Martin Fenner"
|
886
|
+
},
|
887
|
+
"description":"Simplifies network calls, including json/xml parsing and error handling. Based on Faraday.",
|
888
|
+
"keywords":"faraday, excon, net/http",
|
889
|
+
"dateCreated":"2015-11-28",
|
890
|
+
"datePublished":"2017-02-24",
|
891
|
+
"dateModified":"2017-02-24",
|
892
|
+
"publisher":{
|
893
|
+
"@type":"Organization",
|
894
|
+
"name":"DataCite"
|
895
|
+
}
|
896
|
+
}
|
897
|
+
```
|
898
|
+
|
899
|
+
Convert Codemeta to DataCite XML:
|
900
|
+
|
901
|
+
```
|
902
|
+
bolognese https://github.com/datacite/maremma -t datacite
|
903
|
+
|
904
|
+
<?xml version="1.0" encoding="UTF-8"?>
|
905
|
+
<resource xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://datacite.org/schema/kernel-4" xsi:schemaLocation="http://datacite.org/schema/kernel-4 http://schema.datacite.org/meta/kernel-4/metadata.xsd">
|
906
|
+
<identifier identifierType="DOI">10.5438/qeg0-3gm3</identifier>
|
907
|
+
<creators>
|
908
|
+
<creator>
|
909
|
+
<creatorName>Martin Fenner</creatorName>
|
910
|
+
<nameIdentifier schemeURI="http://orcid.org/" nameIdentifierScheme="ORCID">http://orcid.org/0000-0003-0077-4738</nameIdentifier>
|
911
|
+
</creator>
|
912
|
+
</creators>
|
913
|
+
<titles>
|
914
|
+
<title>Maremma: a Ruby library for simplified network calls</title>
|
915
|
+
</titles>
|
916
|
+
<publisher>DataCite</publisher>
|
917
|
+
<publicationYear>2017</publicationYear>
|
918
|
+
<resourceType resourceTypeGeneral="Software">SoftwareSourceCode</resourceType>
|
919
|
+
<subjects>
|
920
|
+
<subject>faraday</subject>
|
921
|
+
<subject>excon</subject>
|
922
|
+
<subject>net/http</subject>
|
923
|
+
</subjects>
|
924
|
+
<dates>
|
925
|
+
<date dateType="Created">2015-11-28</date>
|
926
|
+
<date dateType="Issued">2017-02-24</date>
|
927
|
+
<date dateType="Updated">2017-02-24</date>
|
928
|
+
</dates>
|
929
|
+
<descriptions>
|
930
|
+
<description descriptionType="Abstract">Simplifies network calls, including json/xml parsing and error handling. Based on Faraday.</description>
|
931
|
+
</descriptions>
|
932
|
+
</resource>
|
933
|
+
```
|
934
|
+
|
871
935
|
## Development
|
872
936
|
|
873
937
|
We use rspec for unit testing:
|
@@ -58,5 +58,17 @@ module Bolognese
|
|
58
58
|
|
59
59
|
"http://orcid.org/" + name_identifier
|
60
60
|
end
|
61
|
+
|
62
|
+
def authors_as_string(authors)
|
63
|
+
Array.wrap(authors).map do |a|
|
64
|
+
if a["@type"] == "organization"
|
65
|
+
"{" + a["name"] + "}"
|
66
|
+
elsif a["familyName"].present?
|
67
|
+
[a["familyName"], a["givenName"]].join(", ")
|
68
|
+
else
|
69
|
+
a["name"]
|
70
|
+
end
|
71
|
+
end.join(" and ").presence
|
72
|
+
end
|
61
73
|
end
|
62
74
|
end
|
data/lib/bolognese/cli.rb
CHANGED
@@ -33,13 +33,14 @@ module Bolognese
|
|
33
33
|
from = options[:from] || find_from_format(id: id)
|
34
34
|
else
|
35
35
|
ext = File.extname(input)
|
36
|
-
|
36
|
+
filename = File.basename(input)
|
37
|
+
if %w(.bib .xml).include?(ext) || filename == "codemeta.json"
|
37
38
|
string = IO.read(input)
|
38
39
|
else
|
39
40
|
$stderr.puts "File type #{ext} not supported"
|
40
41
|
exit 1
|
41
42
|
end
|
42
|
-
from = options[:from] || find_from_format(string: string, ext: ext)
|
43
|
+
from = options[:from] || find_from_format(string: string, ext: ext, filename: filename)
|
43
44
|
end
|
44
45
|
|
45
46
|
to = options[:to] || "schema_org"
|
data/lib/bolognese/codemeta.rb
CHANGED
@@ -7,7 +7,7 @@ module Bolognese
|
|
7
7
|
if string.present?
|
8
8
|
@raw = string
|
9
9
|
elsif id.present?
|
10
|
-
response = Maremma.get(id,
|
10
|
+
response = Maremma.get(github_as_codemeta_url(id), raw: true)
|
11
11
|
@raw = response.body.fetch("data", nil)
|
12
12
|
end
|
13
13
|
end
|
@@ -64,8 +64,8 @@ module Bolognese
|
|
64
64
|
end
|
65
65
|
|
66
66
|
def author
|
67
|
-
|
68
|
-
array_unwrap(
|
67
|
+
arr = Array.wrap(metadata.fetch("agents", nil)).map { |a| a.slice("@type", "@id", "name") }
|
68
|
+
array_unwrap(arr)
|
69
69
|
end
|
70
70
|
|
71
71
|
def editor
|
data/lib/bolognese/crossref.rb
CHANGED
@@ -172,23 +172,23 @@ module Bolognese
|
|
172
172
|
|
173
173
|
def people(contributor_role)
|
174
174
|
person = bibliographic_metadata.dig("contributors", "person_name")
|
175
|
-
|
175
|
+
arr = Array.wrap(person).select { |a| a["contributor_role"] == contributor_role }.map do |a|
|
176
176
|
{ "@type" => "Person",
|
177
177
|
"@id" => parse_attributes(a["ORCID"]),
|
178
178
|
"givenName" => a["given_name"],
|
179
179
|
"familyName" => a["surname"] }.compact
|
180
180
|
end
|
181
|
-
array_unwrap(
|
181
|
+
array_unwrap(arr)
|
182
182
|
end
|
183
183
|
|
184
184
|
def funder
|
185
185
|
fundref = Array.wrap(program_metadata).find { |a| a["name"] == "fundref" } || {}
|
186
|
-
|
186
|
+
arr = Array.wrap(fundref.fetch("assertion", [])).select { |a| a["name"] == "fundgroup" }.map do |f|
|
187
187
|
{ "@type" => "Organization",
|
188
188
|
"@id" => normalize_id(f.dig("assertion", "assertion", "__content__")),
|
189
189
|
"name" => f.dig("assertion", "__content__").strip }.compact
|
190
190
|
end
|
191
|
-
array_unwrap(
|
191
|
+
array_unwrap(arr)
|
192
192
|
end
|
193
193
|
|
194
194
|
def date_published
|
data/lib/bolognese/datacite.rb
CHANGED
@@ -187,13 +187,13 @@ module Bolognese
|
|
187
187
|
end
|
188
188
|
|
189
189
|
def related_identifiers(relation_type)
|
190
|
-
|
190
|
+
arr = Array.wrap(metadata.dig("relatedIdentifiers", "relatedIdentifier"))
|
191
191
|
.select { |r| relation_type.split(" ").include?(r["relationType"]) && %w(DOI URL).include?(r["relatedIdentifierType"]) }
|
192
192
|
.map do |work|
|
193
193
|
{ "@type" => "CreativeWork",
|
194
194
|
"@id" => normalize_id(work["__content__"]) }
|
195
195
|
end
|
196
|
-
array_unwrap(
|
196
|
+
array_unwrap(arr)
|
197
197
|
end
|
198
198
|
|
199
199
|
def same_as
|
data/lib/bolognese/metadata.rb
CHANGED
@@ -28,11 +28,6 @@ module Bolognese
|
|
28
28
|
[page_start, page_end].compact.join("-").presence
|
29
29
|
end
|
30
30
|
|
31
|
-
def author_string
|
32
|
-
Array.wrap(author).map { |a| [a["familyName"], a["givenName"]].join(", ") }
|
33
|
-
.join(" and ").presence
|
34
|
-
end
|
35
|
-
|
36
31
|
def publisher_string
|
37
32
|
publisher.to_h.fetch("name", nil)
|
38
33
|
end
|
@@ -96,7 +91,7 @@ module Bolognese
|
|
96
91
|
bibtex_key: id,
|
97
92
|
doi: doi,
|
98
93
|
url: url,
|
99
|
-
author:
|
94
|
+
author: authors_as_string(author),
|
100
95
|
keywords: keywords,
|
101
96
|
language: language,
|
102
97
|
title: name,
|
data/lib/bolognese/schema_org.rb
CHANGED
@@ -62,13 +62,13 @@ module Bolognese
|
|
62
62
|
end
|
63
63
|
|
64
64
|
def author
|
65
|
-
|
66
|
-
array_unwrap(
|
65
|
+
arr = Array.wrap(metadata.fetch("author", nil)).map { |a| a.except("name") }
|
66
|
+
array_unwrap(arr)
|
67
67
|
end
|
68
68
|
|
69
69
|
def editor
|
70
|
-
|
71
|
-
array_unwrap(
|
70
|
+
arr = Array.wrap(metadata.fetch("editor", nil)).map { |a| a.except("name") }
|
71
|
+
array_unwrap(arr)
|
72
72
|
end
|
73
73
|
|
74
74
|
def description
|
data/lib/bolognese/utils.rb
CHANGED
@@ -1,11 +1,11 @@
|
|
1
1
|
module Bolognese
|
2
2
|
module Utils
|
3
3
|
|
4
|
-
def find_from_format(id: nil, string: nil, ext: nil)
|
4
|
+
def find_from_format(id: nil, string: nil, ext: nil, filename: nil)
|
5
5
|
if id.present?
|
6
6
|
find_from_format_by_id(id)
|
7
7
|
elsif string.present?
|
8
|
-
find_from_format_by_string(string, ext: ext)
|
8
|
+
find_from_format_by_string(string, ext: ext, filename: filename)
|
9
9
|
end
|
10
10
|
end
|
11
11
|
|
@@ -16,6 +16,8 @@ module Bolognese
|
|
16
16
|
get_doi_ra(id).fetch("id", nil)
|
17
17
|
elsif /\A(?:(http|https):\/\/orcid\.org\/)?(\d{4}-\d{4}-\d{4}-\d{3}[0-9X]+)\z/.match(id)
|
18
18
|
"orcid"
|
19
|
+
elsif /\A(http|https):\/\/github\.com\/(.+)\z/.match(id)
|
20
|
+
"codemeta"
|
19
21
|
else
|
20
22
|
"schema_org"
|
21
23
|
end
|
@@ -24,10 +26,12 @@ module Bolognese
|
|
24
26
|
def find_from_format_by_string(string, options={})
|
25
27
|
if options[:ext] == ".bib"
|
26
28
|
"bibtex"
|
27
|
-
elsif Maremma.from_xml(string).dig("doi_records", "doi_record", "crossref")
|
29
|
+
elsif options[:ext] == ".xml" && Maremma.from_xml(string).dig("doi_records", "doi_record", "crossref")
|
28
30
|
"crossref"
|
29
|
-
elsif Maremma.from_xml(string).dig("resource", "xmlns") == "http://datacite.org/schema/kernel-4"
|
31
|
+
elsif options[:ext] == ".xml" && Maremma.from_xml(string).dig("resource", "xmlns") == "http://datacite.org/schema/kernel-4"
|
30
32
|
"datacite"
|
33
|
+
elsif options[:filename] == "codemeta.json"
|
34
|
+
"codemeta"
|
31
35
|
end
|
32
36
|
end
|
33
37
|
|
@@ -36,6 +40,7 @@ module Bolognese
|
|
36
40
|
p = case from
|
37
41
|
when "crossref" then Crossref.new(id: id, string: string)
|
38
42
|
when "datacite" then Datacite.new(id: id, string: string, schema_version: options[:schema_version])
|
43
|
+
when "codemeta" then Codemeta.new(id: id, string: string)
|
39
44
|
when "bibtex" then Bibtex.new(string: string)
|
40
45
|
else SchemaOrg.new(id: id)
|
41
46
|
end
|
@@ -104,8 +109,49 @@ module Bolognese
|
|
104
109
|
end
|
105
110
|
|
106
111
|
def normalize_ids(list)
|
107
|
-
|
108
|
-
array_unwrap(
|
112
|
+
arr = Array.wrap(list).map { |url| url.merge("@id" => normalize_id(url["@id"])) }
|
113
|
+
array_unwrap(arr)
|
114
|
+
end
|
115
|
+
|
116
|
+
def github_from_url(url)
|
117
|
+
return {} unless /\Ahttps:\/\/github\.com\/(.+)(?:\/)?(.+)?(?:\/tree\/)?(.*)\z/.match(url)
|
118
|
+
words = URI.parse(url).path[1..-1].split('/')
|
119
|
+
|
120
|
+
{ owner: words[0],
|
121
|
+
repo: words[1],
|
122
|
+
release: words[3] }.compact
|
123
|
+
end
|
124
|
+
|
125
|
+
def github_repo_from_url(url)
|
126
|
+
github_from_url(url).fetch(:repo, nil)
|
127
|
+
end
|
128
|
+
|
129
|
+
def github_release_from_url(url)
|
130
|
+
github_from_url(url).fetch(:release, nil)
|
131
|
+
end
|
132
|
+
|
133
|
+
def github_owner_from_url(url)
|
134
|
+
github_from_url(url).fetch(:owner, nil)
|
135
|
+
end
|
136
|
+
|
137
|
+
def github_as_owner_url(url)
|
138
|
+
github_hash = github_from_url(url)
|
139
|
+
"https://github.com/#{github_hash[:owner]}" if github_hash[:owner].present?
|
140
|
+
end
|
141
|
+
|
142
|
+
def github_as_repo_url(url)
|
143
|
+
github_hash = github_from_url(url)
|
144
|
+
"https://github.com/#{github_hash[:owner]}/#{github_hash[:repo]}" if github_hash[:repo].present?
|
145
|
+
end
|
146
|
+
|
147
|
+
def github_as_release_url(url)
|
148
|
+
github_hash = github_from_url(url)
|
149
|
+
"https://github.com/#{github_hash[:owner]}/#{github_hash[:repo]}/tree/#{github_hash[:release]}" if github_hash[:release].present?
|
150
|
+
end
|
151
|
+
|
152
|
+
def github_as_codemeta_url(url)
|
153
|
+
github_hash = github_from_url(url)
|
154
|
+
"https://raw.githubusercontent.com/#{github_hash[:owner]}/#{github_hash[:repo]}/master/codemeta.json" if github_hash[:owner].present?
|
109
155
|
end
|
110
156
|
end
|
111
157
|
end
|
data/lib/bolognese/version.rb
CHANGED
@@ -0,0 +1,39 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
describe Bolognese::Crossref, vcr: true do
|
4
|
+
let(:id) { "https://doi.org/10.1371/journal.pone.0000030" }
|
5
|
+
|
6
|
+
subject { Bolognese::Crossref.new(id: id) }
|
7
|
+
|
8
|
+
context "authors_as_string" do
|
9
|
+
let(:author_with_organization) { [{"@type"=>"person",
|
10
|
+
"@id"=>"http://orcid.org/0000-0003-0077-4738",
|
11
|
+
"name"=>"Matt Jones"},
|
12
|
+
{"@type"=>"person",
|
13
|
+
"@id"=>"http://orcid.org/0000-0002-2192-403X",
|
14
|
+
"name"=>"Peter Slaughter"},
|
15
|
+
{"@type"=>"organization",
|
16
|
+
"@id"=>"http://orcid.org/0000-0002-3957-2474",
|
17
|
+
"name"=>"University of California, Santa Barbara"}] }
|
18
|
+
|
19
|
+
it "author" do
|
20
|
+
response = subject.authors_as_string(subject.author)
|
21
|
+
expect(response).to eq("Ralser, Markus and Heeren, Gino and Breitenbach, Michael and Lehrach, Hans and Krobitsch, Sylvia")
|
22
|
+
end
|
23
|
+
|
24
|
+
it "single author" do
|
25
|
+
response = subject.authors_as_string(subject.author.first)
|
26
|
+
expect(response).to eq("Ralser, Markus")
|
27
|
+
end
|
28
|
+
|
29
|
+
it "no author" do
|
30
|
+
response = subject.authors_as_string(nil)
|
31
|
+
expect(response).to be_nil
|
32
|
+
end
|
33
|
+
|
34
|
+
it "with organization" do
|
35
|
+
response = subject.authors_as_string(author_with_organization)
|
36
|
+
expect(response).to eq("Matt Jones and Peter Slaughter and {University of California, Santa Barbara}")
|
37
|
+
end
|
38
|
+
end
|
39
|
+
end
|
data/spec/cli_spec.rb
CHANGED
@@ -158,6 +158,29 @@ describe Bolognese::CLI do
|
|
158
158
|
end
|
159
159
|
end
|
160
160
|
|
161
|
+
context "codemeta" do
|
162
|
+
let(:file) { fixture_path + "codemeta.json" }
|
163
|
+
|
164
|
+
it 'default' do
|
165
|
+
expect { subject.convert file }.to output(/datePublished/).to_stdout
|
166
|
+
end
|
167
|
+
|
168
|
+
it 'to schema_org' do
|
169
|
+
subject.options = { to: "schema_org" }
|
170
|
+
expect { subject.convert file }.to output(/datePublished/).to_stdout
|
171
|
+
end
|
172
|
+
|
173
|
+
it 'to datacite' do
|
174
|
+
subject.options = { to: "datacite" }
|
175
|
+
expect { subject.convert file }.to output(/http:\/\/datacite.org\/schema\/kernel-4/).to_stdout
|
176
|
+
end
|
177
|
+
|
178
|
+
it 'to bibtex' do
|
179
|
+
subject.options = { to: "bibtex" }
|
180
|
+
expect { subject.convert file }.to output(/@misc{https:\/\/doi.org\/10.5063\/f1m61h5x/).to_stdout
|
181
|
+
end
|
182
|
+
end
|
183
|
+
|
161
184
|
# context "unsupported format" do
|
162
185
|
# let(:file) { fixture_path + "crossref.xxx" }
|
163
186
|
#
|
data/spec/codemeta_spec.rb
CHANGED
@@ -1,48 +1,54 @@
|
|
1
1
|
require 'spec_helper'
|
2
2
|
|
3
3
|
describe Bolognese::Codemeta, vcr: true do
|
4
|
-
# let(:id) { "https://blog.datacite.org/eating-your-own-dog-food" }
|
5
4
|
let(:fixture_path) { "spec/fixtures/" }
|
6
|
-
|
7
|
-
# subject { Bolognese::SchemaOrg.new(id: id) }
|
5
|
+
let(:id) { "https://github.com/datacite/maremma" }
|
8
6
|
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
|
24
|
-
|
25
|
-
|
26
|
-
|
27
|
-
|
28
|
-
|
29
|
-
|
30
|
-
|
31
|
-
|
32
|
-
|
33
|
-
|
34
|
-
|
35
|
-
|
36
|
-
|
37
|
-
|
38
|
-
|
7
|
+
subject { Bolognese::Codemeta.new(id: id) }
|
8
|
+
|
9
|
+
context "get metadata" do
|
10
|
+
it "maremma" do
|
11
|
+
expect(subject.id).to eq("https://doi.org/10.5438/qeg0-3gm3")
|
12
|
+
expect(subject.url).to eq("https://github.com/datacite/maremma")
|
13
|
+
expect(subject.type).to eq("SoftwareSourceCode")
|
14
|
+
expect(subject.author).to eq("@id"=>"http://orcid.org/0000-0003-0077-4738", "@type"=>"person", "name"=>"Martin Fenner")
|
15
|
+
expect(subject.name).to eq("Maremma: a Ruby library for simplified network calls")
|
16
|
+
expect(subject.description).to start_with("Simplifies network calls")
|
17
|
+
expect(subject.keywords).to eq("faraday, excon, net/http")
|
18
|
+
expect(subject.date_created).to eq("2015-11-28")
|
19
|
+
expect(subject.date_published).to eq("2017-02-24")
|
20
|
+
expect(subject.date_modified).to eq("2017-02-24")
|
21
|
+
expect(subject.publisher).to eq("@type"=>"Organization", "name"=>"DataCite")
|
22
|
+
end
|
23
|
+
|
24
|
+
it "maremma schema.org JSON" do
|
25
|
+
json = JSON.parse(subject.as_schema_org)
|
26
|
+
expect(json["@id"]).to eq("https://doi.org/10.5438/qeg0-3gm3")
|
27
|
+
expect(json["name"]).to eq("Maremma: a Ruby library for simplified network calls")
|
28
|
+
expect(json["author"]).to eq("@type"=>"person", "@id"=>"http://orcid.org/0000-0003-0077-4738", "name"=>"Martin Fenner")
|
29
|
+
end
|
30
|
+
|
31
|
+
it "no codemeta.json" do
|
32
|
+
id = "https://github.com/datacite/homepage"
|
33
|
+
subject = Bolognese::Codemeta.new(id: id)
|
34
|
+
expect(subject.id).to be_nil
|
35
|
+
expect(subject.exists?).to be false
|
36
|
+
end
|
37
|
+
|
38
|
+
it "not found error" do
|
39
|
+
id = "https://github.com/datacite/x"
|
40
|
+
subject = Bolognese::Codemeta.new(id: id)
|
41
|
+
expect(subject.id).to be_nil
|
42
|
+
expect(subject.exists?).to be false
|
43
|
+
end
|
44
|
+
end
|
39
45
|
|
40
46
|
context "get metadata as string" do
|
41
47
|
let(:string) { IO.read(fixture_path + 'codemeta.json') }
|
42
48
|
|
43
49
|
subject { Bolognese::Codemeta.new(string: string) }
|
44
50
|
|
45
|
-
it "
|
51
|
+
it "rdataone" do
|
46
52
|
expect(subject.id).to eq("https://doi.org/10.5063/f1m61h5x")
|
47
53
|
expect(subject.url).to eq("https://github.com/DataONEorg/rdataone")
|
48
54
|
expect(subject.type).to eq("SoftwareSourceCode")
|
@@ -53,7 +59,6 @@ describe Bolognese::Codemeta, vcr: true do
|
|
53
59
|
"@id"=>"http://orcid.org/0000-0002-2192-403X",
|
54
60
|
"name"=>"Peter Slaughter"},
|
55
61
|
{"@type"=>"organization",
|
56
|
-
"@id"=>"http://orcid.org/0000-0002-3957-2474",
|
57
62
|
"name"=>"University of California, Santa Barbara"}])
|
58
63
|
expect(subject.name).to eq("R Interface to the DataONE REST API")
|
59
64
|
expect(subject.description).to start_with("Provides read and write access to data and metadata")
|
@@ -64,18 +69,93 @@ describe Bolognese::Codemeta, vcr: true do
|
|
64
69
|
expect(subject.date_modified).to eq("2016-05-27")
|
65
70
|
expect(subject.publisher).to eq("@type"=>"Organization", "name"=>"https://cran.r-project.org")
|
66
71
|
end
|
72
|
+
|
73
|
+
it "maremma" do
|
74
|
+
string = IO.read(fixture_path + 'maremma/codemeta.json')
|
75
|
+
subject = Bolognese::Codemeta.new(string: string)
|
76
|
+
expect(subject.id).to eq("https://doi.org/10.5438/qeg0-3gm3")
|
77
|
+
expect(subject.url).to eq("https://github.com/datacite/maremma")
|
78
|
+
expect(subject.type).to eq("SoftwareSourceCode")
|
79
|
+
expect(subject.author).to eq("@id"=>"http://orcid.org/0000-0003-0077-4738", "@type"=>"person", "name"=>"Martin Fenner")
|
80
|
+
expect(subject.name).to eq("Maremma: a Ruby library for simplified network calls")
|
81
|
+
expect(subject.description).to start_with("Simplifies network calls")
|
82
|
+
expect(subject.keywords).to eq("faraday, excon, net/http")
|
83
|
+
expect(subject.date_created).to eq("2015-11-28")
|
84
|
+
expect(subject.date_published).to eq("2017-02-24")
|
85
|
+
expect(subject.date_modified).to eq("2017-02-24")
|
86
|
+
expect(subject.publisher).to eq("@type"=>"Organization", "name"=>"DataCite")
|
87
|
+
end
|
67
88
|
end
|
68
89
|
|
69
90
|
context "get metadata as datacite xml" do
|
70
|
-
|
71
|
-
|
72
|
-
|
73
|
-
|
74
|
-
it "SoftwareSourceCode" do
|
91
|
+
it "rdataone" do
|
92
|
+
string = IO.read(fixture_path + 'codemeta.json')
|
93
|
+
subject = Bolognese::Codemeta.new(string: string)
|
75
94
|
expect(subject.validation_errors).to be_empty
|
76
95
|
datacite = Maremma.from_xml(subject.as_datacite).fetch("resource", {})
|
77
96
|
expect(datacite.dig("titles", "title")).to eq("R Interface to the DataONE REST API")
|
97
|
+
expect(datacite.dig("creators", "creator")).to eq([{"creatorName"=>"Matt Jones",
|
98
|
+
"nameIdentifier"=>
|
99
|
+
{"schemeURI"=>"http://orcid.org/",
|
100
|
+
"nameIdentifierScheme"=>"ORCID",
|
101
|
+
"__content__"=>"http://orcid.org/0000-0003-0077-4738"}},
|
102
|
+
{"creatorName"=>"Peter Slaughter",
|
103
|
+
"nameIdentifier"=>
|
104
|
+
{"schemeURI"=>"http://orcid.org/",
|
105
|
+
"nameIdentifierScheme"=>"ORCID",
|
106
|
+
"__content__"=>"http://orcid.org/0000-0002-2192-403X"}},
|
107
|
+
{"creatorName"=>"University of California, Santa Barbara"}])
|
78
108
|
expect(datacite.fetch("version")).to eq("2.0.0")
|
79
109
|
end
|
110
|
+
|
111
|
+
it "maremma" do
|
112
|
+
expect(subject.validation_errors).to be_empty
|
113
|
+
datacite = Maremma.from_xml(subject.as_datacite).fetch("resource", {})
|
114
|
+
expect(datacite.dig("titles", "title")).to eq("Maremma: a Ruby library for simplified network calls")
|
115
|
+
expect(datacite.dig("creators", "creator")).to eq("creatorName"=>"Martin Fenner", "nameIdentifier"=>{"schemeURI"=>"http://orcid.org/", "nameIdentifierScheme"=>"ORCID", "__content__"=>"http://orcid.org/0000-0003-0077-4738"})
|
116
|
+
end
|
117
|
+
end
|
118
|
+
|
119
|
+
context "get metadata as schema.org JSON" do
|
120
|
+
it "rdataone" do
|
121
|
+
string = IO.read(fixture_path + 'codemeta.json')
|
122
|
+
subject = Bolognese::Codemeta.new(string: string)
|
123
|
+
json = JSON.parse(subject.as_schema_org)
|
124
|
+
expect(json["@id"]).to eq("https://doi.org/10.5063/f1m61h5x")
|
125
|
+
expect(json["@type"]).to eq("SoftwareSourceCode")
|
126
|
+
expect(json["name"]).to eq("R Interface to the DataONE REST API")
|
127
|
+
expect(json["author"]).to eq([{"@type"=>"person",
|
128
|
+
"@id"=>"http://orcid.org/0000-0003-0077-4738",
|
129
|
+
"name"=>"Matt Jones"},
|
130
|
+
{"@type"=>"person",
|
131
|
+
"@id"=>"http://orcid.org/0000-0002-2192-403X",
|
132
|
+
"name"=>"Peter Slaughter"},
|
133
|
+
{"@type"=>"organization",
|
134
|
+
"name"=>"University of California, Santa Barbara"}])
|
135
|
+
expect(json["version"]).to eq("2.0.0")
|
136
|
+
end
|
137
|
+
|
138
|
+
it "maremma" do
|
139
|
+
json = JSON.parse(subject.as_schema_org)
|
140
|
+
expect(json["@id"]).to eq("https://doi.org/10.5438/qeg0-3gm3")
|
141
|
+
expect(json["@type"]).to eq("SoftwareSourceCode")
|
142
|
+
expect(json["name"]).to eq("Maremma: a Ruby library for simplified network calls")
|
143
|
+
expect(json["author"]).to eq("@type"=>"person", "@id"=>"http://orcid.org/0000-0003-0077-4738", "name"=>"Martin Fenner")
|
144
|
+
end
|
145
|
+
end
|
146
|
+
|
147
|
+
context "get metadata as bibtex" do
|
148
|
+
it "maremma" do
|
149
|
+
bibtex = BibTeX.parse(subject.as_bibtex).to_a(quotes: '').first
|
150
|
+
expect(bibtex[:bibtex_type].to_s).to eq("misc")
|
151
|
+
expect(bibtex[:bibtex_key]).to eq("https://doi.org/10.5438/qeg0-3gm3")
|
152
|
+
expect(bibtex[:doi]).to eq("10.5438/qeg0-3gm3")
|
153
|
+
expect(bibtex[:url]).to eq("https://github.com/datacite/maremma")
|
154
|
+
expect(bibtex[:title]).to eq("Maremma: a Ruby library for simplified network calls")
|
155
|
+
expect(bibtex[:author]).to eq("Fenner, Martin")
|
156
|
+
expect(bibtex[:publisher]).to eq("DataCite")
|
157
|
+
expect(bibtex[:keywords]).to eq("faraday, excon, net/http")
|
158
|
+
expect(bibtex[:year]).to eq("2017")
|
159
|
+
end
|
80
160
|
end
|
81
161
|
end
|