commonmeta-ruby 3.0.10 → 3.2.1

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.
Files changed (47) hide show
  1. checksums.yaml +4 -4
  2. data/Gemfile.lock +37 -36
  3. data/bin/commonmeta +1 -1
  4. data/commonmeta.gemspec +1 -1
  5. data/lib/commonmeta/cli.rb +7 -0
  6. data/lib/commonmeta/metadata_utils.rb +2 -0
  7. data/lib/commonmeta/readers/json_feed_reader.rb +90 -0
  8. data/lib/commonmeta/utils.rb +23 -0
  9. data/lib/commonmeta/version.rb +1 -1
  10. data/spec/author_utils_spec.rb +10 -0
  11. data/spec/cli_spec.rb +8 -0
  12. data/spec/fixtures/vcr_cassettes/Commonmeta_CLI/json_feed/blog_post.yml +360 -0
  13. data/spec/fixtures/vcr_cassettes/Commonmeta_Metadata/get_json_feed/citation_style_language.yml +360 -0
  14. data/spec/fixtures/vcr_cassettes/Commonmeta_Metadata/get_json_feed/citation_style_language_blog.yml +360 -0
  15. data/spec/fixtures/vcr_cassettes/Commonmeta_Metadata/get_json_feed/front-matter_blog.yml +1034 -0
  16. data/spec/fixtures/vcr_cassettes/Commonmeta_Metadata/get_json_feed/upstream.yml +2438 -0
  17. data/spec/fixtures/vcr_cassettes/Commonmeta_Metadata/get_json_feed/upstream_blog.yml +2438 -0
  18. data/spec/fixtures/vcr_cassettes/Commonmeta_Metadata/get_json_feed_item_metadata/blogger_post.yml +94 -0
  19. data/spec/fixtures/vcr_cassettes/Commonmeta_Metadata/get_json_feed_item_metadata/ghost_post_with_doi.yml +117 -0
  20. data/spec/fixtures/vcr_cassettes/Commonmeta_Metadata/get_json_feed_item_metadata/jekyll_post.yml +87 -0
  21. data/spec/fixtures/vcr_cassettes/Commonmeta_Metadata/get_json_feed_item_metadata/wordpress_post.yml +163 -0
  22. data/spec/fixtures/vcr_cassettes/Commonmeta_Metadata/get_json_feed_metadata/blogger_post.yml +141 -0
  23. data/spec/fixtures/vcr_cassettes/Commonmeta_Metadata/get_json_feed_metadata/ghost_post_with_doi.yml +164 -0
  24. data/spec/fixtures/vcr_cassettes/Commonmeta_Metadata/get_json_feed_metadata/jekyll_post.yml +134 -0
  25. data/spec/fixtures/vcr_cassettes/Commonmeta_Metadata/get_json_feed_metadata/wordpress_post.yml +210 -0
  26. data/spec/fixtures/vcr_cassettes/Commonmeta_Metadata/get_json_item_metadata/blogger_post.yml +94 -0
  27. data/spec/fixtures/vcr_cassettes/Commonmeta_Metadata/get_json_item_metadata/ghost_post.yml +117 -0
  28. data/spec/fixtures/vcr_cassettes/Commonmeta_Metadata/get_json_item_metadata/ghost_post_with_doi.yml +117 -0
  29. data/spec/fixtures/vcr_cassettes/Commonmeta_Metadata/get_json_item_metadata/jekyll_post.yml +170 -0
  30. data/spec/fixtures/vcr_cassettes/Commonmeta_Metadata/get_json_item_metadata/wordpress_post.yml +163 -0
  31. data/spec/fixtures/vcr_cassettes/Commonmeta_Metadata/get_json_post_metadata/blogger_post.yml +141 -0
  32. data/spec/fixtures/vcr_cassettes/Commonmeta_Metadata/get_json_post_metadata/ghost_post_with_doi.yml +164 -0
  33. data/spec/fixtures/vcr_cassettes/Commonmeta_Metadata/get_json_post_metadata/jekyll_post.yml +134 -0
  34. data/spec/fixtures/vcr_cassettes/Commonmeta_Metadata/get_json_post_metadata/wordpress_post.yml +210 -0
  35. data/spec/fixtures/vcr_cassettes/Commonmeta_Metadata/get_link/license.yml +221 -0
  36. data/spec/fixtures/vcr_cassettes/Commonmeta_Metadata/get_link/url.yml +221 -0
  37. data/spec/fixtures/vcr_cassettes/Commonmeta_Metadata/json_feed_url/front-matter_blog.yml +221 -0
  38. data/spec/fixtures/vcr_cassettes/Commonmeta_Metadata/write_metadata_as_crossref/json_feed_item_from_rogue_scholar_with_doi.yml +163 -0
  39. data/spec/fixtures/vcr_cassettes/Commonmeta_Metadata/write_metadata_as_crossref/json_feed_item_from_upstream_blog.yml +243 -0
  40. data/spec/fixtures/vcr_cassettes/Commonmeta_Metadata/write_metadata_as_crossref/json_item_from_rogue_scholar_with_doi.yml +163 -0
  41. data/spec/fixtures/vcr_cassettes/Commonmeta_Metadata/write_metadata_as_crossref/json_item_from_upstream_blog.yml +243 -0
  42. data/spec/fixtures/vcr_cassettes/Commonmeta_Metadata/write_metadata_as_crossref/json_post_from_rogue_scholar_with_doi.yml +210 -0
  43. data/spec/fixtures/vcr_cassettes/Commonmeta_Metadata/write_metadata_as_crossref/json_post_from_upstream_blog.yml +290 -0
  44. data/spec/readers/json_feed_reader_spec.rb +110 -0
  45. data/spec/utils_spec.rb +338 -314
  46. data/spec/writers/crossref_xml_writer_spec.rb +183 -137
  47. metadata +39 -5
