Class: Bolognese::Metadata

Inherits:
Object
  • Object
show all
Includes:
MetadataUtils, Utils
Defined in:
lib/bolognese/metadata.rb

Constant Summary

Constants included from Utils

Utils::BIB_TO_CR_TRANSLATIONS, Utils::BIB_TO_DC_TRANSLATIONS, Utils::CP_TO_DC_TRANSLATIONS, Utils::CR_TO_BIB_TRANSLATIONS, Utils::CR_TO_CP_TRANSLATIONS, Utils::CR_TO_DC_TRANSLATIONS, Utils::CR_TO_JATS_TRANSLATIONS, Utils::CR_TO_RIS_TRANSLATIONS, Utils::CR_TO_SO_TRANSLATIONS, Utils::DC_TO_CP_TRANSLATIONS, Utils::DC_TO_RIS_TRANSLATIONS, Utils::DC_TO_SO_TRANSLATIONS, Utils::NORMALIZED_LICENSES, Utils::RESOURCE_PATHS, Utils::RIS_TO_DC_TRANSLATIONS, Utils::SO_TO_BIB_TRANSLATIONS, Utils::SO_TO_CP_TRANSLATIONS, Utils::SO_TO_DC_TRANSLATIONS, Utils::SO_TO_JATS_TRANSLATIONS, Utils::SO_TO_RIS_TRANSLATIONS, Utils::UNKNOWN_INFORMATION

Constants included from Readers::SchemaOrgReader

Readers::SchemaOrgReader::SO_TO_DC_RELATION_TYPES, Readers::SchemaOrgReader::SO_TO_DC_REVERSE_RELATION_TYPES

Constants included from Readers::RisReader

Readers::RisReader::RIS_TO_BIB_TRANSLATIONS, Readers::RisReader::RIS_TO_CP_TRANSLATIONS, Readers::RisReader::RIS_TO_SO_TRANSLATIONS

Constants included from Readers::CrossrefReader

Readers::CrossrefReader::CR_TO_DC_CONTRIBUTOR_TYPES

Constants included from Readers::CiteprocReader

Readers::CiteprocReader::CP_TO_RIS_TRANSLATIONS, Readers::CiteprocReader::CP_TO_SO_TRANSLATIONS

Constants included from Readers::BibtexReader

Readers::BibtexReader::BIB_TO_CP_TRANSLATIONS, Readers::BibtexReader::BIB_TO_RIS_TRANSLATIONS, Readers::BibtexReader::BIB_TO_SO_TRANSLATIONS

Constants included from AuthorUtils

AuthorUtils::IDENTIFIER_SCHEME_URIS

Instance Attribute Summary collapse

Attributes included from MetadataUtils

#name_detector, #reverse

Instance Method Summary collapse

Methods included from Utils

#abstract_description, #dfg_ids_to_fos, #find_from_format, #find_from_format_by_ext, #find_from_format_by_filename, #find_from_format_by_id, #find_from_format_by_string, #from_citeproc, #from_datacite_json, #from_schema_org, #from_schema_org_contributors, #from_schema_org_creators, #generate_container, #get_contributor, #get_date, #get_date_from_date_parts, #get_date_from_parts, #get_date_parts, #get_date_parts_from_parts, #get_datetime_from_iso8601, #get_datetime_from_time, #get_identifier, #get_identifier_type, #get_iso8601_date, #get_series_information, #get_year_month, #get_year_month_day, #github_as_codemeta_url, #github_as_owner_url, #github_as_release_url, #github_as_repo_url, #github_from_url, #github_owner_from_url, #github_release_from_url, #github_repo_from_url, #hsh_to_fos, #hsh_to_spdx, #jsonlint, #map_hash_keys, #name_to_fos, #name_to_spdx, #normalize_cc_url, #normalize_id, #normalize_ids, #normalize_issn, #normalize_licenses, #normalize_orcid, #normalize_publisher, #normalize_ror, #normalize_url, #orcid_as_url, #orcid_from_url, #parse_attributes, #resource_file, #resource_json, #resources_dir_path, #sanitize, #to_citeproc, #to_datacite_json, #to_identifier, #to_ris, #to_schema_org, #to_schema_org_container, #to_schema_org_contributors, #to_schema_org_creators, #to_schema_org_funder, #to_schema_org_identifiers, #to_schema_org_relation, #to_schema_org_spatial_coverage, #validate_orcid, #validate_orcid_scheme, #validate_ror, #validate_url

