Module: Bolognese::DataciteUtils

Included in:
Metadata
Defined in:
lib/bolognese/datacite_utils.rb

Instance Method Summary collapse

Instance Method Details

#datacite_errors(xml: nil, schema_version: nil) ⇒ Object



11
12
13
14
15
16
17
18
19
20
# File 'lib/bolognese/datacite_utils.rb', line 11

def datacite_errors(xml: nil, schema_version: nil)
  schema_version ||= "http://datacite.org/schema/kernel-4"
  kernel = schema_version.to_s.split("/").last
  filepath = File.expand_path("../../../resources/#{kernel}/metadata.xsd", __FILE__)
  schema = Nokogiri::XML::Schema(open(filepath))

  schema.validate(Nokogiri::XML(xml, nil, 'UTF-8')).map { |error| error.to_s }.unwrap
rescue Nokogiri::XML::SyntaxError => e
  e.message
end

#datacite_xmlObject



3
4
5
6
7
8
9
# File 'lib/bolognese/datacite_utils.rb', line 3

def datacite_xml
  @datacite_xml ||= Nokogiri::XML::Builder.new(:encoding => 'UTF-8') do |xml|
    xml.resource(root_attributes) do
      insert_work(xml)
    end
  end.to_xml
end

#insert_alternate_identifiers(xml) ⇒ Object



105
106
107
108
109
110
111
112
113
# File 'lib/bolognese/datacite_utils.rb', line 105

def insert_alternate_identifiers(xml)
  return xml unless alternate_name.present?

  xml.alternateIdentifiers do
    Array.wrap(alternate_name).each do |alt|
      xml.alternateIdentifier(alt["name"], 'alternateIdentifierType' => alt["type"])
    end
  end
end

#insert_contributors(xml) ⇒ Object



54
55
56
57
58
59
60
61
62
63
64
# File 'lib/bolognese/datacite_utils.rb', line 54

def insert_contributors(xml)
  return xml unless editor.present?

  xml.contributors do
    Array.wrap(editor).each do |contributor|
      xml.contributor("contributorType" => "Editor") do
        insert_person(xml, contributor, "contributor")
      end
    end
  end
end

#insert_creators(xml) ⇒ Object



44
45
46
47
48
49
50
51
52
# File 'lib/bolognese/datacite_utils.rb', line 44

def insert_creators(xml)
  xml.creators do
    Array.wrap(author).each do |creator|
      xml.creator do
        insert_person(xml, creator, "creator")
      end
    end
  end
end

#insert_date(xml, date, date_type) ⇒ Object



123
124
125
# File 'lib/bolognese/datacite_utils.rb', line 123

def insert_date(xml, date, date_type)
  xml.date(date, 'dateType' => date_type)
end

#insert_dates(xml) ⇒ Object



115
116
117
118
119
120
121
# File 'lib/bolognese/datacite_utils.rb', line 115

def insert_dates(xml)
  xml.dates do
    insert_date(xml, date_created, 'Created') if date_created.present?
    insert_date(xml, date_published, 'Issued') if date_published.present?
    insert_date(xml, date_modified, 'Updated') if date_modified.present?
  end
end

#insert_descriptions(xml) ⇒ Object



191
192
193
194
195
196
197
198
199
# File 'lib/bolognese/datacite_utils.rb', line 191

def insert_descriptions(xml)
  return xml unless description.present?

  xml.descriptions do
    Array.wrap(description).each do |des|
      xml.description(des["text"], 'descriptionType' => des["type"] || "Abstract")
    end
  end
end

#insert_funding_reference(xml, funding_reference) ⇒ Object



139
140
141
142
# File 'lib/bolognese/datacite_utils.rb', line 139

def insert_funding_reference(xml, funding_reference)
  xml.funderName(funding_reference["name"]) if funding_reference["name"].present?
  xml.funderIdentifier(funding_reference["id"], "funderIdentifierType" => "Crossref Funder ID") if funding_reference["id"].present?
end

#insert_funding_references(xml) ⇒ Object



127
128
129
130
131
132
133
134
135
136
137
# File 'lib/bolognese/datacite_utils.rb', line 127

def insert_funding_references(xml)
  return xml unless Array.wrap(funding).present?

  xml.fundingReferences do
    Array.wrap(funding).each do |funding_reference|
      xml.fundingReference do
        insert_funding_reference(xml, funding_reference)
      end
    end
  end
end

#insert_identifier(xml) ⇒ Object



40
41
42
# File 'lib/bolognese/datacite_utils.rb', line 40

def insert_identifier(xml)
  xml.identifier(doi, 'identifierType' => "DOI")
end

#insert_person(xml, person, type) ⇒ Object



66
67
68
69
70
71
72
73
# File 'lib/bolognese/datacite_utils.rb', line 66