@@ -1,173 +1,219 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- require 'spec_helper'
3
+ require "spec_helper"
4
4
 
5
5
  describe Commonmeta::Metadata, vcr: true do
6
- context 'write metadata as crossref' do
7
- it 'journal article' do
6
+ context "write metadata as crossref" do
7
+ it "journal article" do
8
8
  input = "#{fixture_path}crossref.xml"
9
9
  subject = described_class.new(input: input)
10
10
  expect(subject.valid?).to be true
11
- expect(subject.id).to eq('https://doi.org/10.7554/elife.01567')
12
- expect(subject.url).to eq('https://elifesciences.org/articles/01567')
13
- crossref_xml = Hash.from_xml(subject.crossref_xml).dig('crossref_result', 'query_result',
14
- 'body', 'query', 'doi_record', 'crossref', 'journal')
15
- expect(crossref_xml.dig('journal_metadata', 'full_title')).to eq('eLife')
16
- expect(crossref_xml.dig('journal_article', 'doi_data', 'doi')).to eq('10.7554/eLife.01567')
17
- expect(crossref_xml.dig('journal_article', 'citation_list', 'citation').length).to eq(27)
18
- expect(crossref_xml.dig('journal_article', 'citation_list',
19
- 'citation').first).to eq('article_title' => 'APL regulates vascular tissue identity in Arabidopsis',
20
- 'author' => 'Bonke',
21
- 'cYear' => '2003',
22
- 'doi' => '10.1038/nature02100',
23
- 'first_page' => '181',
24
- 'journal_title' => 'Nature',
25
- 'key' => 'bib1',
26
- 'volume' => '426')
11
+ expect(subject.id).to eq("https://doi.org/10.7554/elife.01567")
12
+ expect(subject.url).to eq("https://elifesciences.org/articles/01567")
13
+ crossref_xml = Hash.from_xml(subject.crossref_xml).dig("crossref_result", "query_result",
14
+ "body", "query", "doi_record", "crossref", "journal")
15
+ expect(crossref_xml.dig("journal_metadata", "full_title")).to eq("eLife")
16
+ expect(crossref_xml.dig("journal_article", "doi_data", "doi")).to eq("10.7554/eLife.01567")
17
+ expect(crossref_xml.dig("journal_article", "citation_list", "citation").length).to eq(27)
18
+ expect(crossref_xml.dig("journal_article", "citation_list",
19
+ "citation").first).to eq("article_title" => "APL regulates vascular tissue identity in Arabidopsis",
20
+ "author" => "Bonke",
21
+ "cYear" => "2003",
22
+ "doi" => "10.1038/nature02100",
23
+ "first_page" => "181",
24
+ "journal_title" => "Nature",
25
+ "key" => "bib1",
26
+ "volume" => "426")
27
27
  end
28
28
 
29
- it 'posted_content' do
30
- subject = described_class.new(input: '10.1101/2020.12.01.406702', depositor: 'test', email: 'info@example.org', registrant: 'test')
29
+ it "posted_content" do
30
+ subject = described_class.new(input: "10.1101/2020.12.01.406702", depositor: "test", email: "info@example.org", registrant: "test")
31
31
  expect(subject.valid?).to be true
32
- expect(subject.id).to eq('https://doi.org/10.1101/2020.12.01.406702')
33
- expect(subject.url).to eq('http://biorxiv.org/lookup/doi/10.1101/2020.12.01.406702')
34
- crossref_xml = Hash.from_xml(subject.crossref_xml).dig('doi_batch', 'body', 'posted_content')
35
- expect(crossref_xml.dig('doi_data', 'doi')).to eq('10.1101/2020.12.01.406702')
36
- expect(crossref_xml.dig('doi_data', 'resource')).to eq('http://biorxiv.org/lookup/doi/10.1101/2020.12.01.406702')
32
+ expect(subject.id).to eq("https://doi.org/10.1101/2020.12.01.406702")
33
+ expect(subject.url).to eq("http://biorxiv.org/lookup/doi/10.1101/2020.12.01.406702")
34
+ crossref_xml = Hash.from_xml(subject.crossref_xml).dig("doi_batch", "body", "posted_content")
35
+ expect(crossref_xml.dig("doi_data", "doi")).to eq("10.1101/2020.12.01.406702")
36
+ expect(crossref_xml.dig("doi_data", "resource")).to eq("http://biorxiv.org/lookup/doi/10.1101/2020.12.01.406702")
37
37
  end
38
38
 
39
- it 'journal article from datacite' do
40
- input = '10.2312/geowissenschaften.1989.7.181'
41
- subject = described_class.new(input: input, from: 'datacite')
39
+ it "journal article from datacite" do
40
+ input = "10.2312/geowissenschaften.1989.7.181"
41
+ subject = described_class.new(input: input, from: "datacite")
42
42
  expect(subject.valid?).to be false
43
43
  expect(subject.errors).to eq(["property '/descriptions/0' is missing required keys: description"])