Methods included from MetadataUtils

#citeproc_hsh, #container_title, #crosscite_hsh, #graph, #locale, #raw, #should_passthru, #style

Methods included from Writers::TurtleWriter

#turtle

Methods included from Writers::SchemaOrgWriter

#schema_hsh, #schema_org

Methods included from Writers::RisWriter

#ris

Methods included from Writers::RdfXmlWriter

#rdf_xml

Methods included from Writers::JatsWriter

#date, #insert_authors, #insert_citation, #insert_citation_title, #insert_contributor, #insert_editors, #insert_fpage, #insert_issue, #insert_lpage, #insert_pub_id, #insert_publication_date, #insert_publisher_name, #insert_source, #insert_version, #insert_volume, #is_article?, #is_chapter?, #is_data?, #jats, #publication_type

Methods included from Writers::DataciteJsonWriter

#datacite_json

Methods included from Writers::DataciteWriter

#datacite

Methods included from Writers::CsvWriter

#csv

Methods included from Writers::CrossrefWriter

#crossref

Methods included from Writers::CrossciteWriter

#crosscite

Methods included from Writers::CodemetaWriter

#codemeta

Methods included from Writers::CiteprocWriter

#citeproc

Methods included from Writers::CitationWriter

#citation

Methods included from Writers::BibtexWriter

#bibtex

Methods included from Readers::SchemaOrgReader

#get_schema_org, #read_schema_org, #schema_org_has_part, #schema_org_has_translation, #schema_org_is_identical_to, #schema_org_is_new_version_of, #schema_org_is_part_of, #schema_org_is_previous_version_of, #schema_org_is_referenced_by, #schema_org_is_supplement_to, #schema_org_is_supplemented_by, #schema_org_is_translation_of, #schema_org_references, #schema_org_related_identifier, #schema_org_reverse_related_identifier

Methods included from Readers::RisReader

#read_ris, #ris_meta

Methods included from Readers::NpmReader

#get_npm, #read_npm

Methods included from Readers::DataciteJsonReader

#read_datacite_json

Methods included from Readers::DataciteReader

#get_datacite, #get_titles, #read_datacite

Methods included from Readers::CrossrefReader

#crossref_alternate_identifiers, #crossref_date_published, #crossref_description, #crossref_funding_reference, #crossref_has_translation, #crossref_is_part_of, #crossref_is_translation_of, #crossref_license, #crossref_people, #crossref_references, #get_crossref, #read_crossref

Methods included from Readers::CrossciteReader

#read_crosscite

Methods included from Readers::CodemetaReader

#get_codemeta, #read_codemeta

Methods included from Readers::CiteprocReader

#read_citeproc

Methods included from Readers::BibtexReader

#read_bibtex

Methods included from DataciteUtils

#datacite_errors, #datacite_xml, #insert_alternate_identifiers, #insert_contributors, #insert_creators, #insert_dates, #insert_descriptions, #insert_formats, #insert_funding_references, #insert_geo_locations, #insert_identifier, #insert_language, #insert_person, #insert_publication_year, #insert_publisher, #insert_related_identifiers, #insert_related_items, #insert_resource_type, #insert_rights_list, #insert_sizes, #insert_subjects, #insert_titles, #insert_version, #insert_work, #root_attributes

Methods included from AuthorUtils

#authors_as_string, #cleanup_author, #get_affiliations, #get_authors, #get_one_author, #is_personal_name?, #name_exists?

Methods included from DoiUtils

