commonmeta-ruby 3.7.2 → 3.8.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/.github/workflows/publish.yml +23 -0
- data/Gemfile.lock +30 -29
- data/bin/commonmeta +1 -1
- data/docs/.gitignore +1 -0
- data/docs/_publish.yml +4 -0
- data/docs/_quarto.yml +46 -0
- data/docs/_site/favicon.ico +0 -0
- data/docs/_site/images/icon.png +0 -0
- data/docs/_site/index.html +947 -0
- data/docs/_site/readers/bibtex_reader.html +802 -0
- data/docs/_site/search.json +74 -0
- data/docs/_site/site_libs/bootstrap/bootstrap-dark.min.css +9 -0
- data/docs/_site/site_libs/bootstrap/bootstrap-icons.css +2078 -0
- data/docs/_site/site_libs/bootstrap/bootstrap-icons.woff +0 -0
- data/docs/_site/site_libs/bootstrap/bootstrap.min.css +9 -0
- data/docs/_site/site_libs/bootstrap/bootstrap.min.js +7 -0
- data/docs/_site/site_libs/clipboard/clipboard.min.js +7 -0
- data/docs/_site/site_libs/quarto-html/anchor.min.js +9 -0
- data/docs/_site/site_libs/quarto-html/popper.min.js +6 -0
- data/docs/_site/site_libs/quarto-html/quarto-syntax-highlighting-dark.css +179 -0
- data/docs/_site/site_libs/quarto-html/quarto-syntax-highlighting.css +179 -0
- data/docs/_site/site_libs/quarto-html/quarto.js +889 -0
- data/docs/_site/site_libs/quarto-html/tippy.css +1 -0
- data/docs/_site/site_libs/quarto-html/tippy.umd.min.js +2 -0
- data/docs/_site/site_libs/quarto-nav/headroom.min.js +7 -0
- data/docs/_site/site_libs/quarto-nav/quarto-nav.js +288 -0
- data/docs/_site/site_libs/quarto-search/autocomplete.umd.js +3 -0
- data/docs/_site/site_libs/quarto-search/fuse.min.js +9 -0
- data/docs/_site/site_libs/quarto-search/quarto-search.js +1241 -0
- data/docs/_site/utils/doi_utils.html +787 -0
- data/docs/_site/writers/bibtex_writer.html +803 -0
- data/docs/favicon.ico +0 -0
- data/docs/images/icon.png +0 -0
- data/docs/index.qmd +83 -0
- data/docs/readers/bibtex_reader.ipynb +37 -0
- data/docs/theme.scss +7 -0
- data/docs/utils/doi_utils.ipynb +28 -0
- data/docs/writers/bibtex_writer.ipynb +39 -0
- data/lib/commonmeta/cli.rb +5 -5
- data/lib/commonmeta/crossref_utils.rb +7 -1
- data/lib/commonmeta/doi_utils.rb +5 -0
- data/lib/commonmeta/metadata.rb +66 -62
- data/lib/commonmeta/readers/json_feed_reader.rb +15 -5
- data/lib/commonmeta/version.rb +1 -1
- data/spec/cli_spec.rb +2 -2
- data/spec/doi_utils_spec.rb +14 -0
- data/spec/fixtures/vcr_cassettes/Commonmeta_CLI/json_feed/json_feed_blog_slug.yml +71 -0
- data/spec/readers/json_feed_reader_spec.rb +40 -8
- data/spec/writers/crossref_xml_writer_spec.rb +25 -8
- metadata +40 -3
data/docs/favicon.ico
ADDED
|
Binary file
|
|
Binary file
|
data/docs/index.qmd
ADDED
|
@@ -0,0 +1,83 @@
|
|
|
1
|
+
---
|
|
2
|
+
title: Guide
|
|
3
|
+
---
|
|
4
|
+
|
|
5
|
+
[](https://doi.org/10.5281/zenodo.5785519)
|
|
6
|
+
[](https://badge.fury.io/rb/commonmeta-ruby)
|
|
7
|
+

|
|
8
|
+
|
|
9
|
+
commonmeta-ruby is a Ruby gem and command-line utility for the conversion of scholarly metadata, including [schema.org](https://schema.org). Based on the [bolognese](https://github.com/datacite/bolognese) gem, but using [commonmeta](https://commonmeta.org) as the intermediate format, and supporting additional metadata formats. A Python version is available at [commonmeta-py](https://github.com/front-matter/commonmeta-py).
|
|
10
|
+
|
|
11
|
+
## Installation
|
|
12
|
+
|
|
13
|
+
Requires Ruby 3.0 or later (Ruby 2.x [has reached its end of life](https://endoflife.date/ruby) March 2023). Then add the following to your `Gemfile` to install the
|
|
14
|
+
latest version:
|
|
15
|
+
|
|
16
|
+
```
|
|
17
|
+
gem 'commonmeta-ruby'
|
|
18
|
+
```
|
|
19
|
+
|
|
20
|
+
Then run `bundle install` to install into your environment.
|
|
21
|
+
|
|
22
|
+
You can also install the gem system-wide in the usual way:
|
|
23
|
+
|
|
24
|
+
```
|
|
25
|
+
gem install commonmeta-ruby
|
|
26
|
+
```
|
|
27
|
+
|
|
28
|
+
## Commands
|
|
29
|
+
|
|
30
|
+
Run the `commonmeta` command with either an identifier (DOI or URL) or filename:
|
|
31
|
+
|
|
32
|
+
```
|
|
33
|
+
commonmeta https://doi.org/10.7554/elife.01567
|
|
34
|
+
```
|
|
35
|
+
|
|
36
|
+
```
|
|
37
|
+
commonmeta example.xml
|
|
38
|
+
```
|
|
39
|
+
|
|
40
|
+
commonmeta can read BibTeX files (file extension `.bib`), RIS files (file extension `.ris`), Crossref files (file extension `.xml`), DataCite files and CSL-JSON files.
|
|
41
|
+
|
|
42
|
+
The input format (e.g. Crossref or BibteX) is automatically detected, but
|
|
43
|
+
you can also provide the format with the `--from` or `-f` flag. The supported
|
|
44
|
+
input formats are listed in the table above.
|
|
45
|
+
|
|
46
|
+
The output format is determined by the `--to` or `-t` flag, and defaults to `schema_org`.
|
|
47
|
+
|
|
48
|
+
Show all commands with `commonmeta help`:
|
|
49
|
+
|
|
50
|
+
```
|
|
51
|
+
Commands:
|
|
52
|
+
commonmeta # convert metadata
|
|
53
|
+
commonmeta --version, -v # print the version
|
|
54
|
+
commonmeta help [COMMAND] # Describe available commands or one specific command
|
|
55
|
+
```
|
|
56
|
+
|
|
57
|
+
## Errors
|
|
58
|
+
|
|
59
|
+
Errors are returned to STDOUT.
|
|
60
|
+
|
|
61
|
+
All input is validated against the commonmeta JSON schema.
|
|
62
|
+
|
|
63
|
+
## Supported Metadata Formats
|
|
64
|
+
|
|
65
|
+
commonmeta-ruby reads and/or writes these metadata formats:
|
|
66
|
+
|
|
67
|
+
| Format | Name | Content Type | Read | Write |
|
|
68
|
+
| ------ | ---- | ------------ | ---- | ----- |
|
|
69
|
+
| [Commonmeta](https://commonmeta.org) | commonmeta | application/vnd.commonmeta+json | yes | yes |
|
|
70
|
+
| [CrossRef Unixref XML](https://www.crossref.org/schema/documentation/unixref1.1/unixref1.1.html) | crossref | application/vnd.crossref.unixref+xml | yes | yes |
|
|
71
|
+
| [Crossref](https://api.crossref.org) | crossref | application/vnd.crossref+json | yes | no |
|
|
72
|
+
| [DataCite](https://api.datacite.org/) | datacite | application/vnd.datacite.datacite+json | yes | yes |
|
|
73
|
+
| [Schema.org (in JSON-LD)](http://schema.org/) | schema_org | application/vnd.schemaorg.ld+json | yes | yes |
|
|
74
|
+
| [RDF XML](http://www.w3.org/TR/rdf-syntax-grammar/) | rdf_xml | application/rdf+xml | no | yes |
|
|
75
|
+
| [RDF Turtle](http://www.w3.org/TeamSubmission/turtle/) | turtle | text/turtle | no | yes |
|
|
76
|
+
| [CSL-JSON](https://citationstyles.org/) | csl | application/vnd.citationstyles.csl+json | yes | yes |
|
|
77
|
+
| [Formatted text citation](https://citationstyles.org/) | citation | text/x-bibliography | no | yes |
|
|
78
|
+
| [Codemeta](https://codemeta.github.io/) | codemeta | application/vnd.codemeta.ld+json | yes | yes |
|
|
79
|
+
| [Citation File Format (CFF)](https://citation-file-format.github.io/) | cff | application/vnd.cff+yaml | yes | yes |
|
|
80
|
+
| [JATS](https://jats.nlm.nih.gov/) | jats | application/vnd.jats+xml | no | yes |
|
|
81
|
+
| [CSV](https://en.wikipedia.org/wiki/Comma-separated_values) | csv | text/csv | no | yes |
|
|
82
|
+
| [BibTex](http://en.wikipedia.org/wiki/BibTeX) | bibtex | application/x-bibtex | yes | yes |
|
|
83
|
+
| [RIS](http://en.wikipedia.org/wiki/RIS_(file_format)) | ris | application/x-research-info-systems | yes | yes |
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
{
|
|
2
|
+
"cells": [
|
|
3
|
+
{
|
|
4
|
+
"cell_type": "raw",
|
|
5
|
+
"metadata": {},
|
|
6
|
+
"source": [
|
|
7
|
+
"---\n",
|
|
8
|
+
"title: BibTex Reader\n",
|
|
9
|
+
"description: |\n",
|
|
10
|
+
" This notebook shows how to read metadata in BibTex format.\n",
|
|
11
|
+
"---"
|
|
12
|
+
]
|
|
13
|
+
},
|
|
14
|
+
{
|
|
15
|
+
"cell_type": "markdown",
|
|
16
|
+
"metadata": {},
|
|
17
|
+
"source": [
|
|
18
|
+
"## Fetch the metadata"
|
|
19
|
+
]
|
|
20
|
+
}
|
|
21
|
+
],
|
|
22
|
+
"metadata": {
|
|
23
|
+
"kernelspec": {
|
|
24
|
+
"display_name": "Ruby 3.2.2",
|
|
25
|
+
"language": "ruby",
|
|
26
|
+
"name": "ruby"
|
|
27
|
+
},
|
|
28
|
+
"language_info": {
|
|
29
|
+
"file_extension": ".rb",
|
|
30
|
+
"mimetype": "application/x-ruby",
|
|
31
|
+
"name": "ruby",
|
|
32
|
+
"version": "3.2.2"
|
|
33
|
+
}
|
|
34
|
+
},
|
|
35
|
+
"nbformat": 4,
|
|
36
|
+
"nbformat_minor": 2
|
|
37
|
+
}
|
data/docs/theme.scss
ADDED
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
{
|
|
2
|
+
"cells": [
|
|
3
|
+
{
|
|
4
|
+
"cell_type": "raw",
|
|
5
|
+
"metadata": {},
|
|
6
|
+
"source": [
|
|
7
|
+
"---\n",
|
|
8
|
+
"title: doi_utils\n",
|
|
9
|
+
"---"
|
|
10
|
+
]
|
|
11
|
+
}
|
|
12
|
+
],
|
|
13
|
+
"metadata": {
|
|
14
|
+
"kernelspec": {
|
|
15
|
+
"display_name": "Ruby 3.2.2",
|
|
16
|
+
"language": "ruby",
|
|
17
|
+
"name": "ruby"
|
|
18
|
+
},
|
|
19
|
+
"language_info": {
|
|
20
|
+
"file_extension": ".rb",
|
|
21
|
+
"mimetype": "application/x-ruby",
|
|
22
|
+
"name": "ruby",
|
|
23
|
+
"version": "3.2.2"
|
|
24
|
+
}
|
|
25
|
+
},
|
|
26
|
+
"nbformat": 4,
|
|
27
|
+
"nbformat_minor": 2
|
|
28
|
+
}
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
{
|
|
2
|
+
"cells": [
|
|
3
|
+
{
|
|
4
|
+
"cell_type": "raw",
|
|
5
|
+
"metadata": {},
|
|
6
|
+
"source": [
|
|
7
|
+
"---\n",
|
|
8
|
+
"title: BibTex Writer\n",
|
|
9
|
+
"description: |\n",
|
|
10
|
+
" This notebook shows how to generate BibTex metadata from a scholarly resource in commonmeta format generated by commonmeta-ruby.\n",
|
|
11
|
+
"---"
|
|
12
|
+
]
|
|
13
|
+
},
|
|
14
|
+
{
|
|
15
|
+
"cell_type": "markdown",
|
|
16
|
+
"metadata": {},
|
|
17
|
+
"source": [
|
|
18
|
+
"## Fetch the metadata\n",
|
|
19
|
+
"\n",
|
|
20
|
+
"As with all commonmeta-ruby notebooks, we start by fetching metadata, in this example a journal article via its Crossref DOI, and then convert it to the commonmeta format."
|
|
21
|
+
]
|
|
22
|
+
}
|
|
23
|
+
],
|
|
24
|
+
"metadata": {
|
|
25
|
+
"kernelspec": {
|
|
26
|
+
"display_name": "Ruby 3.2.2",
|
|
27
|
+
"language": "ruby",
|
|
28
|
+
"name": "ruby"
|
|
29
|
+
},
|
|
30
|
+
"language_info": {
|
|
31
|
+
"file_extension": ".rb",
|
|
32
|
+
"mimetype": "application/x-ruby",
|
|
33
|
+
"name": "ruby",
|
|
34
|
+
"version": "3.2.2"
|
|
35
|
+
}
|
|
36
|
+
},
|
|
37
|
+
"nbformat": 4,
|
|
38
|
+
"nbformat_minor": 2
|
|
39
|
+
}
|
data/lib/commonmeta/cli.rb
CHANGED
|
@@ -71,8 +71,8 @@ module Commonmeta
|
|
|
71
71
|
|
|
72
72
|
desc "", "encode_by_blog"
|
|
73
73
|
|
|
74
|
-
def encode_by_blog(
|
|
75
|
-
prefix =
|
|
74
|
+
def encode_by_blog(blog_slug)
|
|
75
|
+
prefix = get_doi_prefix_by_blog_slug(blog_slug)
|
|
76
76
|
return nil unless prefix.present?
|
|
77
77
|
puts encode_doi(prefix)
|
|
78
78
|
end
|
|
@@ -115,10 +115,10 @@ module Commonmeta
|
|
|
115
115
|
puts get_json_feed_by_blog(id)
|
|
116
116
|
end
|
|
117
117
|
|
|
118
|
-
desc "", "
|
|
118
|
+
desc "", "json_feed_blog_slug"
|
|
119
119
|
|
|
120
|
-
def
|
|
121
|
-
puts
|
|
120
|
+
def json_feed_blog_slug(slug)
|
|
121
|
+
puts get_json_feed_blog_slug(slug)
|
|
122
122
|
end
|
|
123
123
|
|
|
124
124
|
desc "", "update_ghost_post"
|
|
@@ -342,11 +342,17 @@ module Commonmeta
|
|
|
342
342
|
return xml if doi_from_url(id).blank? || url.blank?
|
|
343
343
|
|
|
344
344
|
xml.doi_data do
|
|
345
|
-
|
|
345
|
+
doi = doi_from_url(id).downcase
|
|
346
|
+
xml.doi(doi)
|
|
346
347
|
xml.resource(url)
|
|
347
348
|
xml.collection("property" => "text-mining") do
|
|
348
349
|
xml.item do
|
|
349
350
|
xml.resource(url, "mime_type" => "text/html")
|
|
351
|
+
if is_rogue_scholar_doi?(doi)
|
|
352
|
+
Array.wrap(files).each do |file|
|
|
353
|
+
xml.resource(file["url"], "mime_type" => file["mimeType"])
|
|
354
|
+
end
|
|
355
|
+
end
|
|
350
356
|
end
|
|
351
357
|
end
|
|
352
358
|
end
|
data/lib/commonmeta/doi_utils.rb
CHANGED
|
@@ -77,5 +77,10 @@ module Commonmeta
|
|
|
77
77
|
|
|
78
78
|
{ 'id' => "https://api.crossref.org/members/#{member_id}", 'name' => name }
|
|
79
79
|
end
|
|
80
|
+
|
|
81
|
+
def is_rogue_scholar_doi?(doi)
|
|
82
|
+
prefix = validate_prefix(doi)
|
|
83
|
+
%w[10.34732 10.53731 10.54900 10.57689 10.59348 10.59349 10.59350].include?(prefix)
|
|
84
|
+
end
|
|
80
85
|
end
|
|
81
86
|
end
|
data/lib/commonmeta/metadata.rb
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
# frozen_string_literal: truefiles
|
|
2
2
|
|
|
3
|
-
require_relative
|
|
3
|
+
require_relative "metadata_utils"
|
|
4
4
|
|
|
5
5
|
module Commonmeta
|
|
6
6
|
class Metadata
|
|
@@ -10,7 +10,11 @@ module Commonmeta
|
|
|
10
10
|
:email, :registrant
|
|
11
11
|
attr_reader :doc, :page_start, :page_end
|
|
12
12
|
attr_writer :id, :provider_id, :client_id, :doi, :alternate_identifiers, :contributors,
|
|
13
|
-
:titles, :publisher, :license, :date, :volume, :url, :version, :subjects,
|
|
13
|
+
:titles, :publisher, :license, :date, :volume, :url, :version, :subjects,
|
|
14
|
+
:descriptions, :language, :sizes, :formats, :schema_version, :meta, :container,
|
|
15
|
+
:provider, :format, :funding_references, :state, :geo_locations, :type,
|
|
16
|
+
:additional_type, :files, :references, :related_identifiers, :related_items,
|
|
17
|
+
:style, :locale, :archive_locations
|
|
14
18
|
|
|
15
19
|
def initialize(options = {})
|
|
16
20
|
options.symbolize_keys!
|
|
@@ -23,29 +27,29 @@ module Commonmeta
|
|
|
23
27
|
|
|
24
28
|
# mEDRA, KISTI, JaLC and OP DOIs are found in the Crossref index
|
|
25
29
|
case @from
|
|
26
|
-
when
|
|
27
|
-
ra =
|
|
28
|
-
when
|
|
29
|
-
ra =
|
|
30
|
-
when
|
|
31
|
-
ra =
|
|
32
|
-
when
|
|
33
|
-
ra =
|
|
30
|
+
when "medra"
|
|
31
|
+
ra = "mEDRA"
|
|
32
|
+
when "kisti"
|
|
33
|
+
ra = "KISTI"
|
|
34
|
+
when "jalc"
|
|
35
|
+
ra = "JaLC"
|
|
36
|
+
when "op"
|
|
37
|
+
ra = "OP"
|
|
34
38
|
end
|
|
35
39
|
|
|
36
40
|
# generate name for method to call dynamically
|
|
37
41
|
hsh = @from.present? ? send("get_#{@from}", id: id, **options) : {}
|
|
38
|
-
string = hsh.fetch(
|
|
42
|
+
string = hsh.fetch("string", nil)
|
|
39
43
|
elsif options[:input].present? && File.exist?(options[:input])
|
|
40
44
|
filename = File.basename(options[:input])
|
|
41
45
|
ext = File.extname(options[:input])
|
|
42
46
|
if %w[.bib .ris .xml .json .cff].include?(ext)
|
|
43
47
|
hsh = {
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
48
|
+
"url" => options[:url],
|
|
49
|
+
"state" => options[:state],
|
|
50
|
+
"provider_id" => options[:provider_id],
|
|
51
|
+
"client_id" => options[:client_id],
|
|
52
|
+
"files" => options[:files],
|
|
49
53
|
}
|
|
50
54
|
string = File.read(options[:input])
|
|
51
55
|
@from = options[:from] || find_from_format(string: string, ext: ext)
|
|
@@ -55,14 +59,14 @@ module Commonmeta
|
|
|
55
59
|
end
|
|
56
60
|
else
|
|
57
61
|
hsh = {
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
62
|
+
"url" => options[:url],
|
|
63
|
+
"state" => options[:state],
|
|
64
|
+
"provider_id" => options[:provider_id],
|
|
65
|
+
"client_id" => options[:client_id],
|
|
66
|
+
"files" => options[:files],
|
|
67
|
+
"contributors" => options[:contributors],
|
|
68
|
+
"titles" => options[:titles],
|
|
69
|
+
"publisher" => options[:publisher],
|
|
66
70
|
}
|
|
67
71
|
string = options[:input]
|
|
68
72
|
@from = options[:from] || find_from_format(string: string)
|
|
@@ -70,7 +74,7 @@ module Commonmeta
|
|
|
70
74
|
|
|
71
75
|
# make sure input is encoded as utf8
|
|
72
76
|
if string.present? && string.is_a?(String)
|
|
73
|
-
dup_string = string.dup.force_encoding(
|
|
77
|
+
dup_string = string.dup.force_encoding("UTF-8").encode!
|
|
74
78
|
end
|
|
75
79
|
@string = dup_string
|
|
76
80
|
|
|
@@ -81,11 +85,11 @@ module Commonmeta
|
|
|
81
85
|
@sandbox = options[:sandbox]
|
|
82
86
|
|
|
83
87
|
# options that come from the datacite database
|
|
84
|
-
@url = hsh.to_h[
|
|
85
|
-
@state = hsh.to_h[
|
|
86
|
-
@provider_id = hsh.to_h[
|
|
87
|
-
@client_id = hsh.to_h[
|
|
88
|
-
@files = hsh.to_h[
|
|
88
|
+
@url = hsh.to_h["url"].presence || options[:url].presence
|
|
89
|
+
@state = hsh.to_h["state"].presence
|
|
90
|
+
@provider_id = hsh.to_h["provider_id"].presence
|
|
91
|
+
@client_id = hsh.to_h["client_id"].presence
|
|
92
|
+
@files = hsh.to_h["files"].presence
|
|
89
93
|
|
|
90
94
|
# options that come from the cli, needed
|
|
91
95
|
# for crossref doi registration
|
|
@@ -125,23 +129,23 @@ module Commonmeta
|
|
|
125
129
|
end
|
|
126
130
|
|
|
127
131
|
def id
|
|
128
|
-
@id ||= meta.fetch(
|
|
132
|
+
@id ||= meta.fetch("id", nil)
|
|
129
133
|
end
|
|
130
134
|
|
|
131
135
|
def doi
|
|
132
|
-
@doi ||= meta.fetch(
|
|
136
|
+
@doi ||= meta.fetch("doi", nil)
|
|
133
137
|
end
|
|
134
138
|
|
|
135
139
|
def provider_id
|
|
136
|
-
@provider_id ||= meta.fetch(
|
|
140
|
+
@provider_id ||= meta.fetch("provider_id", nil)
|
|
137
141
|
end
|
|
138
142
|
|
|
139
143
|
def client_id
|
|
140
|
-
@client_id ||= meta.fetch(
|
|
144
|
+
@client_id ||= meta.fetch("client_id", nil)
|
|
141
145
|
end
|
|
142
146
|
|
|
143
147
|
def exists?
|
|
144
|
-
(@state || meta.fetch(
|
|
148
|
+
(@state || meta.fetch("state", nil)) != "not_found"
|
|
145
149
|
end
|
|
146
150
|
|
|
147
151
|
def valid?
|
|
@@ -151,111 +155,111 @@ module Commonmeta
|
|
|
151
155
|
# Catch errors in the reader
|
|
152
156
|
# Then validate against JSON schema for Commonmeta
|
|
153
157
|
def errors
|
|
154
|
-
meta.fetch(
|
|
158
|
+
meta.fetch("errors", nil) || json_schema_errors
|
|
155
159
|
end
|
|
156
160
|
|
|
157
161
|
def descriptions
|
|
158
|
-
@descriptions ||= meta.fetch(
|
|
162
|
+
@descriptions ||= meta.fetch("descriptions", nil)
|
|
159
163
|
end
|
|
160
164
|
|
|
161
165
|
def license
|
|
162
|
-
@license ||= meta.fetch(
|
|
166
|
+
@license ||= meta.fetch("license", nil)
|
|
163
167
|
end
|
|
164
168
|
|
|
165
169
|
def subjects
|
|
166
|
-
@subjects ||= meta.fetch(
|
|
170
|
+
@subjects ||= meta.fetch("subjects", nil)
|
|
167
171
|
end
|
|
168
172
|
|
|
169
173
|
def language
|
|
170
|
-
@language ||= meta.fetch(
|
|
174
|
+
@language ||= meta.fetch("language", nil)
|
|
171
175
|
end
|
|
172
176
|
|
|
173
177
|
def sizes
|
|
174
|
-
@sizes ||= meta.fetch(
|
|
178
|
+
@sizes ||= meta.fetch("sizes", nil)
|
|
175
179
|
end
|
|
176
180
|
|
|
177
181
|
def formats
|
|
178
|
-
@formats ||= meta.fetch(
|
|
182
|
+
@formats ||= meta.fetch("formats", nil)
|
|
179
183
|
end
|
|
180
184
|
|
|
181
185
|
def schema_version
|
|
182
|
-
@schema_version ||= meta.fetch(
|
|
186
|
+
@schema_version ||= meta.fetch("schema_version", nil)
|
|
183
187
|
end
|
|
184
188
|
|
|
185
189
|
def funding_references
|
|
186
|
-
@funding_references ||= meta.fetch(
|
|
190
|
+
@funding_references ||= meta.fetch("funding_references", nil)
|
|
187
191
|
end
|
|
188
192
|
|
|
189
193
|
def references
|
|
190
|
-
@references ||= meta.fetch(
|
|
194
|
+
@references ||= meta.fetch("references", nil)
|
|
191
195
|
end
|
|
192
196
|
|
|
193
197
|
def related_identifiers
|
|
194
|
-
@related_identifiers ||= meta.fetch(
|
|
198
|
+
@related_identifiers ||= meta.fetch("related_identifiers", nil)
|
|
195
199
|
end
|
|
196
200
|
|
|
197
201
|
def related_items
|
|
198
|
-
@related_items ||= meta.fetch(
|
|
202
|
+
@related_items ||= meta.fetch("related_items", nil)
|
|
199
203
|
end
|
|
200
204
|
|
|
201
205
|
def url
|
|
202
|
-
@url ||= meta.fetch(
|
|
206
|
+
@url ||= meta.fetch("url", nil)
|
|
203
207
|
end
|
|
204
208
|
|
|
205
209
|
def version
|
|
206
|
-
@version ||= meta.fetch(
|
|
210
|
+
@version ||= meta.fetch("version", nil)
|
|
207
211
|
end
|
|
208
212
|
|
|
209
213
|
def container
|
|
210
|
-
@container ||= meta.fetch(
|
|
214
|
+
@container ||= meta.fetch("container", nil)
|
|
211
215
|
end
|
|
212
216
|
|
|
213
217
|
def geo_locations
|
|
214
|
-
@geo_locations ||= meta.fetch(
|
|
218
|
+
@geo_locations ||= meta.fetch("geo_locations", nil)
|
|
215
219
|
end
|
|
216
220
|
|
|
217
221
|
def date
|
|
218
|
-
@date ||= meta.fetch(
|
|
222
|
+
@date ||= meta.fetch("date", nil)
|
|
219
223
|
end
|
|
220
224
|
|
|
221
225
|
def publisher
|
|
222
|
-
@publisher ||= meta.fetch(
|
|
226
|
+
@publisher ||= meta.fetch("publisher", nil)
|
|
223
227
|
end
|
|
224
228
|
|
|
225
229
|
def alternate_identifiers
|
|
226
|
-
@alternate_identifiers ||= meta.fetch(
|
|
230
|
+
@alternate_identifiers ||= meta.fetch("alternate_identifiers", nil)
|
|
227
231
|
end
|
|
228
232
|
|
|
229
233
|
def files
|
|
230
|
-
@files ||= meta.fetch(
|
|
234
|
+
@files ||= meta.fetch("files", nil)
|
|
231
235
|
end
|
|
232
236
|
|
|
233
237
|
def provider
|
|
234
|
-
@provider ||= meta.fetch(
|
|
238
|
+
@provider ||= meta.fetch("provider", nil)
|
|
235
239
|
end
|
|
236
240
|
|
|
237
241
|
def state
|
|
238
|
-
@state ||= meta.fetch(
|
|
242
|
+
@state ||= meta.fetch("state", nil)
|
|
239
243
|
end
|
|
240
244
|
|
|
241
245
|
def type
|
|
242
|
-
@type ||= meta.fetch(
|
|
246
|
+
@type ||= meta.fetch("type", nil)
|
|
243
247
|
end
|
|
244
248
|
|
|
245
249
|
def additional_type
|
|
246
|
-
@additional_type ||= meta.fetch(
|
|
250
|
+
@additional_type ||= meta.fetch("additional_type", nil)
|
|
247
251
|
end
|
|
248
252
|
|
|
249
253
|
def titles
|
|
250
|
-
@titles ||= meta.fetch(
|
|
254
|
+
@titles ||= meta.fetch("titles", nil)
|
|
251
255
|
end
|
|
252
256
|
|
|
253
257
|
def contributors
|
|
254
|
-
@contributors ||= meta.fetch(
|
|
258
|
+
@contributors ||= meta.fetch("contributors", nil)
|
|
255
259
|
end
|
|
256
260
|
|
|
257
261
|
def archive_locations
|
|
258
|
-
@archive_locations ||= meta.fetch(
|
|
262
|
+
@archive_locations ||= meta.fetch("archive_locations", nil)
|
|
259
263
|
end
|
|
260
264
|
end
|
|
261
265
|
end
|
|
@@ -69,7 +69,7 @@ module Commonmeta
|
|
|
69
69
|
funding_references = get_funding_references(meta)
|
|
70
70
|
related_identifiers = get_related_identifiers(meta)
|
|
71
71
|
alternate_identifiers = [{ "alternateIdentifier" => meta["id"], "alternateIdentifierType" => "UUID" }]
|
|
72
|
-
|
|
72
|
+
files = get_files(id)
|
|
73
73
|
archive_url = meta.fetch("archive_url", nil)
|
|
74
74
|
|
|
75
75
|
if archive_url
|
|
@@ -99,10 +99,20 @@ module Commonmeta
|
|
|
99
99
|
"funding_references" => funding_references.presence,
|
|
100
100
|
"related_identifiers" => related_identifiers.presence,
|
|
101
101
|
"alternate_identifiers" => alternate_identifiers,
|
|
102
|
+
"files" => files.presence,
|
|
102
103
|
"archive_locations" => archive_locations,
|
|
103
104
|
"state" => state }.compact.merge(read_options)
|
|
104
105
|
end
|
|
105
106
|
|
|
107
|
+
def get_files(id)
|
|
108
|
+
doi = doi_from_url(id)
|
|
109
|
+
return nil unless is_rogue_scholar_doi?(doi)
|
|
110
|
+
|
|
111
|
+
[{ "mimeType" => "text/markdown", "url" => "https://api.rogue-scholar.org/posts/#{doi}.md" },
|
|
112
|
+
{ "mimeType" => "application/pdf", "url" => "https://api.rogue-scholar.org/posts/#{doi}.pdf" },
|
|
113
|
+
{ "mimeType" => "application/epub+zip", "url" => "https://api.rogue-scholar.org/posts/#{doi}.epub" }]
|
|
114
|
+
end
|
|
115
|
+
|
|
106
116
|
def get_references(meta)
|
|
107
117
|
# check that references resolve
|
|
108
118
|
Array.wrap(meta["reference"]).reduce([]) do |sum, reference|
|
|
@@ -212,8 +222,8 @@ module Commonmeta
|
|
|
212
222
|
blog["items"].map { |item| item["id"] }.first
|
|
213
223
|
end
|
|
214
224
|
|
|
215
|
-
def
|
|
216
|
-
# get JSON Feed item by id and return blog
|
|
225
|
+
def get_json_feed_blog_slug(id)
|
|
226
|
+
# get JSON Feed item by id and return blog slug
|
|
217
227
|
|
|
218
228
|
url = json_feed_item_by_id_url(id)
|
|
219
229
|
response = HTTP.get(url)
|
|
@@ -223,10 +233,10 @@ module Commonmeta
|
|
|
223
233
|
post.to_h.dig("blog", "slug")
|
|
224
234
|
end
|
|
225
235
|
|
|
226
|
-
def
|
|
236
|
+
def get_doi_prefix_by_blog_slug(blog_slug)
|
|
227
237
|
# for generating a random DOI.
|
|
228
238
|
|
|
229
|
-
url = json_feed_by_blog_url(
|
|
239
|
+
url = json_feed_by_blog_url(blog_slug)
|
|
230
240
|
response = HTTP.get(url)
|
|
231
241
|
return nil unless response.status.success?
|
|
232
242
|
|
data/lib/commonmeta/version.rb
CHANGED
data/spec/cli_spec.rb
CHANGED
|
@@ -379,9 +379,9 @@ describe Commonmeta::CLI do
|
|
|
379
379
|
expect { subject.json_feed_by_blog input }.to output(/3749f8c4-1ba7-4e51-9dd6-9d9551ad451a/).to_stdout
|
|
380
380
|
end
|
|
381
381
|
|
|
382
|
-
it "
|
|
382
|
+
it "json_feed_blog_slug" do
|
|
383
383
|
input = "01a92f9a-f8e0-442b-86e2-11530d9d5635"
|
|
384
|
-
expect { subject.
|
|
384
|
+
expect { subject.json_feed_blog_slug input }.to output(/eve/).to_stdout
|
|
385
385
|
end
|
|
386
386
|
end
|
|
387
387
|
end
|
data/spec/doi_utils_spec.rb
CHANGED
|
@@ -315,4 +315,18 @@ describe Commonmeta::Metadata, vcr: true do
|
|
|
315
315
|
expect(response).to eq('10.5061')
|
|
316
316
|
end
|
|
317
317
|
end
|
|
318
|
+
|
|
319
|
+
context 'is_rogue_scholar_doi' do
|
|
320
|
+
it 'rogue scholar doi' do
|
|
321
|
+
doi = '10.53731/cjx855h-hn5jtq8'
|
|
322
|
+
response = subject.is_rogue_scholar_doi?(doi)
|
|
323
|
+
expect(response).to be true
|
|
324
|
+
end
|
|
325
|
+
|
|
326
|
+
it 'not a rogue scholar doi' do
|
|
327
|
+
doi = '10.1371/journal.pone.0000030'
|
|
328
|
+
response = subject.is_rogue_scholar_doi?(doi)
|
|
329
|
+
expect(response).to be false
|
|
330
|
+
end
|
|
331
|
+
end
|
|
318
332
|
end
|