44
- expect(subject.id).to eq('https://doi.org/10.2312/geowissenschaften.1989.7.181')
45
- expect(subject.url).to eq('https://www.tib.eu/suchen/id/awi:7058a56c5e43afd705af945d01536b9aaeeee491')
46
- expect(subject.type).to eq('JournalArticle')
47
- expect(subject.titles).to eq([{ 'title' => 'An Overview of the Geology of Canadian Gold Occurrences' }])
48
- expect(subject.publisher).to eq('name' => 'VCH Verlagsgesellschaft mbH')
49
- crossref_xml = Hash.from_xml(subject.crossref_xml).dig('doi_batch', 'body', 'journal',
50
- 'journal_article')
51
- expect(Array.wrap(crossref_xml.dig('contributors', 'person_name')).length).to eq(1)
52
- expect(Array.wrap(crossref_xml.dig('contributors',
53
- 'person_name')).first).to eq('contributor_role' => 'author', 'given_name' => 'David J',
54
- 'sequence' => 'first', 'surname' => 'Mossman')
55
- expect(crossref_xml.dig('titles',
56
- 'title')).to eq('An Overview of the Geology of Canadian Gold Occurrences')
44
+ expect(subject.id).to eq("https://doi.org/10.2312/geowissenschaften.1989.7.181")
45
+ expect(subject.url).to eq("https://www.tib.eu/suchen/id/awi:7058a56c5e43afd705af945d01536b9aaeeee491")
46
+ expect(subject.type).to eq("JournalArticle")
47
+ expect(subject.titles).to eq([{ "title" => "An Overview of the Geology of Canadian Gold Occurrences" }])
48
+ expect(subject.publisher).to eq("name" => "VCH Verlagsgesellschaft mbH")
49
+ crossref_xml = Hash.from_xml(subject.crossref_xml).dig("doi_batch", "body", "journal",
50
+ "journal_article")
51
+ expect(Array.wrap(crossref_xml.dig("contributors", "person_name")).length).to eq(1)
52
+ expect(Array.wrap(crossref_xml.dig("contributors",
53
+ "person_name")).first).to eq("contributor_role" => "author", "given_name" => "David J",
54
+ "sequence" => "first", "surname" => "Mossman")
55
+ expect(crossref_xml.dig("titles",
56
+ "title")).to eq("An Overview of the Geology of Canadian Gold Occurrences")
57
57
  end
58
58
 
59
- it 'schema.org from front matter' do
60
- input = 'https://blog.front-matter.io/posts/editorial-by-more-than-200-call-for-emergency-action-to-limit-global-temperature-increases-restore-biodiversity-and-protect-health'
61
- subject = described_class.new(input: input, from: 'schema_org')
59
+ it "schema.org from front matter" do
60
+ input = "https://blog.front-matter.io/posts/editorial-by-more-than-200-call-for-emergency-action-to-limit-global-temperature-increases-restore-biodiversity-and-protect-health"
61
+ subject = described_class.new(input: input, from: "schema_org")
62
62
  expect(subject.valid?).to be true
63
- expect(subject.id).to eq('https://doi.org/10.53731/r9nqx6h-97aq74v-ag7bw')
64
- expect(subject.url).to eq('https://blog.front-matter.io/posts/editorial-by-more-than-200-call-for-emergency-action-to-limit-global-temperature-increases-restore-biodiversity-and-protect-health')
65
- expect(subject.type).to eq('Article')
66
- expect(subject.titles).to eq([{ 'title' => 'Editorial by more than 200 health journals: Call for emergency action to limit global temperature increases, restore biodiversity, and protect health' }])
67
- expect(subject.creators).to eq([{ 'familyName' => 'Fenner',
68
- 'givenName' => 'Martin',
69
- 'id' => 'https://orcid.org/0000-0003-1419-2405',
70
- 'type' => 'Person' }])
71
- expect(subject.subjects).to eq([{ 'subject' => 'news' }])
72
- expect(subject.language).to eq('en')
73
- expect(subject.license).to eq('id' => 'CC-BY-4.0',
74
- 'url' => 'https://creativecommons.org/licenses/by/4.0/legalcode')
75
- crossref_xml = Hash.from_xml(subject.crossref_xml).dig('doi_batch', 'body', 'posted_content')
76
- expect(crossref_xml.dig('titles',
77
- 'title')).to eq('Editorial by more than 200 health journals: Call for emergency action to limit global temperature increases, restore biodiversity, and protect health')
63
+ expect(subject.id).to eq("https://doi.org/10.53731/r9nqx6h-97aq74v-ag7bw")
64
+ expect(subject.url).to eq("https://blog.front-matter.io/posts/editorial-by-more-than-200-call-for-emergency-action-to-limit-global-temperature-increases-restore-biodiversity-and-protect-health")
65
+ expect(subject.type).to eq("Article")
66
+ expect(subject.titles).to eq([{ "title" => "Editorial by more than 200 health journals: Call for emergency action to limit global temperature increases, restore biodiversity, and protect health" }])
67
+ expect(subject.creators).to eq([{ "familyName" => "Fenner",
68
+ "givenName" => "Martin",
69
+ "id" => "https://orcid.org/0000-0003-1419-2405",
70
+ "type" => "Person" }])
71
+ expect(subject.subjects).to eq([{ "subject" => "news" }])
72
+ expect(subject.language).to eq("en")
73
+ expect(subject.license).to eq("id" => "CC-BY-4.0",
74
+ "url" => "https://creativecommons.org/licenses/by/4.0/legalcode")
75
+ crossref_xml = Hash.from_xml(subject.crossref_xml).dig("doi_batch", "body", "posted_content")
76
+ expect(crossref_xml.dig("titles",
77
+ "title")).to eq("Editorial by more than 200 health journals: Call for emergency action to limit global temperature increases, restore biodiversity, and protect health")
78
78
  end
79
79
 
80
- it 'another schema.org from front-matter' do
81
- input = 'https://blog.front-matter.io/posts/dryad-interview-jen-gibson'
82
- subject = described_class.new(input: input, from: 'schema_org')
80
+ it "another schema.org from front-matter" do
81
+ input = "https://blog.front-matter.io/posts/dryad-interview-jen-gibson"
82
+ subject = described_class.new(input: input, from: "schema_org")
83
83
  expect(subject.valid?).to be true