#doi_api_url, #doi_as_url, #doi_from_url, #doi_resolver, #get_doi_ra, #normalize_doi, #validate_doi, #validate_funder_doi, #validate_prefix

Constructor Details

#initialize(options = {}) ⇒ Metadata



19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
# File 'lib/bolognese/metadata.rb', line 19

def initialize(options={})
  options.symbolize_keys!
  id = normalize_id(options[:input], options)
  ra = nil

  if id.present?
    @from = options[:from] || find_from_format(id: id)

    # mEDRA, KISTI, JaLC and OP DOIs are found in the Crossref index
    if @from == "medra"
      ra = "mEDRA"
    elsif @from == "kisti"
      ra = "KISTI"
    elsif @from == "jalc"
      ra = "JaLC"
    elsif @from == "op"
      ra = "OP"
    end

    # generate name for method to call dynamically
    hsh = @from.present? ? send("get_" + @from, id: id, sandbox: options[:sandbox]) : {}
    string = hsh.fetch("string", nil)

  elsif options[:input].present? && File.exist?(options[:input])
    filename = File.basename(options[:input])
    ext = File.extname(options[:input])
    if %w(.bib .ris .xml .json).include?(ext)
      hsh = {
        "url" => options[:url],
        "state" => options[:state],
        "date_registered" => options[:date_registered],
        "date_updated" => options[:date_updated],
        "provider_id" => options[:provider_id],
        "client_id" => options[:client_id],
        "content_url" => options[:content_url] }
      string = IO.read(options[:input])
      @from = options[:from] || find_from_format(string: string, filename: filename, ext: ext)
    else
      $stderr.puts "File type #{ext} not supported"
      exit 1
    end
  else
    hsh = {
      "url" => options[:url],
      "state" => options[:state],
      "date_registered" => options[:date_registered],
      "date_updated" => options[:date_updated],
      "provider_id" => options[:provider_id],
      "client_id" => options[:client_id],
      "content_url" => options[:content_url],
      "creators" => options[:creators],
      "contributors" => options[:contributors],
      "titles" => options[:titles],
      "publisher" => options[:publisher],
      "publication_year" => options[:publication_year] }
    string = options[:input]
    @from = options[:from] || find_from_format(string: string)
  end

  # make sure input is encoded as utf8
  string = string.force_encoding("UTF-8") if string.present?
  @string = string

  # input options for citation formatting
  @style = options[:style]
  @locale = options[:locale]

  @sandbox = options[:sandbox]

  # options that come from the datacite database
  @url = hsh.to_h["url"].presence || options[:url].presence
  @state = hsh.to_h["state"].presence
  @date_registered = hsh.to_h["date_registered"].presence
  @date_updated = hsh.to_h["date_updated"].presence
  @provider_id = hsh.to_h["provider_id"].presence
  @client_id = hsh.to_h["client_id"].presence
  @content_url = hsh.to_h["content_url"].presence

  # set attributes directly
  read_options = options.slice(
    :creators,
    :contributors,
    :titles,
    :types,
    :identifiers,
    :container,
    :publisher,
    :funding_references,
    :dates,
    :publication_year,
    :descriptions,
    :rights_list,
    :version_info,
    :subjects,
    :language,
    :geo_locations,
    :related_identifiers,
    :related_items,
    :formats,
    :sizes
  ).compact

  @regenerate = options[:regenerate] || read_options.present?
  # generate name for method to call dynamically
  opts = { string: string, sandbox: options[:sandbox], doi: options[:doi], id: id, ra: ra }.merge(read_options)
  @meta = @from.present? ? send("read_" + @from, **opts) : {}
end

Instance Attribute Details

#agencyObject



234
235
236
# File 'lib/bolognese/metadata.rb', line 234

def agency
  @agency ||= meta.fetch("agency", nil)
end

#client_idObject



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

def client_id
  @client_id ||= meta.fetch("client_id", nil)
end

#containerObject



