cirneco 0.5.7 → 0.5.8
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/.gitignore +3 -0
- data/.travis.yml +6 -3
- data/Gemfile.lock +5 -6
- data/cirneco.gemspec +1 -1
- data/lib/cirneco/utils.rb +65 -15
- data/lib/cirneco/version.rb +1 -1
- data/lib/cirneco/work.rb +50 -52
- data/spec/api_spec.rb +12 -11
- data/spec/fixtures/apa.csl +621 -0
- data/spec/fixtures/authors.yml +19 -0
- data/spec/fixtures/references.bib +506 -0
- data/spec/fixtures/site.yml +7 -0
- data/spec/utils_spec.rb +23 -0
- data/spec/work_spec.rb +13 -11
- metadata +8 -5
- data/0006.xml +0 -78
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: bc53bd40a384ab3df63764308d8f6267f230975a
|
4
|
+
data.tar.gz: 8596911b41e4513f9c947c0cb0b2a345d57e2a8d
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 508aeb634c7e6b5af2cb88ee30e6f9b031ca85456f02b237c497050b5ac34f608c04a0f694b9507c577f0859b802fe012f36e8939fd3037c7aee3c22e739b43b
|
7
|
+
data.tar.gz: bfccc96e67b81775f5747bf00d89d71537d4d1c3d4e73c27401ecb2bd48d330a0de047c03a0ce5b85d92a8d7f8058416ea707b6d7382da6548532d99ef9b0cd5
|
data/.gitignore
CHANGED
data/.travis.yml
CHANGED
@@ -3,9 +3,12 @@ rvm:
|
|
3
3
|
- 2.3.1
|
4
4
|
|
5
5
|
before_install:
|
6
|
-
|
7
|
-
|
8
|
-
|
6
|
+
- wget https://github.com/jgm/pandoc/releases/download/1.15.2/pandoc-1.15.2-1-amd64.deb
|
7
|
+
- sudo dpkg -i pandoc-1.15.2-1-amd64.deb
|
8
|
+
- rm pandoc-1.15.2-1-amd64.deb
|
9
|
+
- sudo add-apt-repository ppa:kalakris/cmake -y
|
10
|
+
- sudo apt-get update -q
|
11
|
+
- sudo apt-get install cmake -y
|
9
12
|
|
10
13
|
install:
|
11
14
|
- travis_retry bundle install
|
data/Gemfile.lock
CHANGED
@@ -1,10 +1,10 @@
|
|
1
1
|
PATH
|
2
2
|
remote: .
|
3
3
|
specs:
|
4
|
-
cirneco (0.5.
|
4
|
+
cirneco (0.5.8)
|
5
5
|
activesupport (~> 4.2, >= 4.2.5)
|
6
6
|
base32-crockford-checksum (~> 0.2.2)
|
7
|
-
bergamasco (~> 0.
|
7
|
+
bergamasco (~> 0.2)
|
8
8
|
builder (~> 3.2, >= 3.2.2)
|
9
9
|
dotenv (~> 2.1, >= 2.1.1)
|
10
10
|
maremma (~> 3.1)
|
@@ -20,11 +20,11 @@ GEM
|
|
20
20
|
minitest (~> 5.1)
|
21
21
|
thread_safe (~> 0.3, >= 0.3.4)
|
22
22
|
tzinfo (~> 1.1)
|
23
|
-
addressable (2.
|
24
|
-
public_suffix (~> 2.0, >= 2.0.2)
|
23
|
+
addressable (2.3.8)
|
25
24
|
base32-crockford-checksum (0.2.3)
|
26
|
-
bergamasco (0.
|
25
|
+
bergamasco (0.2.3)
|
27
26
|
activesupport (~> 4.2, >= 4.2.5)
|
27
|
+
addressable (~> 2.3.8)
|
28
28
|
builder (~> 3.2, >= 3.2.2)
|
29
29
|
commonmarker (~> 0.14.0)
|
30
30
|
loofah (~> 2.0, >= 2.0.3)
|
@@ -73,7 +73,6 @@ GEM
|
|
73
73
|
mini_portile2 (~> 2.1.0)
|
74
74
|
oj (2.13.1)
|
75
75
|
pandoc-ruby (2.0.1)
|
76
|
-
public_suffix (2.0.4)
|
77
76
|
rack (2.0.1)
|
78
77
|
rack-test (0.6.3)
|
79
78
|
rack (>= 1.0)
|
data/cirneco.gemspec
CHANGED
@@ -16,7 +16,7 @@ Gem::Specification.new do |s|
|
|
16
16
|
|
17
17
|
# Declary dependencies here, rather than in the Gemfile
|
18
18
|
s.add_dependency 'maremma', '~> 3.1'
|
19
|
-
s.add_dependency 'bergamasco', '~> 0.
|
19
|
+
s.add_dependency 'bergamasco', '~> 0.2'
|
20
20
|
s.add_dependency 'base32-crockford-checksum', '~> 0.2.2'
|
21
21
|
s.add_dependency 'nokogiri', '~> 1.6', '>= 1.6.8'
|
22
22
|
s.add_dependency 'builder', '~> 3.2', '>= 3.2.2'
|
data/lib/cirneco/utils.rb
CHANGED
@@ -57,8 +57,6 @@ module Cirneco
|
|
57
57
|
"DOI removed from #{filename}"
|
58
58
|
elsif updated_file != file
|
59
59
|
"DOI #{doi} added to #{filename}"
|
60
|
-
else
|
61
|
-
"DOI #{doi} found in #{filename}"
|
62
60
|
end
|
63
61
|
end
|
64
62
|
|
@@ -68,26 +66,78 @@ module Cirneco
|
|
68
66
|
end.join("\n")
|
69
67
|
end
|
70
68
|
|
71
|
-
def
|
72
|
-
|
69
|
+
def generate_metadata_for_work(filepath, options={})
|
70
|
+
metadata = Bergamasco::Markdown.read_yaml_for_doi_metadata(filepath, options.except(:number))
|
71
|
+
|
72
|
+
return "Error: required metadata missing" unless ["author", "title", "date", "summary"].all? { |k| metadata.key? k }
|
73
|
+
|
74
|
+
# read in optional yaml configuration file for site
|
75
|
+
sitepath = options[:sitepath] || ENV['SITE_SITEPATH']
|
76
|
+
site_options = sitepath.present? ? Bergamasco::Markdown.read_yaml(sitepath) : {}
|
77
|
+
|
78
|
+
# read in optional yaml configuration file for authors
|
79
|
+
authorpath = options[:authorpath] || ENV['SITE_AUTHORPATH']
|
80
|
+
author_options = authorpath.present? ? Bergamasco::Markdown.read_yaml(authorpath) : {}
|
81
|
+
|
82
|
+
# required metadata
|
83
|
+
prefix = options[:prefix] || ENV['PREFIX']
|
84
|
+
metadata["doi"] ||= encode_doi(prefix, options)
|
85
|
+
|
86
|
+
site_url = site_options["site_url"] || ENV['SITE_URL']
|
87
|
+
metadata["url"] ||= url_from_path(site_url, filepath)
|
88
|
+
|
89
|
+
metadata["creators"] = Array(metadata["author"]).map do |a|
|
90
|
+
author = author_options.fetch(a, {})
|
91
|
+
if author.present?
|
92
|
+
{ given_name: author["given"],
|
93
|
+
family_name: author["family"],
|
94
|
+
orcid: author["orcid"] }
|
95
|
+
else
|
96
|
+
{ literal: a }
|
97
|
+
end
|
98
|
+
end
|
99
|
+
|
100
|
+
metadata["publisher"] = site_options["site_title"] || ENV['SITE_TITLE']
|
101
|
+
metadata["publication_year"] = metadata["date"][0..3].to_i
|
102
|
+
|
103
|
+
metadata["type"] ||= site_options["site_default_type"] || ENV['SITE_DEFAULT_TYPE'] || "BlogPosting"
|
104
|
+
resource_type_general = metadata["type"] == "Dataset" ? "Dataset" : "Text"
|
105
|
+
|
106
|
+
metadata["resource_type"] = { value: metadata["type"],
|
107
|
+
resource_type_general: resource_type_general }
|
108
|
+
|
109
|
+
# recommended metadata
|
110
|
+
metadata["descriptions"] = [{ value: metadata["summary"],
|
111
|
+
description_type: "Abstract" }]
|
73
112
|
|
74
|
-
|
113
|
+
# use default version 1.0
|
114
|
+
metadata["version"] ||= "1.0"
|
75
115
|
|
76
|
-
|
77
|
-
|
116
|
+
license_name = site_options.fetch("license", {}).fetch("name", nil) || ENV['SITE_LICENCE_NAME'] || "Creative Commons Attribution"
|
117
|
+
license_url = site_options.fetch("license", {}).fetch("url", nil) || ENV['SITE_LICENCE_URL'] || "https://creativecommons.org/licenses/by/4.0/"
|
118
|
+
metadata["rights_list"] = [{ value: license_name, rights_uri: license_url }]
|
78
119
|
|
79
|
-
|
80
|
-
resource_type_general = resource_type == "Dataset" ? "Dataset" : "Text"
|
120
|
+
metadata["subjects"] = Array(metadata["tags"]).select { |t| t != "featured" }
|
81
121
|
|
82
|
-
|
83
|
-
|
122
|
+
contributor = site_options["site_institution"] || ENV['SITE_INSTITUTION']
|
123
|
+
metadata["contributors"] = [{ literal: contributor, contributor_type: "HostingInstitution" }]
|
124
|
+
|
125
|
+
metadata = metadata.extract!(*%w(doi url creators title publisher
|
126
|
+
publication_year resource_type descriptions version rights_list subjects contributors
|
127
|
+
related_identifiers))
|
128
|
+
end
|
129
|
+
|
130
|
+
def url_from_path(site_url, filepath)
|
131
|
+
site_url.to_s.chomp("\\") + "/" + File.basename(filepath)[0..-9] + "/"
|
132
|
+
end
|
84
133
|
|
85
|
-
|
134
|
+
def create_work_from_metadata(metadata, options={})
|
135
|
+
work = Cirneco::Work.new(metadata)
|
86
136
|
|
87
|
-
|
88
|
-
|
137
|
+
filename = metadata["doi"].split("/", 2).last + ".xml"
|
138
|
+
IO.write(filename, work.data)
|
89
139
|
|
90
|
-
|
140
|
+
work
|
91
141
|
end
|
92
142
|
end
|
93
143
|
end
|
data/lib/cirneco/version.rb
CHANGED
data/lib/cirneco/work.rb
CHANGED
@@ -11,26 +11,27 @@ module Cirneco
|
|
11
11
|
include Cirneco::Api
|
12
12
|
include Cirneco::Utils
|
13
13
|
|
14
|
-
attr_accessor :doi, :creators, :title, :publisher, :publication_year, :resource_type, :version, :related_identifiers, :rights_list, :descriptions, :
|
14
|
+
attr_accessor :doi, :url, :creators, :title, :publisher, :publication_year, :resource_type, :version, :related_identifiers, :rights_list, :descriptions, :contributors, :subjects, :media, :username, :password, :validation_errors
|
15
|
+
|
16
|
+
def initialize(metadata, **options)
|
17
|
+
@doi = metadata.fetch("doi", nil)
|
18
|
+
@url = metadata.fetch("url", nil)
|
19
|
+
@creators = metadata.fetch("creators", nil)
|
20
|
+
@title = metadata.fetch("title", nil)
|
21
|
+
@publisher = metadata.fetch("publisher", nil)
|
22
|
+
@publication_year = metadata.fetch("publication_year", nil)
|
23
|
+
@resource_type = metadata.fetch("resource_type", nil)
|
24
|
+
@version = metadata.fetch("version", nil)
|
25
|
+
@rights_list = metadata.fetch("rights_list", nil)
|
26
|
+
@subjects = metadata.fetch("subjects", nil)
|
27
|
+
@descriptions = metadata.fetch("descriptions", nil)
|
28
|
+
@contributors = metadata.fetch("contributors", nil)
|
29
|
+
@related_identifiers = metadata.fetch("related_identifiers", nil)
|
15
30
|
|
16
|
-
def initialize(doi:, creators:, title:, publisher:, publication_year:, resource_type:, **options)
|
17
|
-
@doi = doi
|
18
|
-
@creators = creators
|
19
|
-
@title = title
|
20
|
-
@publisher = publisher
|
21
|
-
@publication_year = publication_year
|
22
|
-
@resource_type = resource_type
|
23
|
-
|
24
|
-
@url = options.fetch(:url, nil)
|
25
31
|
@media = options.fetch(:media, nil)
|
26
32
|
|
27
33
|
@username = options.fetch(:username, nil)
|
28
34
|
@password = options.fetch(:password, nil)
|
29
|
-
|
30
|
-
@version = options.fetch(:version, nil)
|
31
|
-
@rights_list = options.fetch(:rights_list, nil)
|
32
|
-
@descriptions = options.fetch(:descriptions, nil)
|
33
|
-
@related_identifiers = options.fetch(:related_identifiers, nil)
|
34
35
|
end
|
35
36
|
|
36
37
|
SCHEMA = File.expand_path("../../../resources/kernel-4.0/metadata.xsd", __FILE__)
|
@@ -55,8 +56,10 @@ module Cirneco
|
|
55
56
|
insert_titles(xml)
|
56
57
|
insert_publisher(xml)
|
57
58
|
insert_publication_year(xml)
|
58
|
-
insert_subjects(xml)
|
59
59
|
insert_resource_type(xml)
|
60
|
+
insert_subjects(xml)
|
61
|
+
insert_contributors(xml)
|
62
|
+
insert_related_identifiers(xml)
|
60
63
|
insert_version(xml)
|
61
64
|
insert_rights_list(xml)
|
62
65
|
insert_descriptions(xml)
|
@@ -69,22 +72,35 @@ module Cirneco
|
|
69
72
|
def insert_creators(xml)
|
70
73
|
return nil unless creators.present?
|
71
74
|
|
72
|
-
xml.
|
75
|
+
xml.creators do
|
73
76
|
creators.each do |creator|
|
74
77
|
xml.creator do
|
75
|
-
|
78
|
+
insert_person(xml, creator, "creator")
|
76
79
|
end
|
77
80
|
end
|
78
81
|
end
|
79
82
|
end
|
80
83
|
|
81
|
-
def
|
82
|
-
|
84
|
+
def insert_contributors(xml)
|
85
|
+
return nil unless contributors.present?
|
83
86
|
|
84
|
-
xml.
|
85
|
-
|
86
|
-
|
87
|
-
|
87
|
+
xml.contributors do
|
88
|
+
contributors.each do |contributor|
|
89
|
+
xml.contributor("contributorType" => contributor[:contributor_type]) do
|
90
|
+
insert_person(xml, contributor, "contributor")
|
91
|
+
end
|
92
|
+
end
|
93
|
+
end
|
94
|
+
end
|
95
|
+
|
96
|
+
def insert_person(xml, person, type)
|
97
|
+
person_name = [person[:family_name], person[:given_name], person[:literal]].compact.join(", ")
|
98
|
+
|
99
|
+
xml.send(:'creatorName', person_name) if type == "creator"
|
100
|
+
xml.send(:'contributorName', person_name) if type == "contributor"
|
101
|
+
xml.send(:'givenName', person[:given_name]) if person[:given_name].present?
|
102
|
+
xml.send(:'familyName', person[:family_name]) if person[:family_name].present?
|
103
|
+
xml.nameIdentifier(person[:orcid], 'schemeURI' => 'http://orcid.org/', 'nameIdentifierScheme' => 'ORCID') if person[:orcid].present?
|
88
104
|
end
|
89
105
|
|
90
106
|
def insert_titles(xml)
|
@@ -125,6 +141,16 @@ module Cirneco
|
|
125
141
|
xml.version(version)
|
126
142
|
end
|
127
143
|
|
144
|
+
def insert_related_identifiers(xml)
|
145
|
+
return xml unless related_identifiers.present?
|
146
|
+
|
147
|
+
xml.relatedIdentifiers do
|
148
|
+
related_identifiers.each do |related_identifier|
|
149
|
+
xml.relatedIdentifier(related_identifier[:value], 'relatedIdentifierType' => related_identifier[:related_identifier_type], 'relationType' => related_identifier[:relation_type])
|
150
|
+
end
|
151
|
+
end
|
152
|
+
end
|
153
|
+
|
128
154
|
def insert_rights_list(xml)
|
129
155
|
return xml unless rights_list.present?
|
130
156
|
|
@@ -145,34 +171,6 @@ module Cirneco
|
|
145
171
|
end
|
146
172
|
end
|
147
173
|
|
148
|
-
def insert_contributors(xml)
|
149
|
-
return nil unless contributors.present?
|
150
|
-
|
151
|
-
xml.send(:'work:contributors') do
|
152
|
-
contributors.each do |contributor|
|
153
|
-
xml.contributor do
|
154
|
-
insert_contributor(xml, contributor)
|
155
|
-
end
|
156
|
-
end
|
157
|
-
end
|
158
|
-
end
|
159
|
-
|
160
|
-
def insert_contributor(xml, contributor)
|
161
|
-
if contributor[:orcid].present?
|
162
|
-
xml.send(:'common:contributor-orcid') do
|
163
|
-
xml.send(:'common:uri', contributor[:orcid])
|
164
|
-
xml.send(:'common:path', contributor[:orcid][17..-1])
|
165
|
-
xml.send(:'common:host', 'orcid.org')
|
166
|
-
end
|
167
|
-
end
|
168
|
-
xml.send(:'credit-name', contributor[:credit_name])
|
169
|
-
if contributor[:role]
|
170
|
-
xml.send(:'contributor-attributes') do
|
171
|
-
xml.send(:'contributor-role', contributor[:role])
|
172
|
-
end
|
173
|
-
end
|
174
|
-
end
|
175
|
-
|
176
174
|
def without_control(s)
|
177
175
|
r = ''
|
178
176
|
s.each_codepoint do |c|
|
data/spec/api_spec.rb
CHANGED
@@ -2,12 +2,19 @@ require 'spec_helper'
|
|
2
2
|
|
3
3
|
describe Cirneco::Work, vcr: true, :order => :defined do
|
4
4
|
let(:doi) { "10.23725/0000-03VC" }
|
5
|
+
let(:url) { "http://www.datacite.org" }
|
5
6
|
let(:creators) { [{ given_name: "Elizabeth", family_name: "Miller", orcid: "0000-0001-5000-0007", affiliation: "DataCite" }] }
|
6
7
|
let(:title) { "Full DataCite XML Example" }
|
7
8
|
let(:publisher) { "DataCite" }
|
8
9
|
let(:publication_year) { 2014 }
|
9
10
|
let(:resource_type) { { value: "XML", resource_type_general: "Software" } }
|
10
|
-
let(:
|
11
|
+
let(:metadata) { { "doi" => doi,
|
12
|
+
"url" => url,
|
13
|
+
"creators" => creators,
|
14
|
+
"title" => title,
|
15
|
+
"publisher" => publisher,
|
16
|
+
"publication_year" => publication_year,
|
17
|
+
"resource_type" => resource_type } }
|
11
18
|
let(:media) { [{ mime_type: "application/pdf", url:"http://www.datacite.org/cirneco-test.pdf" }]}
|
12
19
|
let(:username) { ENV['MDS_USERNAME'] }
|
13
20
|
let(:password) { ENV['MDS_PASSWORD'] }
|
@@ -15,16 +22,10 @@ describe Cirneco::Work, vcr: true, :order => :defined do
|
|
15
22
|
let(:fixture_path) { "spec/fixtures/" }
|
16
23
|
let(:samples_path) { "resources/kernel-4.0/samples/" }
|
17
24
|
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
publication_year: publication_year,
|
23
|
-
resource_type: resource_type,
|
24
|
-
url: url,
|
25
|
-
media: media,
|
26
|
-
username: username,
|
27
|
-
password: password) }
|
25
|
+
subject { Cirneco::Work.new(metadata,
|
26
|
+
media: media,
|
27
|
+
username: username,
|
28
|
+
password: password) }
|
28
29
|
|
29
30
|
describe "Metadata API" do
|
30
31
|
describe "get" do
|