84
- expect(subject.id).to eq('https://doi.org/10.53731/rceh7pn-tzg61kj-7zv63')
85
- expect(subject.url).to eq('https://blog.front-matter.io/posts/dryad-interview-jen-gibson')
86
- expect(subject.type).to eq('Article')
87
- expect(subject.titles).to eq([{ 'title' => 'Dryad: Interview with Jen Gibson' }])
88
- expect(subject.creators).to eq([{ 'familyName' => 'Fenner',
89
- 'givenName' => 'Martin',
90
- 'id' => 'https://orcid.org/0000-0003-1419-2405',
91
- 'type' => 'Person' }])
92
- expect(subject.subjects).to eq([{ 'subject' => 'interview' }])
93
- expect(subject.container).to eq('identifier' => '2749-9952', 'identifierType' => 'ISSN',
94
- 'title' => 'Front Matter', 'type' => 'Periodical')
95
- expect(subject.language).to eq('en')
96
- expect(subject.license).to eq('id' => 'CC-BY-4.0',
97
- 'url' => 'https://creativecommons.org/licenses/by/4.0/legalcode')
98
- crossref_xml = Hash.from_xml(subject.crossref_xml).dig('doi_batch', 'body', 'posted_content')
99
- expect(crossref_xml.dig('titles', 'title')).to eq('Dryad: Interview with Jen Gibson')
84
+ expect(subject.id).to eq("https://doi.org/10.53731/rceh7pn-tzg61kj-7zv63")
85
+ expect(subject.url).to eq("https://blog.front-matter.io/posts/dryad-interview-jen-gibson")
86
+ expect(subject.type).to eq("Article")
87
+ expect(subject.titles).to eq([{ "title" => "Dryad: Interview with Jen Gibson" }])
88
+ expect(subject.creators).to eq([{ "familyName" => "Fenner",
89
+ "givenName" => "Martin",
90
+ "id" => "https://orcid.org/0000-0003-1419-2405",
91
+ "type" => "Person" }])
92
+ expect(subject.subjects).to eq([{ "subject" => "interview" }])
93
+ expect(subject.container).to eq("identifier" => "2749-9952", "identifierType" => "ISSN",
94
+ "title" => "Front Matter", "type" => "Periodical")
95
+ expect(subject.language).to eq("en")
96
+ expect(subject.license).to eq("id" => "CC-BY-4.0",
97
+ "url" => "https://creativecommons.org/licenses/by/4.0/legalcode")
98
+ crossref_xml = Hash.from_xml(subject.crossref_xml).dig("doi_batch", "body", "posted_content")
99
+ expect(crossref_xml.dig("titles", "title")).to eq("Dryad: Interview with Jen Gibson")
100
100
  end
101
101
 
102
- it 'embedded schema.org from front matter' do
102
+ it "embedded schema.org from front matter" do
103
103
  input = "#{fixture_path}schema_org_front-matter.json"
104
- subject = described_class.new(input: input, from: 'schema_org')
104
+ subject = described_class.new(input: input, from: "schema_org")
105
105
  expect(subject.valid?).to be true
106
- expect(subject.id).to eq('https://doi.org/10.53731/r9nqx6h-97aq74v-ag7bw')
107
- expect(subject.url).to eq('https://blog.front-matter.io/posts/editorial-by-more-than-200-call-for-emergency-action-to-limit-global-temperature-increases-restore-biodiversity-and-protect-health')
108
- expect(subject.type).to eq('Article')
109
- expect(subject.container).to eq('identifier' => '2749-9952', 'identifierType' => 'ISSN',
110
- 'title' => 'Front Matter', 'type' => 'Periodical')
111
- expect(subject.titles).to eq([{ 'title' => 'Editorial by more than 200 health journals: Call for emergency action to limit global temperature increases, restore biodiversity, and protect health' }])
112
- crossref_xml = Hash.from_xml(subject.crossref_xml).dig('doi_batch', 'body', 'posted_content')
113
- expect(Array.wrap(crossref_xml.dig('contributors', 'person_name')).length).to eq(1)
114
- expect(Array.wrap(crossref_xml.dig('contributors',
115
- 'person_name')).first).to eq('ORCID' => 'https://orcid.org/0000-0003-1419-2405',
116
- 'contributor_role' => 'author', 'given_name' => 'Martin', 'sequence' => 'first', 'surname' => 'Fenner')
117
- expect(crossref_xml.dig('titles',
118
- 'title')).to eq('Editorial by more than 200 health journals: Call for emergency action to limit global temperature increases, restore biodiversity, and protect health')
106
+ expect(subject.id).to eq("https://doi.org/10.53731/r9nqx6h-97aq74v-ag7bw")
107
+ expect(subject.url).to eq("https://blog.front-matter.io/posts/editorial-by-more-than-200-call-for-emergency-action-to-limit-global-temperature-increases-restore-biodiversity-and-protect-health")
108
+ expect(subject.type).to eq("Article")
109
+ expect(subject.container).to eq("identifier" => "2749-9952", "identifierType" => "ISSN",
110
+ "title" => "Front Matter", "type" => "Periodical")
111
+ expect(subject.titles).to eq([{ "title" => "Editorial by more than 200 health journals: Call for emergency action to limit global temperature increases, restore biodiversity, and protect health" }])
112
+ crossref_xml = Hash.from_xml(subject.crossref_xml).dig("doi_batch", "body", "posted_content")
113
+ expect(Array.wrap(crossref_xml.dig("contributors", "person_name")).length).to eq(1)
114
+ expect(Array.wrap(crossref_xml.dig("contributors",
115
+ "person_name")).first).to eq("ORCID" => "https://orcid.org/0000-0003-1419-2405",
116
+ "contributor_role" => "author", "given_name" => "Martin", "sequence" => "first", "surname" => "Fenner")
117
+ expect(crossref_xml.dig("titles",
118
+ "title")).to eq("Editorial by more than 200 health journals: Call for emergency action to limit global temperature increases, restore biodiversity, and protect health")
119
119
  end