208
209
210
211
212
# File 'lib/bolognese/metadata.rb', line 208

def container
  @container ||= begin
    generate_container(types, related_items, related_identifiers, descriptions) || meta.fetch("container", nil)
  end
end

#content_urlObject



230
231
232
# File 'lib/bolognese/metadata.rb', line 230

def content_url
  @content_url ||= meta.fetch("content_url", nil)
end

#contributor=(value) ⇒ Object (writeonly)

Sets the attribute contributor



12
13
14
# File 'lib/bolognese/metadata.rb', line 12

def contributor=(value)
  @contributor = value
end

#contributorsObject



258
259
260
# File 'lib/bolognese/metadata.rb', line 258

def contributors
  @contributors ||= meta.fetch("contributors", nil)
end

#creatorsObject



254
255
256
# File 'lib/bolognese/metadata.rb', line 254

def creators
  @creators ||= meta.fetch("creators", nil)
end

#date_registeredObject



242
243
244
# File 'lib/bolognese/metadata.rb', line 242

def date_registered
  @date_registered ||= meta.fetch("date_registered", nil)
end

#datesObject



218
219
220
# File 'lib/bolognese/metadata.rb', line 218

def dates
  @dates ||= meta.fetch("dates", nil)
end

#descriptionsObject



156
157
158
# File 'lib/bolognese/metadata.rb', line 156

def descriptions
  @descriptions ||= meta.fetch("descriptions", nil)
end

#docObject (readonly)

Returns the value of attribute doc.



11
12
13
# File 'lib/bolognese/metadata.rb', line 11

def doc
  @doc
end

#doiObject



131
132
133
# File 'lib/bolognese/metadata.rb', line 131

def doi
  @doi ||= meta.fetch("doi", nil)
end

#format=(value) ⇒ Object (writeonly)

Sets the attribute format



12
13
14
# File 'lib/bolognese/metadata.rb', line 12

def format=(value)
  @format = value
end

#formatsObject



176
177
178
# File 'lib/bolognese/metadata.rb', line 176

def formats
  @formats ||= meta.fetch("formats", nil)
end

#fromObject

Returns the value of attribute from.



10
11
12
# File 'lib/bolognese/metadata.rb', line 10

def from
  @from
end

#funding_referencesObject



184
185
186
# File 'lib/bolognese/metadata.rb', line 184

def funding_references
  @funding_references ||= meta.fetch("funding_references", nil)
end

#geo_locationsObject



214
215
216
# File 'lib/bolognese/metadata.rb', line 214

def geo_locations
  @geo_locations ||= meta.fetch("geo_locations", nil)
end

#idObject



127
128
129
# File 'lib/bolognese/metadata.rb', line 127

def id
  @id ||= meta.fetch("id", nil)
end

#identifiersObject



226
227
228
# File 'lib/bolognese/metadata.rb', line 226

def identifiers
  @identifiers ||= meta.fetch("identifiers", nil)
end

#issueObject

Returns the value of attribute issue.



10
11
12
# File 'lib/bolognese/metadata.rb', line 10

def issue
  @issue
end

#languageObject



168
169
170
# File 'lib/bolognese/metadata.rb', line 168

def language
  @language ||= meta.fetch("language", nil)
end

#locale=(value) ⇒ Object (writeonly)

Sets the attribute locale



12
13
14
# File 'lib/bolognese/metadata.rb', line 12

def locale=(value)
  @locale = value
end

#metaObject

Returns the value of attribute meta.



10
11
12
# File 'lib/bolognese/metadata.rb', line 10

def meta
  @meta
end

#page_endObject (readonly)

Returns the value of attribute page_end.



11
12
13
# File 'lib/bolognese/metadata.rb', line 11

def page_end
  @page_end
end

#page_startObject (readonly)

Returns the value of attribute page_start.



11
12
13
# File 'lib/bolognese/metadata.rb', line 11

def page_start
  @page_start
end

#provider_idObject



135
136
137
# File 'lib/bolognese/metadata.rb', line 135

