lib/bolognese/readers/datacite_reader.rb in bolognese-0.9.17 vs lib/bolognese/readers/datacite_reader.rb in bolognese-0.9.18

- old
+ new

@@ -45,11 +45,11 @@ else k.to_h.fetch("__content__", nil) end end.compact.join(", ").presence dates = Array.wrap(meta.dig("dates", "date")) - funder = begin + funding = begin f = datacite_funder_contributor(meta) + datacite_funding_reference(meta) f.length > 1 ? f : f.first end { "id" => id, @@ -64,13 +64,13 @@ "url" => nil, "title" => title, "alternate_name" => alternate_name, "author" => get_authors(meta.dig("creators", "creator")), "editor" => get_authors(Array.wrap(meta.dig("contributors", "contributor")).select { |r| r["contributorType"] == "Editor" }), - "funder" => funder, "publisher" => meta.fetch("publisher", nil), "provider" => "DataCite", + "funding" => funding, "is_identical_to" => datacite_is_identical_to(meta), "is_part_of" => datacite_is_part_of(meta), "has_part" => datacite_has_part(meta), "references" => datacite_references(meta), "is_referenced_by" => datacite_is_referenced_by(meta), @@ -101,12 +101,22 @@ end def datacite_funding_reference(meta) Array.wrap(meta.dig("fundingReferences", "fundingReference")).map do |f| funder_id = parse_attributes(f["funderIdentifier"]) - { "identifier" => normalize_id(funder_id), - "name" => f["funderName"] }.compact + funder = { "type" => "Organization", + "id" => normalize_id(funder_id), + "name" => f["funderName"] }.compact + if f["awardNumber"].present? || f["awardTitle"].present? + { "type" => "Award", + "name" => f.fetch("awardTitle", nil), + "identifier" => f.dig("awardNumber", "__content__"), + "url" => f.dig("awardNumber", "awardURI"), + "funder" => funder } + else + funder + end end.uniq end def datacite_related_identifier(meta, relation_type: nil) arr = Array.wrap(meta.dig("relatedIdentifiers", "relatedIdentifier")).select { |r| %w(DOI URL).include?(r["relatedIdentifierType"]) } @@ -168,10 +178,18 @@ end def datacite_funder_contributor(meta) Array.wrap(meta.dig("contributors", "contributor")).reduce([]) do |sum, f| if f["contributorType"] == "Funder" - sum << { "name" => f["contributorName"] } + funder = { "type" => "Organization", + "name" => f["contributorName"] }.compact + if f.dig("nameIdentifier", "nameIdentifierScheme") == "info" + sum << { "type" => "Award", + "identifier" => f.dig("nameIdentifier", "__content__").split("/").last, + "funder" => funder } + else + sum << funder + end else sum end end end