120
120
 
121
- it 'schema.org from another science blog' do
122
- input = 'https://donnywinston.com/posts/implementing-the-fair-principles-through-fair-enabling-artifacts-and-services/'
123
- subject = described_class.new(input: input, from: 'schema_org')
121
+ it "schema.org from another science blog" do
122
+ input = "https://donnywinston.com/posts/implementing-the-fair-principles-through-fair-enabling-artifacts-and-services/"
123
+ subject = described_class.new(input: input, from: "schema_org")
124
124
  expect(subject.valid?).to be true
125
- expect(subject.id).to eq('https://doi.org/10.57099/11h5yt3819')
126
- expect(subject.url).to eq('https://donnywinston.com/posts/implementing-the-fair-principles-through-fair-enabling-artifacts-and-services')
127
- expect(subject.type).to eq('Article')
128
- expect(subject.titles).to eq([{ 'title' => 'Implementing the FAIR Principles Through FAIR-Enabling Artifacts and Services' }])
129
- expect(subject.creators).to eq([{ 'familyName' => 'Winston',
130
- 'givenName' => 'Donny',
131
- 'id' => 'https://orcid.org/0000-0002-8424-0604',
132
- 'type' => 'Person' }])
125
+ expect(subject.id).to eq("https://doi.org/10.57099/11h5yt3819")
126
+ expect(subject.url).to eq("https://donnywinston.com/posts/implementing-the-fair-principles-through-fair-enabling-artifacts-and-services")
127
+ expect(subject.type).to eq("Article")
128
+ expect(subject.titles).to eq([{ "title" => "Implementing the FAIR Principles Through FAIR-Enabling Artifacts and Services" }])
129
+ expect(subject.creators).to eq([{ "familyName" => "Winston",
130
+ "givenName" => "Donny",
131
+ "id" => "https://orcid.org/0000-0002-8424-0604",
132
+ "type" => "Person" }])
133
133
  expect(subject.subjects).to eq([])
134
- expect(subject.container).to eq('identifier' => 'https://www.polyneme.xyz',
135
- 'identifierType' => 'URL', 'type' => 'Periodical')
136
- expect(subject.language).to eq('en-US')
137
- expect(subject.date).to eq('created' => '2022-10-21',
138
- 'published' => '2022-10-21',
139
- 'updated' => '2022-10-21')
140
- expect(subject.license).to eq('id' => 'CC-BY-4.0',
141
- 'url' => 'https://creativecommons.org/licenses/by/4.0/legalcode')
142
- crossref_xml = Hash.from_xml(subject.crossref_xml).dig('doi_batch', 'body', 'posted_content')
143
- expect(crossref_xml.dig('titles',
144
- 'title')).to eq('Implementing the FAIR Principles Through FAIR-Enabling Artifacts and Services')
134
+ expect(subject.container).to eq("identifier" => "https://www.polyneme.xyz",
135
+ "identifierType" => "URL", "type" => "Periodical")
136
+ expect(subject.language).to eq("en-US")
137
+ expect(subject.date).to eq("created" => "2022-10-21",
138
+ "published" => "2022-10-21",
139
+ "updated" => "2022-10-21")
140
+ expect(subject.license).to eq("id" => "CC-BY-4.0",
141
+ "url" => "https://creativecommons.org/licenses/by/4.0/legalcode")
142
+ crossref_xml = Hash.from_xml(subject.crossref_xml).dig("doi_batch", "body", "posted_content")
143
+ expect(crossref_xml.dig("titles",
144
+ "title")).to eq("Implementing the FAIR Principles Through FAIR-Enabling Artifacts and Services")
145
145
  end
146
146
 
147
- it 'schema.org from upstream blog' do
148
- input = 'https://upstream.force11.org/deep-dive-into-ethics-of-contributor-roles/'
149
- subject = described_class.new(input: input, from: 'schema_org')
147
+ it "schema.org from upstream blog" do
148
+ input = "https://upstream.force11.org/deep-dive-into-ethics-of-contributor-roles/"
149
+ subject = described_class.new(input: input, from: "schema_org")
150
150
 
151
151
  expect(subject.valid?).to be true
152
- expect(subject.id).to eq('https://doi.org/10.54900/rf84ag3-98f00rt-0phta')
153
- expect(subject.url).to eq('https://upstream.force11.org/deep-dive-into-ethics-of-contributor-roles')
154
- expect(subject.type).to eq('Article')
155
- expect(subject.titles).to eq([{ 'title' => 'Deep dive into ethics of Contributor Roles: report of a FORCE11 workshop' }])
152
+ expect(subject.id).to eq("https://doi.org/10.54900/rf84ag3-98f00rt-0phta")
153
+ expect(subject.url).to eq("https://upstream.force11.org/deep-dive-into-ethics-of-contributor-roles")
154
+ expect(subject.type).to eq("Article")
155
+ expect(subject.titles).to eq([{ "title" => "Deep dive into ethics of Contributor Roles: report of a FORCE11 workshop" }])
156
156
  expect(subject.creators.length).to eq(4)