def insert_person(xml, person, type)
  person_name = person["familyName"].present? ? [person["familyName"], person["givenName"]].compact.join(", ") : person["name"]

  xml.send(type + "Name", person_name)
  xml.givenName(person["givenName"]) if person["givenName"].present?
  xml.familyName(person["familyName"]) if person["familyName"].present?
  xml.nameIdentifier(person["id"], 'schemeURI' => 'http://orcid.org/', 'nameIdentifierScheme' => 'ORCID') if person["id"].present?
end

#insert_publication_year(xml) ⇒ Object



89
90
91
# File 'lib/bolognese/datacite_utils.rb', line 89

def insert_publication_year(xml)
  xml.publicationYear(publication_year)
end

#insert_publisher(xml) ⇒ Object



85
86
87
# File 'lib/bolognese/datacite_utils.rb', line 85

def insert_publisher(xml)
  xml.publisher(publisher || container_title)
end


168
169
170
171
172
173
174
175
176
177
178
179
# File 'lib/bolognese/datacite_utils.rb', line 168

def insert_related_identifiers(xml)
  return xml unless rel_identifier.present?

  xml.relatedIdentifiers do
    rel_identifier.each do |related_identifier|
      attributes = {
        'relatedIdentifierType' => related_identifier["related_identifier_type"],
        'relationType' => related_identifier["relation_type"] }.compact
      xml.relatedIdentifier(related_identifier["__content__"], attributes)
    end
  end
end

#insert_resource_type(xml) ⇒ Object



98
99
100
101
102
103
# File 'lib/bolognese/datacite_utils.rb', line 98

def insert_resource_type(xml)
  return xml unless type.present?

  xml.resourceType(resource_type["__content__"],
    'resourceTypeGeneral' => resource_type["resource_type_general"])
end

#insert_rights_list(xml) ⇒ Object



181
182
183
184
185
186
187
188
189
# File 'lib/bolognese/datacite_utils.rb', line 181

def insert_rights_list(xml)
  return xml unless license.present?

  xml.rightsList do
    Array.wrap(license).each do |lic|
      xml.rights(lic["name"], 'rightsURI' => lic["id"])
    end
  end
end

#insert_subjects(xml) ⇒ Object



144
145
146
147
148
149
150
151
152
# File 'lib/bolognese/datacite_utils.rb', line 144

def insert_subjects(xml)
  return xml unless keywords.present?

  xml.subjects do
    keywords.each do |subject|
      xml.subject(subject)
    end
  end
end

#insert_title(xml) ⇒ Object



81
82
83
# File 'lib/bolognese/datacite_utils.rb', line 81

def insert_title(xml)
  xml.title(title)
end

#insert_titles(xml) ⇒ Object



75
76
77
78
79
# File 'lib/bolognese/datacite_utils.rb', line 75

def insert_titles(xml)
  xml.titles do
    insert_title(xml)
  end
end

#insert_version(xml) ⇒ Object



154
155
156
157
158
# File 'lib/bolognese/datacite_utils.rb', line 154

def insert_version(xml)
  return xml unless version.present?

  xml.version(version)
end

#insert_work(xml) ⇒ Object



22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
# File 'lib/bolognese/datacite_utils.rb', line 22

def insert_work(xml)
  insert_identifier(xml)
  insert_creators(xml)
  insert_titles(xml)
  insert_publisher(xml)
  insert_publication_year(xml)
  insert_resource_type(xml)
  insert_alternate_identifiers(xml)
  insert_subjects(xml)
  insert_contributors(xml)
  insert_funding_references(xml)
  insert_dates(xml)
  insert_related_identifiers(xml)
  insert_version(xml)
  insert_rights_list(xml)
  insert_descriptions(xml)
end

#rel_identifierObject



160
161
162
163
164
165
166
# File 'lib/bolognese/datacite_utils.rb', line 160

def rel_identifier
  Array.wrap(related_identifier).map do |r|
    { "__content__" => r["id"] || r["issn"],
      "related_identifier_type" => r["issn"].present? ? "ISSN" : validate_url(r["id"]),
      "relation_type" => r["relationType"] }.compact
  end
end

#resource_typeObject



93
94
95
96
# File 'lib/bolognese/datacite_utils.rb', line 93

def resource_type
  { "resource_type_general" => Metadata::SO_TO_DC_TRANSLATIONS[type] || "Other",
    "__content__" => additional_type || type }
end

#root_attributesObject



201
202
203
204
205
# File 'lib/bolognese/datacite_utils.rb', line 201

def root_attributes
  { :'xmlns:xsi' => 'http://www.w3.org/2001/XMLSchema-instance',
    :'xsi:schemaLocation' => 'http://datacite.org/schema/kernel-4 http://schema.datacite.org/meta/kernel-4/metadata.xsd',
    :'xmlns' => 'http://datacite.org/schema/kernel-4' }
end