class OrcidClient::Work

Constants

SCHEMA

Attributes

doi[R]
name_detector[R]
orcid[R]
orcid_token[R]
put_code[R]
sandbox[R]
schema[R]
validation_errors[R]

Public Class Methods

new(doi:, orcid:, orcid_token:, **options) click to toggle source
# File lib/orcid_client/work.rb, line 22
def initialize(doi:, orcid:, orcid_token:, **options)
  @doi = doi
  @orcid = orcid
  @orcid_token = orcid_token
  @sandbox = options.fetch(:sandbox, nil) || ENV['API_URL'] == "https://api.stage.datacite.org"
  @put_code = options.fetch(:put_code, nil)
end

Public Instance Methods

container_title() click to toggle source

user publisher name as fallback

# File lib/orcid_client/work.rb, line 57
def container_title
  metadata.container_title || metadata.publisher
end
contributors() click to toggle source
# File lib/orcid_client/work.rb, line 41
def contributors
  Array.wrap(metadata.creators).map do |contributor|
    orcid = Array.wrap(contributor["nameIdentifiers"]).find { |c| c["nameIdentifierScheme"] == "ORCID" }.to_h.fetch("nameIdentifier", nil)
    credit_name = contributor["familyName"].present? ? [contributor["givenName"], contributor["familyName"]].join(" ") : contributor["name"]
    
    { orcid: orcid,
      credit_name: credit_name,
      role: nil }.compact
  end
end
data() click to toggle source
# File lib/orcid_client/work.rb, line 79
def data
  return nil unless has_required_elements?

  Nokogiri::XML::Builder.new(:encoding => 'UTF-8') do |xml|
    xml.send(:'work:work', root_attributes) do
      insert_work(xml)
    end
  end.to_xml
end
description() click to toggle source
# File lib/orcid_client/work.rb, line 66
def description
  ct = parse_attributes(metadata.descriptions, content: "description", first: true)
  ct.squish if ct.present?
end
has_required_elements?() click to toggle source
# File lib/orcid_client/work.rb, line 75
def has_required_elements?
  doi && contributors && title && container_title && publication_date
end
insert_contributor(xml, contributor) click to toggle source
# File lib/orcid_client/work.rb, line 154
def insert_contributor(xml, contributor)
  if contributor[:orcid].present?
    xml.send(:'common:contributor-orcid') do
      xml.send(:'common:uri', contributor[:orcid])
      xml.send(:'common:path', validate_orcid(contributor[:orcid]))
      xml.send(:'common:host', 'orcid.org')
    end
  end
  xml.send(:'credit-name', contributor[:credit_name])
  if contributor[:role]
    xml.send(:'contributor-attributes') do
      xml.send(:'contributor-role', contributor[:role])
    end
  end
end
insert_contributors(xml) click to toggle source
# File lib/orcid_client/work.rb, line 142
def insert_contributors(xml)
  return nil unless contributors.present?

  xml.send(:'work:contributors') do
    contributors.each do |contributor|
      xml.contributor do
        insert_contributor(xml, contributor)
      end
    end
  end
end
insert_description(xml) click to toggle source
# File lib/orcid_client/work.rb, line 108
def insert_description(xml)
  return nil unless description.present?

  xml.send(:'work:short-description', description.truncate(2500, separator: ' '))
end
insert_id(xml, id_type, value, relationship) click to toggle source
# File lib/orcid_client/work.rb, line 134
def insert_id(xml, id_type, value, relationship)
  xml.send(:'common:external-id') do
    xml.send(:'common:external-id-type', id_type)
    xml.send(:'common:external-id-value', value)
    xml.send(:'common:external-id-relationship', relationship)
  end
end
insert_ids(xml) click to toggle source
# File lib/orcid_client/work.rb, line 128
def insert_ids(xml)
  xml.send(:'common:external-ids') do
    insert_id(xml, 'doi', doi, 'self')
  end
end
insert_pub_date(xml) click to toggle source
# File lib/orcid_client/work.rb, line 118
def insert_pub_date(xml)
  if publication_date['year']
    xml.send(:'common:publication-date') do
      xml.year(publication_date.fetch('year'))
      xml.month(publication_date.fetch('month', nil)) if publication_date['month']
      xml.day(publication_date.fetch('day', nil)) if publication_date['month'] && publication_date['day']
    end
  end
end
insert_titles(xml) click to toggle source
# File lib/orcid_client/work.rb, line 98
def insert_titles(xml)
  if title
    xml.send(:'work:title') do
      xml.send(:'common:title', title.truncate(1000, separator: ' '))
    end
  end

  xml.send(:'work:journal-title', container_title) if container_title
end
insert_type(xml) click to toggle source
# File lib/orcid_client/work.rb, line 114
def insert_type(xml)
  xml.send(:'work:type', type)
end
insert_work(xml) click to toggle source
# File lib/orcid_client/work.rb, line 89
def insert_work(xml)
  insert_titles(xml)
  insert_description(xml)
  insert_type(xml)
  insert_pub_date(xml)
  insert_ids(xml)
  insert_contributors(xml)
end
metadata() click to toggle source
# File lib/orcid_client/work.rb, line 37
def metadata
  @metadata ||= Bolognese::Metadata.new(input: doi, sandbox: sandbox)
end
publication_date() click to toggle source
# File lib/orcid_client/work.rb, line 61
def publication_date
  pd = get_date(metadata.dates, "Issued") || metadata.publication_year
  get_year_month_day(pd)
end
root_attributes() click to toggle source
# File lib/orcid_client/work.rb, line 180
def root_attributes
  { :'put-code' => put_code,
    :'visibility' => 'public',
    :'xmlns:xsi' => 'http://www.w3.org/2001/XMLSchema-instance',
    :'xsi:schemaLocation' => 'http://www.orcid.org/ns/work ../work-3.0.xsd',
    :'xmlns:common' => 'http://www.orcid.org/ns/common',
    :'xmlns:work' => 'http://www.orcid.org/ns/work' }.compact
end
title() click to toggle source
# File lib/orcid_client/work.rb, line 52
def title
  parse_attributes(metadata.titles, content: "title", first: true)
end
type() click to toggle source
# File lib/orcid_client/work.rb, line 71
def type
  orcid_work_type(metadata.types["resourceTypeGeneral"], metadata.types["resourceType"])
end
without_control(s) click to toggle source
# File lib/orcid_client/work.rb, line 170
def without_control(s)
  r = ''
  s.each_codepoint do |c|
    if c >= 32
      r << c
    end
  end
  r
end