157
- expect(subject.creators.first).to eq('familyName' => 'Hosseini',
158
- 'givenName' => 'Mohammad',
159
- 'type' => 'Person')
160
- expect(subject.subjects).to eq([{ 'subject' => 'news' }])
161
- expect(subject.language).to eq('en')
162
- expect(subject.license).to eq('id' => 'CC-BY-4.0',
163
- 'url' => 'https://creativecommons.org/licenses/by/4.0/legalcode')
164
- crossref_xml = Hash.from_xml(subject.crossref_xml).dig('doi_batch', 'body', 'posted_content')
165
- expect(Array.wrap(crossref_xml.dig('contributors', 'person_name')).length).to eq(4)
166
- expect(Array.wrap(crossref_xml.dig('contributors',
167
- 'person_name')).first).to eq('contributor_role' => 'author', 'given_name' => 'Mohammad',
168
- 'sequence' => 'first', 'surname' => 'Hosseini')
169
- expect(crossref_xml.dig('titles',
170
- 'title')).to eq('Deep dive into ethics of Contributor Roles: report of a FORCE11 workshop')
157
+ expect(subject.creators.first).to eq("familyName" => "Hosseini",
158
+ "givenName" => "Mohammad",
159
+ "type" => "Person")
160
+ expect(subject.subjects).to eq([{ "subject" => "news" }])
161
+ expect(subject.language).to eq("en")
162
+ expect(subject.license).to eq("id" => "CC-BY-4.0",
163
+ "url" => "https://creativecommons.org/licenses/by/4.0/legalcode")
164
+ crossref_xml = Hash.from_xml(subject.crossref_xml).dig("doi_batch", "body", "posted_content")
165
+ expect(Array.wrap(crossref_xml.dig("contributors", "person_name")).length).to eq(4)
166
+ expect(Array.wrap(crossref_xml.dig("contributors",
167
+ "person_name")).first).to eq("contributor_role" => "author", "given_name" => "Mohammad",
168
+ "sequence" => "first", "surname" => "Hosseini")
169
+ expect(crossref_xml.dig("titles",
170
+ "title")).to eq("Deep dive into ethics of Contributor Roles: report of a FORCE11 workshop")
171
+ end
172
+
173
+ it "json_feed_item from upstream blog" do
174
+ input = "https://rogue-scholar.org/api/posts/wve6rep4"
175
+ subject = described_class.new(input: input)
176
+
177
+ expect(subject.valid?).to be true
178
+ expect(subject.id).to eq("https://doi.org/10.54900/g0qks-tcz98")
179
+ expect(subject.url).to eq("https://upstream.force11.org/attempts-at-automating-journal-subject-classification")
180
+ expect(subject.type).to eq("Article")
181
+ expect(subject.titles).to eq([{ "title" => "Attempts at automating journal subject classification" }])
182
+ expect(subject.creators.length).to eq(1)
183
+ expect(subject.creators.first).to eq("familyName" => "Datta", "givenName" => "Esha", "id" => "https://orcid.org/0000-0001-9165-2757", "type" => "Person")
184
+ expect(subject.subjects).to eq([{ "subject" => "original research" }])
185
+ expect(subject.language).to eq("en")
186
+ expect(subject.license).to eq("id" => "CC-BY-4.0",
187
+ "url" => "https://creativecommons.org/licenses/by/4.0/legalcode")
188
+ crossref_xml = Hash.from_xml(subject.crossref_xml).dig("doi_batch", "body", "posted_content")
189
+ expect(Array.wrap(crossref_xml.dig("contributors", "person_name")).length).to eq(1)
190
+ expect(Array.wrap(crossref_xml.dig("contributors",
191
+ "person_name")).first).to eq("ORCID" => "https://orcid.org/0000-0001-9165-2757", "contributor_role" => "author", "given_name" => "Esha", "sequence" => "first", "surname" => "Datta")
192
+ expect(crossref_xml.dig("titles",
193
+ "title")).to eq("Attempts at automating journal subject classification")
194
+ end
195
+
196
+ it "json_feed_item from rogue scholar with doi" do
197
+ input = "https://rogue-scholar.org/api/posts/zkevlyd3"
198
+ subject = described_class.new(input: input, doi: "10.59350/9ry27-7cz42")
199
+
200
+ expect(subject.valid?).to be true
201
+ expect(subject.id).to eq("https://doi.org/10.59350/9ry27-7cz42")
202
+ expect(subject.url).to eq("https://wisspub.net/2023/05/23/eu-mitgliedstaaten-betonen-die-rolle-von-wissenschaftsgeleiteten-open-access-modellen-jenseits-von-apcs")
203
+ expect(subject.type).to eq("Article")
204
+ expect(subject.titles).to eq([{ "title" => "EU-Mitgliedstaaten betonen die Rolle von wissenschaftsgeleiteten Open-Access-Modellen jenseits von APCs" }])
205
+ expect(subject.creators.length).to eq(1)
206
+ expect(subject.creators.first).to eq("familyName"=>"Pampel", "givenName"=>"Heinz", "id"=>"https://orcid.org/0000-0003-3334-2771", "type"=>"Person")
207
+ expect(subject.subjects).to eq([{"subject"=>"open access"}, {"subject"=>"open access transformation"}, {"subject"=>"open science"}, {"subject"=>"eu"}])
208
+ expect(subject.language).to eq("de")
209
+ expect(subject.license).to eq("id" => "CC-BY-4.0",
210
+ "url" => "https://creativecommons.org/licenses/by/4.0/legalcode")
211
+ crossref_xml = Hash.from_xml(subject.crossref_xml).dig("doi_batch", "body", "posted_content")
212
+ expect(Array.wrap(crossref_xml.dig("contributors", "person_name")).length).to eq(1)
213
+ expect(Array.wrap(crossref_xml.dig("contributors",
214
+ "person_name")).first).to eq("ORCID"=>"https://orcid.org/0000-0003-3334-2771", "contributor_role"=>"author", "given_name"=>"Heinz", "sequence"=>"first", "surname"=>"Pampel")
215
+ expect(crossref_xml.dig("titles",
216
+ "title")).to eq("EU-Mitgliedstaaten betonen die Rolle von wissenschaftsgeleiteten Open-Access-Modellen jenseits von APCs")
171
217
  end
