lib/briard/readers/cff_reader.rb in briard-2.4.2 vs lib/briard/readers/cff_reader.rb in briard-2.6.0
- old
+ new
@@ -1,122 +1,140 @@
# frozen_string_literal: true
module Briard
module Readers
module CffReader
- def get_cff(id: nil, **options)
- return { "string" => nil, "state" => "not_found" } unless id.present?
+ def get_cff(id: nil, **_options)
+ return { 'string' => nil, 'state' => 'not_found' } unless id.present?
+
id = normalize_id(id)
- response = Maremma.get(github_as_cff_url(id), accept: "json", raw: true)
- data = response.body.fetch("data", nil)
+ response = Maremma.get(github_as_cff_url(id), accept: 'json', raw: true)
+ data = response.body.fetch('data', nil)
# Dates are parsed to date object, need to convert to iso8601 later
string = Psych.safe_load(data, permitted_classes: [Date])
- { "string" => string }
+ { 'string' => string }
end
def read_cff(string: nil, **options)
- read_options = ActiveSupport::HashWithIndifferentAccess.new(options.except(:doi, :id, :url, :sandbox, :validate, :ra))
+ read_options = ActiveSupport::HashWithIndifferentAccess.new(options.except(:doi, :id, :url,
+ :sandbox, :validate, :ra))
meta = string.is_a?(String) ? Psych.safe_load(string, permitted_classes: [Date]) : string
- identifiers = Array.wrap(meta.fetch("identifiers", nil)).map do |r|
+ identifiers = Array.wrap(meta.fetch('identifiers', nil)).map do |r|
r = normalize_id(r) if r.is_a?(String)
- if r.is_a?(String) && !r.start_with?("https://doi.org")
- { "identifierType" => "URL", "identifier" => r }
+ if r.is_a?(String) && URI(r).host != 'doi.org'
+ { 'identifierType' => 'URL', 'identifier' => r }
elsif r.is_a?(Hash)
- { "identifierType" => get_identifier_type(r["propertyID"]), "identifier" => r["value"] }
+ { 'identifierType' => get_identifier_type(r['propertyID']), 'identifier' => r['value'] }
end
end.compact.uniq
- id = normalize_id(options[:doi] || meta.fetch("doi", nil) || Array.wrap(meta.fetch("identifiers", nil)).find { |i| i["type"] == "doi"}.fetch("value", nil))
- url = normalize_id(meta.fetch("repository-code", nil))
- creators = cff_creators(Array.wrap(meta.fetch("authors", nil)))
+ id = normalize_id(options[:doi] || meta.fetch('doi',
+ nil) || Array.wrap(meta.fetch('identifiers', nil)).find do |i|
+ i['type'] == 'doi'
+ end.fetch('value', nil))
+ url = normalize_id(meta.fetch('repository-code', nil))
+ creators = cff_creators(Array.wrap(meta.fetch('authors', nil)))
dates = []
- dates << { "date" => meta.fetch("date-released", nil).iso8601, "dateType" => "Issued" } if meta.fetch("date-released", nil).present?
- publication_year = meta.fetch("date-released").iso8601[0..3] if meta.fetch("date-released", nil).present?
- publisher = url.to_s.starts_with?("https://github.com") ? "GitHub" : nil
- state = meta.present? || read_options.present? ? "findable" : "not_found"
+ if meta.fetch('date-released', nil).present?
+ dates << { 'date' => meta.fetch('date-released', nil).iso8601, 'dateType' => 'Issued' }
+ end
+ publication_year = meta.fetch('date-released').iso8601[0..3] if meta.fetch('date-released',
+ nil).present?
+ publisher = url.to_s.starts_with?('https://github.com') ? 'GitHub' : nil
+ state = meta.present? || read_options.present? ? 'findable' : 'not_found'
types = {
- "resourceTypeGeneral" => "Software",
- "resourceType" => nil,
- "schemaOrg" => "SoftwareSourceCode",
- "citeproc" => "article-journal",
- "bibtex" => "misc",
- "ris" => "COMP"
+ 'resourceTypeGeneral' => 'Software',
+ 'resourceType' => nil,
+ 'schemaOrg' => 'SoftwareSourceCode',
+ 'citeproc' => 'article-journal',
+ 'bibtex' => 'misc',
+ 'ris' => 'COMP'
}.compact
- subjects = Array.wrap(meta.fetch("keywords", nil)).reduce([]) do |sum, subject|
+ subjects = Array.wrap(meta.fetch('keywords', nil)).reduce([]) do |sum, subject|
sum += name_to_fos(subject)
sum
end
- titles = meta.fetch("title", nil).present? ? [{ "title" => meta.fetch("title", nil) }] : []
- related_identifiers = Array.wrap(cff_references(meta.fetch("references", nil)))
- rights_list = meta.fetch("license", nil).present? ? [hsh_to_spdx("rightsIdentifier" => meta.fetch("license"))] : nil
+ titles = if meta.fetch('title', nil).present?
+ [{ 'title' => meta.fetch('title', nil) }]
+ else
+ []
+ end
+ related_identifiers = Array.wrap(cff_references(meta.fetch('references', nil)))
+ rights_list = if meta.fetch('license', nil).present?
+ [hsh_to_spdx('rightsIdentifier' => meta.fetch('license'))]
+ end
- { "id" => id,
- "types" => types,
- "identifiers" => identifiers,
- "doi" => doi_from_url(id),
- "url" => url,
- "titles" => titles,
- "creators" => creators,
- "publisher" => publisher,
- "related_identifiers" => related_identifiers,
- "dates" => dates,
- "publication_year" => publication_year,
- "descriptions" => meta.fetch("abstract", nil).present? ? [{ "description" => sanitize(meta.fetch("abstract")), "descriptionType" => "Abstract" }] : nil,
- "rights_list" => rights_list,
- "version_info" => meta.fetch("version", nil),
- "subjects" => subjects,
- "state" => state
- }.merge(read_options)
+ { 'id' => id,
+ 'types' => types,
+ 'identifiers' => identifiers,
+ 'doi' => doi_from_url(id),
+ 'url' => url,
+ 'titles' => titles,
+ 'creators' => creators,
+ 'publisher' => publisher,
+ 'related_identifiers' => related_identifiers,
+ 'dates' => dates,
+ 'publication_year' => publication_year,
+ 'descriptions' => if meta.fetch('abstract', nil).present?
+ [{ 'description' => sanitize(meta.fetch('abstract')),
+ 'descriptionType' => 'Abstract' }]
+ end,
+ 'rights_list' => rights_list,
+ 'version_info' => meta.fetch('version', nil),
+ 'subjects' => subjects,
+ 'state' => state }.merge(read_options)
end
def cff_creators(creators)
Array.wrap(creators).map do |a|
- name_identifiers = normalize_orcid(parse_attributes(a["orcid"])).present? ? [{ "nameIdentifier" => normalize_orcid(parse_attributes(a["orcid"])), "nameIdentifierScheme" => "ORCID", "schemeUri"=>"https://orcid.org" }] : nil
- if a["given-names"].present? || a["family-names"].present? || name_identifiers.present?
- given_name = parse_attributes(a["given-names"])
- family_name = parse_attributes(a["family-names"])
- affiliation = Array.wrap(a["affiliation"]).map do |a|
+ name_identifiers = if normalize_orcid(parse_attributes(a['orcid'])).present?
+ [{
+ 'nameIdentifier' => normalize_orcid(parse_attributes(a['orcid'])), 'nameIdentifierScheme' => 'ORCID', 'schemeUri' => 'https://orcid.org'
+ }]
+ end
+ if a['given-names'].present? || a['family-names'].present? || name_identifiers.present?
+ given_name = parse_attributes(a['given-names'])
+ family_name = parse_attributes(a['family-names'])
+ affiliation = Array.wrap(a['affiliation']).map do |a|
if a.is_a?(Hash)
a
- elsif a.is_a?(Hash) && a.key?("__content__") && a["__content__"].strip.blank?
+ elsif a.is_a?(Hash) && a.key?('__content__') && a['__content__'].strip.blank?
nil
- elsif a.is_a?(Hash) && a.key?("__content__")
- { "name" => a["__content__"] }
+ elsif a.is_a?(Hash) && a.key?('__content__')
+ { 'name' => a['__content__'] }
elsif a.strip.blank?
nil
elsif a.is_a?(String)
- { "name" => a }
+ { 'name' => a }
end
end.compact
- { "nameType" => "Personal",
- "nameIdentifiers" => name_identifiers,
- "name" => [family_name, given_name].compact.join(", "),
- "givenName" => given_name,
- "familyName" => family_name,
- "affiliation" => affiliation.presence }.compact
+ { 'nameType' => 'Personal',
+ 'nameIdentifiers' => name_identifiers,
+ 'name' => [family_name, given_name].compact.join(', '),
+ 'givenName' => given_name,
+ 'familyName' => family_name,
+ 'affiliation' => affiliation.presence }.compact
else
- { "nameType" => "Organizational",
- "name" => a["name"] || a["__content__"] }
+ { 'nameType' => 'Organizational',
+ 'name' => a['name'] || a['__content__'] }
end
end
end
def cff_references(references)
Array.wrap(references).map do |r|
- identifier = Array.wrap(r["identifiers"]).find { |i| i["type"] == "doi" }
-
- if identifier.present?
- { "relatedIdentifier" => normalize_id(parse_attributes(identifier["value"])),
- "relationType" => "References",
- "relatedIdentifierType" => "DOI" }.compact
- else
- nil
- end
+ identifier = Array.wrap(r['identifiers']).find { |i| i['type'] == 'doi' }
+
+ next unless identifier.present?
+
+ { 'relatedIdentifier' => normalize_id(parse_attributes(identifier['value'])),
+ 'relationType' => 'References',
+ 'relatedIdentifierType' => 'DOI' }.compact
end.compact.unwrap
end
end
end
end