def provider_id
  @provider_id ||= meta.fetch("provider_id", nil)
end

#publication_yearObject



204
205
206
# File 'lib/bolognese/metadata.rb', line 204

def publication_year
  @publication_year ||= meta.fetch("publication_year", nil)
end

#publisherObject



222
223
224
# File 'lib/bolognese/metadata.rb', line 222

def publisher
  @publisher ||= normalize_publisher(meta["publisher"]) if meta.fetch("publisher", nil).present?
end

#regenerateObject

Returns the value of attribute regenerate.



10
11
12
# File 'lib/bolognese/metadata.rb', line 10

def regenerate
  @regenerate
end


188
189
190
# File 'lib/bolognese/metadata.rb', line 188

def related_identifiers
  @related_identifiers ||= meta.fetch("related_identifiers", nil)
end


192
193
194
# File 'lib/bolognese/metadata.rb', line 192

def related_items
  @related_items ||= meta.fetch("related_items", nil)
end

#rights_listObject



160
161
162
# File 'lib/bolognese/metadata.rb', line 160

def rights_list
  @rights_list ||= meta.fetch("rights_list", nil)
end

#sandboxObject

Returns the value of attribute sandbox.



10
11
12
# File 'lib/bolognese/metadata.rb', line 10

def sandbox
  @sandbox
end

#schema_versionObject



180
181
182
# File 'lib/bolognese/metadata.rb', line 180

def schema_version
  @schema_version ||= meta.fetch("schema_version", nil)
end

#show_errorsObject

Returns the value of attribute show_errors.



10
11
12
# File 'lib/bolognese/metadata.rb', line 10

def show_errors
  @show_errors
end

#sizesObject



172
173
174
# File 'lib/bolognese/metadata.rb', line 172

def sizes
  @sizes ||= meta.fetch("sizes", nil)
end

#stateObject



238
239
240
# File 'lib/bolognese/metadata.rb', line 238

def state
  @state ||= meta.fetch("state", nil)
end

#stringObject

Returns the value of attribute string.



10
11
12
# File 'lib/bolognese/metadata.rb', line 10

def string
  @string
end

#style=(value) ⇒ Object (writeonly)

Sets the attribute style



12
13
14
# File 'lib/bolognese/metadata.rb', line 12

def style=(value)
  @style = value
end

#subjectsObject



164
165
166
# File 'lib/bolognese/metadata.rb', line 164

def subjects
  @subjects ||= meta.fetch("subjects", nil)
end

#titlesObject



250
251
252
# File 'lib/bolognese/metadata.rb', line 250

def titles
  @titles ||= meta.fetch("titles", nil)
end

#typesObject



246
247
248
# File 'lib/bolognese/metadata.rb', line 246

def types
  @types ||= meta.fetch("types", nil)
end

#urlObject



196
197
198
# File 'lib/bolognese/metadata.rb', line 196

def url
  @url ||= meta.fetch("url", nil)
end

#version_infoObject



200
201
202
# File 'lib/bolognese/metadata.rb', line 200

def version_info
  @version_info ||= meta.fetch("version_info", nil) || meta.fetch("version", nil)
end

#volume=(value) ⇒ Object (writeonly)

Sets the attribute volume



12
13
14
# File 'lib/bolognese/metadata.rb', line 12

def volume=(value)
  @volume = value
end

Instance Method Details

#errorsObject

validate against DataCite schema, unless there are already errors in the reader



152
153
154
# File 'lib/bolognese/metadata.rb', line 152

def errors
  meta.fetch("errors", nil) || datacite_errors(xml: datacite, schema_version: schema_version)
end

#exists?Boolean



143
144
145
# File 'lib/bolognese/metadata.rb', line 143

def exists?
  (@state || meta.fetch("state", nil)) != "not_found"
end

#valid?Boolean



147
148
149
# File 'lib/bolognese/metadata.rb', line 147

def valid?
  exists? && errors.nil?
end