172
218
  end
173
219
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: commonmeta-ruby
3
3
  version: !ruby/object:Gem::Version
4
- version: 3.0.10
4
+ version: 3.2.1
5
5
  platform: ruby
6
6
  authors:
7
7
  - Martin Fenner
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2023-04-14 00:00:00.000000000 Z
11
+ date: 2023-06-04 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: activesupport
@@ -226,14 +226,14 @@ dependencies:
226
226
  requirements:
227
227
  - - "~>"
228
228
  - !ruby/object:Gem::Version
229
- version: 0.2.23
229
+ version: 1.0.1
230
230
  type: :runtime
231
231
  prerelease: false
232
232
  version_requirements: !ruby/object:Gem::Requirement
233
233
  requirements:
234
234
  - - "~>"
235
235
  - !ruby/object:Gem::Version
236
- version: 0.2.23
236
+ version: 1.0.1
237
237
  - !ruby/object:Gem::Dependency
238
238
  name: loofah
239
239
  requirement: !ruby/object:Gem::Requirement
@@ -596,6 +596,7 @@ files:
596
596
  - lib/commonmeta/readers/crossref_xml_reader.rb
597
597
  - lib/commonmeta/readers/csl_reader.rb
598
598
  - lib/commonmeta/readers/datacite_reader.rb
599
+ - lib/commonmeta/readers/json_feed_reader.rb
599
600
  - lib/commonmeta/readers/npm_reader.rb
600
601
  - lib/commonmeta/readers/ris_reader.rb
601
602
  - lib/commonmeta/readers/schema_org_reader.rb
@@ -1062,6 +1063,7 @@ files:
1062
1063
  - spec/fixtures/vcr_cassettes/Commonmeta_CLI/find_from_format_by_id/kisti.yml
1063
1064
  - spec/fixtures/vcr_cassettes/Commonmeta_CLI/find_from_format_by_id/medra.yml
1064
1065
  - spec/fixtures/vcr_cassettes/Commonmeta_CLI/find_from_format_by_id/op.yml
1066
+ - spec/fixtures/vcr_cassettes/Commonmeta_CLI/json_feed/blog_post.yml
1065
1067
  - spec/fixtures/vcr_cassettes/Commonmeta_Metadata/change_metadata_as_datacite_xml/with_data_citation.yml
1066
1068
  - spec/fixtures/vcr_cassettes/Commonmeta_Metadata/doi_registration_agency/crossref.yml
1067
1069
  - spec/fixtures/vcr_cassettes/Commonmeta_Metadata/doi_registration_agency/datacite.yml
@@ -1149,6 +1151,30 @@ files:
1149
1151
  - spec/fixtures/vcr_cassettes/Commonmeta_Metadata/get_datetime_from_time/nil.yml
1150
1152
  - spec/fixtures/vcr_cassettes/Commonmeta_Metadata/get_datetime_from_time/past.yml
1151
1153
  - spec/fixtures/vcr_cassettes/Commonmeta_Metadata/get_datetime_from_time/present.yml
1154
+ - spec/fixtures/vcr_cassettes/Commonmeta_Metadata/get_json_feed/citation_style_language.yml
1155
+ - spec/fixtures/vcr_cassettes/Commonmeta_Metadata/get_json_feed/citation_style_language_blog.yml
1156
+ - spec/fixtures/vcr_cassettes/Commonmeta_Metadata/get_json_feed/front-matter_blog.yml
1157
+ - spec/fixtures/vcr_cassettes/Commonmeta_Metadata/get_json_feed/upstream.yml
1158
+ - spec/fixtures/vcr_cassettes/Commonmeta_Metadata/get_json_feed/upstream_blog.yml
1159
+ - spec/fixtures/vcr_cassettes/Commonmeta_Metadata/get_json_feed_item_metadata/blogger_post.yml
1160
+ - spec/fixtures/vcr_cassettes/Commonmeta_Metadata/get_json_feed_item_metadata/ghost_post_with_doi.yml
1161
+ - spec/fixtures/vcr_cassettes/Commonmeta_Metadata/get_json_feed_item_metadata/jekyll_post.yml
1162
+ - spec/fixtures/vcr_cassettes/Commonmeta_Metadata/get_json_feed_item_metadata/wordpress_post.yml
1163
+ - spec/fixtures/vcr_cassettes/Commonmeta_Metadata/get_json_feed_metadata/blogger_post.yml
1164
+ - spec/fixtures/vcr_cassettes/Commonmeta_Metadata/get_json_feed_metadata/ghost_post_with_doi.yml
1165
+ - spec/fixtures/vcr_cassettes/Commonmeta_Metadata/get_json_feed_metadata/jekyll_post.yml
1166
+ - spec/fixtures/vcr_cassettes/Commonmeta_Metadata/get_json_feed_metadata/wordpress_post.yml
1167
+ - spec/fixtures/vcr_cassettes/Commonmeta_Metadata/get_json_item_metadata/blogger_post.yml
1168
+ - spec/fixtures/vcr_cassettes/Commonmeta_Metadata/get_json_item_metadata/ghost_post.yml
1169
+ - spec/fixtures/vcr_cassettes/Commonmeta_Metadata/get_json_item_metadata/ghost_post_with_doi.yml
1170
+ - spec/fixtures/vcr_cassettes/Commonmeta_Metadata/get_json_item_metadata/jekyll_post.yml
1171
+ - spec/fixtures/vcr_cassettes/Commonmeta_Metadata/get_json_item_metadata/wordpress_post.yml
1172
+ - spec/fixtures/vcr_cassettes/Commonmeta_Metadata/get_json_post_metadata/blogger_post.yml
1173
+ - spec/fixtures/vcr_cassettes/Commonmeta_Metadata/get_json_post_metadata/ghost_post_with_doi.yml
1174
+ - spec/fixtures/vcr_cassettes/Commonmeta_Metadata/get_json_post_metadata/jekyll_post.yml
1175
+ - spec/fixtures/vcr_cassettes/Commonmeta_Metadata/get_json_post_metadata/wordpress_post.yml
1176
+ - spec/fixtures/vcr_cassettes/Commonmeta_Metadata/get_link/license.yml
1177
+ - spec/fixtures/vcr_cassettes/Commonmeta_Metadata/get_link/url.yml
1152
1178
  - spec/fixtures/vcr_cassettes/Commonmeta_Metadata/get_one_author/has_familyName.yml
1153
1179
  - spec/fixtures/vcr_cassettes/Commonmeta_Metadata/get_one_author/has_name_in_display-order_with_ORCID.yml
1154
1180
  - spec/fixtures/vcr_cassettes/Commonmeta_Metadata/get_one_author/name_with_affiliation_crossref.yml
@@ -1171,6 +1197,7 @@ files:
1171
1197
  - spec/fixtures/vcr_cassettes/Commonmeta_Metadata/github/github_from_url_file.yml
1172
1198
  - spec/fixtures/vcr_cassettes/Commonmeta_Metadata/handle_input/DOI_RA_not_Crossref_or_DataCite.yml
1173
1199
  - spec/fixtures/vcr_cassettes/Commonmeta_Metadata/handle_input/unknown_DOI_prefix.yml
1200
+ - spec/fixtures/vcr_cassettes/Commonmeta_Metadata/json_feed_url/front-matter_blog.yml
1174
1201
  - spec/fixtures/vcr_cassettes/Commonmeta_Metadata/json_schema_errors/is_valid.yml
1175
1202
  - spec/fixtures/vcr_cassettes/Commonmeta_Metadata/normalize_cc_url/not_found.yml
1176
1203
  - spec/fixtures/vcr_cassettes/Commonmeta_Metadata/normalize_cc_url/with_trailing_slash.yml
@@ -1256,6 +1283,12 @@ files:
1256
1283
  - spec/fixtures/vcr_cassettes/Commonmeta_Metadata/write_metadata_as_crossref/another_schema_org_from_front-matter.yml
1257
1284
  - spec/fixtures/vcr_cassettes/Commonmeta_Metadata/write_metadata_as_crossref/journal_article.yml
1258
1285
  - spec/fixtures/vcr_cassettes/Commonmeta_Metadata/write_metadata_as_crossref/journal_article_from_datacite.yml
1286
+ - spec/fixtures/vcr_cassettes/Commonmeta_Metadata/write_metadata_as_crossref/json_feed_item_from_rogue_scholar_with_doi.yml
1287
+ - spec/fixtures/vcr_cassettes/Commonmeta_Metadata/write_metadata_as_crossref/json_feed_item_from_upstream_blog.yml
1288
+ - spec/fixtures/vcr_cassettes/Commonmeta_Metadata/write_metadata_as_crossref/json_item_from_rogue_scholar_with_doi.yml
1289
+ - spec/fixtures/vcr_cassettes/Commonmeta_Metadata/write_metadata_as_crossref/json_item_from_upstream_blog.yml
1290
+ - spec/fixtures/vcr_cassettes/Commonmeta_Metadata/write_metadata_as_crossref/json_post_from_rogue_scholar_with_doi.yml
1291
+ - spec/fixtures/vcr_cassettes/Commonmeta_Metadata/write_metadata_as_crossref/json_post_from_upstream_blog.yml
1259
1292
  - spec/fixtures/vcr_cassettes/Commonmeta_Metadata/write_metadata_as_crossref/posted_content.yml
1260
1293
  - spec/fixtures/vcr_cassettes/Commonmeta_Metadata/write_metadata_as_crossref/schema_org_from_another_science_blog.yml
1261
1294
  - spec/fixtures/vcr_cassettes/Commonmeta_Metadata/write_metadata_as_crossref/schema_org_from_front_matter.yml
@@ -1338,6 +1371,7 @@ files:
1338
1371
  - spec/readers/crossref_xml_reader_spec.rb
1339
1372
  - spec/readers/csl_reader_spec.rb
1340
1373
  - spec/readers/datacite_reader_spec.rb
1374
+ - spec/readers/json_feed_reader_spec.rb
1341
1375
  - spec/readers/npm_reader_spec.rb
1342
1376
  - spec/readers/ris_reader_spec.rb
1343
1377
  - spec/readers/schema_org_reader_spec.rb
@@ -1377,7 +1411,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
1377
1411
  - !ruby/object:Gem::Version
1378
1412
  version: '0'
1379
1413
  requirements: []
1380
- rubygems_version: 3.4.10
1414
+ rubygems_version: 3.4.13
1381
1415
  signing_key:
1382
1416
  specification_version: 4
1383
1417
  summary: Ruby client library for conversion of scholarly metadata