bolognese 1.10.0 → 2.3.3

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 (106) hide show
  1. checksums.yaml +4 -4
  2. data/.github/workflows/build.yml +0 -14
  3. data/.github/workflows/ci.yml +1 -1
  4. data/.github/workflows/release.yml +2 -12
  5. data/CHANGELOG.md +2 -2
  6. data/Gemfile.lock +69 -53
  7. data/bolognese.gemspec +6 -4
  8. data/lib/bolognese/author_utils.rb +17 -4
  9. data/lib/bolognese/datacite_utils.rb +19 -11
  10. data/lib/bolognese/metadata.rb +1 -1
  11. data/lib/bolognese/metadata_utils.rb +3 -2
  12. data/lib/bolognese/readers/bibtex_reader.rb +2 -2
  13. data/lib/bolognese/readers/citeproc_reader.rb +7 -1
  14. data/lib/bolognese/readers/codemeta_reader.rb +2 -2
  15. data/lib/bolognese/readers/crosscite_reader.rb +4 -1
  16. data/lib/bolognese/readers/crossref_reader.rb +40 -7
  17. data/lib/bolognese/readers/datacite_json_reader.rb +4 -1
  18. data/lib/bolognese/readers/datacite_reader.rb +25 -9
  19. data/lib/bolognese/readers/npm_reader.rb +1 -1
  20. data/lib/bolognese/readers/ris_reader.rb +2 -2
  21. data/lib/bolognese/readers/schema_org_reader.rb +27 -4
  22. data/lib/bolognese/utils.rb +36 -14
  23. data/lib/bolognese/version.rb +1 -1
  24. data/lib/bolognese/writers/bibtex_writer.rb +1 -1
  25. data/lib/bolognese/writers/codemeta_writer.rb +1 -1
  26. data/lib/bolognese/writers/csv_writer.rb +1 -1
  27. data/lib/bolognese/writers/datacite_json_writer.rb +3 -1
  28. data/lib/bolognese/writers/jats_writer.rb +6 -3
  29. data/lib/bolognese/writers/ris_writer.rb +2 -2
  30. data/lib/bolognese/writers/schema_org_writer.rb +6 -2
  31. data/resources/kernel-4/include/datacite-contributorType-v4.xsd +3 -1
  32. data/resources/kernel-4/include/datacite-dateType-v4.xsd +3 -1
  33. data/resources/kernel-4/include/datacite-relatedIdentifierType-v4.xsd +5 -2
  34. data/resources/kernel-4/include/datacite-relationType-v4.xsd +9 -3
  35. data/resources/kernel-4/include/datacite-resourceType-v4.xsd +7 -1
  36. data/resources/kernel-4/include/datacite-titleType-v4.xsd +1 -1
  37. data/resources/kernel-4/metadata.xsd +12 -7
  38. data/resources/kernel-4.5/include/datacite-contributorType-v4.xsd +35 -0
  39. data/resources/kernel-4.5/include/datacite-dateType-v4.xsd +25 -0
  40. data/resources/kernel-4.5/include/datacite-descriptionType-v4.xsd +19 -0
  41. data/resources/kernel-4.5/include/datacite-funderIdentifierType-v4.xsd +16 -0
  42. data/resources/kernel-4.5/include/datacite-nameType-v4.xsd +10 -0
  43. data/resources/kernel-4.5/include/datacite-numberType-v4.xsd +12 -0
  44. data/resources/kernel-4.5/include/datacite-relatedIdentifierType-v4.xsd +34 -0
  45. data/resources/kernel-4.5/include/datacite-relationType-v4.xsd +53 -0
  46. data/resources/kernel-4.5/include/datacite-resourceType-v4.xsd +45 -0
  47. data/resources/kernel-4.5/include/datacite-titleType-v4.xsd +14 -0
  48. data/resources/kernel-4.5/include/xml.xsd +286 -0
  49. data/resources/kernel-4.5/metadata.xsd +711 -0
  50. data/resources/kernel-4.6/include/datacite-contributorType-v4.xsd +37 -0
  51. data/resources/kernel-4.6/include/datacite-dateType-v4.xsd +27 -0
  52. data/resources/kernel-4.6/include/datacite-descriptionType-v4.xsd +19 -0
  53. data/resources/kernel-4.6/include/datacite-funderIdentifierType-v4.xsd +16 -0
  54. data/resources/kernel-4.6/include/datacite-nameType-v4.xsd +10 -0
  55. data/resources/kernel-4.6/include/datacite-numberType-v4.xsd +12 -0
  56. data/resources/kernel-4.6/include/datacite-relatedIdentifierType-v4.xsd +37 -0
  57. data/resources/kernel-4.6/include/datacite-relationType-v4.xsd +57 -0
  58. data/resources/kernel-4.6/include/datacite-resourceType-v4.xsd +49 -0
  59. data/resources/kernel-4.6/include/datacite-titleType-v4.xsd +14 -0
  60. data/resources/kernel-4.6/include/xml.xsd +286 -0
  61. data/resources/kernel-4.6/metadata.xsd +712 -0
  62. data/spec/author_utils_spec.rb +59 -6
  63. data/spec/datacite_utils_spec.rb +156 -2
  64. data/spec/fixtures/citeproc.json +7 -1
  65. data/spec/fixtures/crossref_schema_4.6_values.xml +183 -0
  66. data/spec/fixtures/datacite-example-ROR-nameIdentifiers.xml +24 -1
  67. data/spec/fixtures/datacite-example-full-v4.5.xml +255 -0
  68. data/spec/fixtures/datacite-example-full-v4.6.xml +114 -0
  69. data/spec/fixtures/datacite-example-relateditems-with-attributes.xml +61 -0
  70. data/spec/fixtures/datacite-seriesinformation.xml +7 -2
  71. data/spec/fixtures/datacite-xml-lang.xml +1 -1
  72. data/spec/fixtures/datacite.json +9 -3
  73. data/spec/fixtures/datacite_blank_name_identifier.xml +22 -0
  74. data/spec/fixtures/datacite_blank_publisher.xml +18 -0
  75. data/spec/fixtures/datacite_journal_article.xml +64 -0
  76. data/spec/fixtures/schema_org.json +1 -0
  77. data/spec/fixtures/schema_org_4.6_attributes.json +108 -0
  78. data/spec/fixtures/vcr_cassettes/Bolognese_Metadata/insert_contributors_Translator/supports_Translator_contributorType.yml +71 -0
  79. data/spec/fixtures/vcr_cassettes/Bolognese_Metadata/insert_dates_with_Coverage/inserts_date_with_dateType_Coverage.yml +71 -0
  80. data/spec/fixtures/vcr_cassettes/Bolognese_Metadata/insert_related_identifiers_CSTR/supports_CSTR_relatedIdentifierType.yml +71 -0
  81. data/spec/fixtures/vcr_cassettes/Bolognese_Metadata/insert_related_identifiers_HasTranslation/supports_HasTranslation_relationType.yml +71 -0
  82. data/spec/fixtures/vcr_cassettes/Bolognese_Metadata/insert_related_identifiers_RRID/supports_RRID_relatedIdentifierType.yml +71 -0
  83. data/spec/fixtures/vcr_cassettes/Bolognese_Metadata/insert_resource_type_with_Award/supports_Award_as_resourceTypeGeneral.yml +71 -0
  84. data/spec/fixtures/vcr_cassettes/Bolognese_Metadata/insert_resource_type_with_Project/supports_Project_as_resourceTypeGeneral.yml +71 -0
  85. data/spec/fixtures/vcr_cassettes/Bolognese_Metadata/insert_subjects/insert.yml +32 -14
  86. data/spec/readers/bibtex_reader_spec.rb +2 -0
  87. data/spec/readers/citeproc_reader_spec.rb +4 -0
  88. data/spec/readers/codemeta_reader_spec.rb +4 -4
  89. data/spec/readers/crosscite_reader_spec.rb +2 -0
  90. data/spec/readers/crossref_reader_spec.rb +72 -41
  91. data/spec/readers/datacite_json_reader_spec.rb +2 -0
  92. data/spec/readers/datacite_reader_spec.rb +209 -44
  93. data/spec/readers/npm_reader_spec.rb +2 -0
  94. data/spec/readers/ris_reader_spec.rb +3 -0
  95. data/spec/readers/schema_org_reader_spec.rb +38 -11
  96. data/spec/spec_helper.rb +1 -0
  97. data/spec/writers/citation_writer_spec.rb +9 -0
  98. data/spec/writers/citeproc_writer_spec.rb +9 -0
  99. data/spec/writers/crosscite_writer_spec.rb +7 -0
  100. data/spec/writers/datacite_json_writer_spec.rb +22 -0
  101. data/spec/writers/datacite_writer_spec.rb +155 -5
  102. data/spec/writers/jats_writer_spec.rb +16 -1
  103. data/spec/writers/rdf_xml_writer_spec.rb +7 -0
  104. data/spec/writers/schema_org_writer_spec.rb +49 -0
  105. data/spec/writers/turtle_writer_spec.rb +18 -0
  106. metadata +84 -37
@@ -42,7 +42,7 @@ describe Bolognese::Metadata, vcr: true do
42
42
  {"subject"=>"taxonomy"},
43
43
  {"subject"=>"mitochondrial genome"},
44
44
  {"subject"=>"Parasites"}])
45
- expect(subject.publisher).to eq("Dryad")
45
+ expect(subject.publisher).to eq({"name"=>"Dryad"})
46
46
  expect(subject.agency).to eq("datacite")
47
47
  expect(subject.schema_version).to eq("http://datacite.org/schema/kernel-4")
48
48
  end
@@ -65,7 +65,7 @@ describe Bolognese::Metadata, vcr: true do
65
65
  expect(subject.publication_year).to eq("2016")
66
66
  expect(subject.related_identifiers.length).to eq(3)
67
67
  expect(subject.related_identifiers.last).to eq("relatedIdentifier"=>"10.5438/0000-00ss", "relatedIdentifierType"=>"DOI", "relationType"=>"IsPartOf")
68
- expect(subject.publisher).to eq("DataCite")
68
+ expect(subject.publisher).to eq({"name"=>"DataCite"})
69
69
  expect(subject.subjects).to eq([{"subject"=>"datacite"},
70
70
  {"subject"=>"doi"},
71
71
  {"subject"=>"metadata"},
@@ -96,7 +96,7 @@ describe Bolognese::Metadata, vcr: true do
96
96
  {"subject"=>"000 Computer science, knowledge, general works",
97
97
  "subjectScheme"=>"DDC"}])
98
98
  expect(subject.publication_year).to eq("2013")
99
- expect(subject.publisher).to eq("Schloss Dagstuhl - Leibniz-Zentrum fuer Informatik GmbH, Wadern/Saarbruecken, Germany")
99
+ expect(subject.publisher).to eq({"name"=>"Schloss Dagstuhl - Leibniz-Zentrum fuer Informatik GmbH, Wadern/Saarbruecken, Germany"})
100
100
  expect(subject.agency).to eq("datacite")
101
101
  expect(subject.schema_version).to eq("http://datacite.org/schema/kernel-2.1")
102
102
  end
@@ -121,7 +121,7 @@ describe Bolognese::Metadata, vcr: true do
121
121
  "name"=>"Brown University"},
122
122
  {"affiliationIdentifier"=>"https://grid.ac/institutes/grid.268117.b",
123
123
  "affiliationIdentifierScheme"=>"GRID",
124
- "name"=>"Wesleyan University"}])
124
+ "name"=>"Wesleyan University", "schemeUri"=>"https://grid.ac/institutes/"}])
125
125
  expect(subject.creators.dig(2, "affiliation")).to eq([{"affiliationIdentifier"=>"https://ror.org/05gq02987",
126
126
  "affiliationIdentifierScheme"=>"ROR", "name"=>"Brown University"}])
127
127
  expect(subject.titles).to eq([{"lang"=>"en-US", "title"=>"Full DataCite XML Example"}, {"lang"=>"en-US", "title"=>"Demonstration of DataCite Properties.", "titleType"=>"Subtitle"}])
@@ -149,7 +149,12 @@ describe Bolognese::Metadata, vcr: true do
149
149
  expect(subject.language).to eq("en-US")
150
150
  expect(subject.sizes).to eq(["4 kB"])
151
151
  expect(subject.formats).to eq(["application/xml"])
152
- expect(subject.publisher).to eq("DataCite")
152
+ expect(subject.publisher).to eq(
153
+ {
154
+ "name"=>"DataCite",
155
+ "lang"=>"en",
156
+ }
157
+ )
153
158
  expect(subject.agency).to eq("datacite")
154
159
  expect(subject.schema_version).to eq("http://datacite.org/schema/kernel-4")
155
160
  end
@@ -166,7 +171,7 @@ describe Bolognese::Metadata, vcr: true do
166
171
  expect(subject.titles).to eq([{"lang"=>"en", "title"=>"Data underpinning - The Sun as a planet-host star: Proxies from SDO images for HARPS radial-velocity variations"}])
167
172
  expect(subject.dates).to eq([{"date"=>"2016-01-20", "dateType"=>"Available"}, {"date"=>"2016", "dateType"=>"Issued"}])
168
173
  expect(subject.publication_year).to eq("2016")
169
- expect(subject.publisher).to eq("University of St Andrews")
174
+ expect(subject.publisher).to eq({"name"=>"University of St Andrews"})
170
175
  expect(subject.agency).to eq("datacite")
171
176
  expect(subject.schema_version).to eq("http://datacite.org/schema/kernel-4")
172
177
  end
@@ -185,7 +190,7 @@ describe Bolognese::Metadata, vcr: true do
185
190
  expect(subject.publication_year).to eq("2011")
186
191
  expect(subject.sizes).to eq([])
187
192
  expect(subject.subjects).to eq([{"subject"=>"Environmental research"}])
188
- expect(subject.publisher).to eq("EvK2 CNR Committee")
193
+ expect(subject.publisher).to eq({"name"=>"EvK2 CNR Committee"})
189
194
  expect(subject.agency).to eq("datacite")
190
195
  expect(subject.schema_version).to eq("http://datacite.org/schema/kernel-2.2")
191
196
  end
@@ -202,7 +207,7 @@ describe Bolognese::Metadata, vcr: true do
202
207
  expect(subject.types["citeproc"]).to eq("article")
203
208
  expect(subject.creators).to eq([{"nameType"=>"Personal", "name"=>"Garza, Kristian", "givenName"=>"Kristian", "familyName"=>"Garza", "nameIdentifiers" => [], "affiliation" => []}])
204
209
  expect(subject.titles).to eq([{"title"=>"Analysis Tools For Crossover Experiment Of Ui Using Choice Architecture"}])
205
- expect(subject.descriptions.first["description"]).to start_with("This tools are used to analyse the data produced by the Crosssover Experiment")
210
+ expect(subject.descriptions.first["description"]).to start_with(" \n\nThis tools are used to analyse the data produced by the Crosssover Experiment I designed to test Choice Architecture techniques as UI interventions in a SEEk4Science data catalogue. It contains:\n\n- Data structures for the experimental data.<br>\n- Visualisation functions<br>\n- Analysis functions\n\n## Installation\n\n- R<br>\n- python<br>\n- ipython 4\n\nClone and use.\n\n## Usage\n\n<br>\n```python<br>\nsource('parallel_plot.r')<br>\nwith(z, parallelset(trt,response, freq=count, alpha=0.2))<br>\n```\n\n<br>\n## Contributing\n\n1. Fork it!<br>\n2. Create your feature branch: `git checkout -b my-new-feature`<br>\n3. Commit your changes: `git commit -am 'Add some feature'`<br>\n4. Push to the branch: `git push origin my-new-feature`<br>\n5. Submit a pull request :D\n\n<br>\n## License\n\nThis work supports my PhD Thesis at University of Manchester.")
206
211
  expect(subject.rights_list).to eq([{"rights"=>
207
212
  "Creative Commons Attribution Non Commercial Share Alike 4.0 International",
208
213
  "rightsIdentifier"=>"cc-by-nc-sa-4.0",
@@ -217,7 +222,7 @@ describe Bolognese::Metadata, vcr: true do
217
222
  expect(subject.subjects).to eq([{"subject"=>"choice architecture"},
218
223
  {"subject"=>"crossover experiment"},
219
224
  {"subject"=>"hci"}])
220
- expect(subject.publisher).to eq("Zenodo")
225
+ expect(subject.publisher).to eq({"name"=>"Zenodo"})
221
226
  expect(subject.agency).to eq("datacite")
222
227
  expect(subject.schema_version).to eq("http://datacite.org/schema/kernel-4")
223
228
  end
@@ -243,7 +248,7 @@ describe Bolognese::Metadata, vcr: true do
243
248
  expect(subject.publication_year).to eq("2016")
244
249
  expect(subject.related_identifiers.length).to eq(1)
245
250
  expect(subject.related_identifiers.last).to eq("relatedIdentifier"=>"10.6084/m9.figshare.4234751", "relatedIdentifierType"=>"DOI", "relationType"=>"IsIdenticalTo")
246
- expect(subject.publisher).to eq("figshare")
251
+ expect(subject.publisher).to eq({"name"=>"figshare"})
247
252
  expect(subject.subjects).to eq([
248
253
  {"schemeUri"=>
249
254
  "http://www.abs.gov.au/ausstats/abs@.nsf/0/6BB427AB9696C225CA2574180004463E",
@@ -286,7 +291,7 @@ describe Bolognese::Metadata, vcr: true do
286
291
  "schemeUri"=>"https://spdx.org/licenses/"}])
287
292
  expect(subject.dates).to eq([{"date"=>"2015-06-14", "dateType"=>"Created"}, {"date"=>"2020-06-02", "dateType"=>"Updated"}, {"date"=>"2020", "dateType"=>"Issued"}])
288
293
  expect(subject.publication_year).to eq("2020")
289
- expect(subject.publisher).to eq("figshare")
294
+ expect(subject.publisher).to eq({"name"=>"figshare"})
290
295
  expect(subject.subjects).to eq([{"subject"=>"Evolutionary Biology"},
291
296
  {"subject"=>"FOS: Biological sciences", "subjectScheme"=>"Fields of Science and Technology (FOS)", "schemeUri"=>"http://www.oecd.org/science/inno/38235147.pdf"},
292
297
  {"subject"=>"60412 Quantitative Genetics (incl. Disease and Trait Mapping Genetics)", "subjectScheme"=>"FOR", "schemeUri"=>"http://www.abs.gov.au/ausstats/abs@.nsf/0/6BB427AB9696C225CA2574180004463E"}])
@@ -338,7 +343,7 @@ describe Bolognese::Metadata, vcr: true do
338
343
  expect(subject.descriptions.first["description"]).to start_with("The dataset contains a sample of metadata describing papers")
339
344
  expect(subject.dates).to eq([{"date"=>"2013-04-03", "dateType"=>"Issued"}])
340
345
  expect(subject.publication_year).to eq("2013")
341
- expect(subject.publisher).to eq("Zenodo")
346
+ expect(subject.publisher).to eq({"name"=>"Zenodo"})
342
347
  expect(subject.funding_references).to eq([{"awardNumber"=>"246686",
343
348
  "awardTitle"=>"Open Access Infrastructure for Research in Europe",
344
349
  "awardUri"=>"info:eu-repo/grantAgreement/EC/FP7/246686/",
@@ -382,7 +387,7 @@ describe Bolognese::Metadata, vcr: true do
382
387
  expect(subject.descriptions.first["description"]).to start_with("The dataset contains a sample of metadata describing papers")
383
388
  expect(subject.dates).to eq([{"date"=>"2013-04-03", "dateType"=>"Issued"}])
384
389
  expect(subject.publication_year).to eq("2013")
385
- expect(subject.publisher).to eq("Zenodo")
390
+ expect(subject.publisher).to eq({"name"=>"Zenodo"})
386
391
  expect(subject.funding_references).to eq([{"awardNumber"=>"246686",
387
392
  "awardTitle"=>"Open Access Infrastructure for Research in Europe",
388
393
  "awardUri"=>"info:eu-repo/grantAgreement/EC/FP7/246686/",
@@ -409,7 +414,7 @@ describe Bolognese::Metadata, vcr: true do
409
414
  subject = Bolognese::Metadata.new(input: input)
410
415
  expect(subject.types["schemaOrg"]).to eq("Collection")
411
416
  expect(subject.language).to eq("de")
412
- expect(subject.publisher).to eq("Universitätsbibliothek Tübingen")
417
+ expect(subject.publisher).to eq({"name"=>"Universitätsbibliothek Tübingen"})
413
418
  expect(subject.publication_year).to eq("2015")
414
419
  expect(subject.valid?).to be false
415
420
  expect(subject.errors).to eq("13:0: ERROR: Element '{http://datacite.org/schema/kernel-2.2}publisher': This element is not expected. Expected is ( {http://datacite.org/schema/kernel-2.2}publicationYear ).")
@@ -532,7 +537,7 @@ describe Bolognese::Metadata, vcr: true do
532
537
  expect(subject.creators.length).to eq(1)
533
538
  expect(subject.creators.first).to eq("familyName"=>"Fenner", "givenName"=>"Martin", "nameIdentifiers" => [{"nameIdentifier"=>"https://orcid.org/0000-0003-1419-2405", "nameIdentifierScheme"=>"ORCID", "schemeUri"=>"https://orcid.org"}], "name"=>"Fenner, Martin")
534
539
  expect(subject.titles).to eq([{"title"=>"Eating your own Dog Food"}])
535
- expect(subject.publisher).to eq("DataCite")
540
+ expect(subject.publisher).to eq({"name"=>"DataCite"})
536
541
  expect(subject.publication_year).to eq("2016")
537
542
  expect(subject.related_identifiers).to eq([{"relatedIdentifier"=>"10.5438/0012",
538
543
  "relatedIdentifierType"=>"DOI",
@@ -547,7 +552,7 @@ describe Bolognese::Metadata, vcr: true do
547
552
  "descriptionType"=>"SeriesInformation",
548
553
  "lang"=>"en"},
549
554
  {"description"=>
550
- "Eating your own dog food is a slang term to describe that an organization should itself use the products and services it provides. For DataCite this means that we should use DOIs with appropriate metadata and strategies for long-term preservation for...",
555
+ "Eating your own dog food is a slang term to \n describe that an organization should itself use the products and services it provides. \n For DataCite this means that we should use DOIs with appropriate metadata and strategies for long-term preservation for...\n • Unicode Bullet Point: This is an example of a bullet point.\\u2605\n ■ Unicode Black Square: This is an example of a black square.",
551
556
  "descriptionType"=>"Abstract"}])
552
557
  expect(subject.container).to eq("firstPage"=>"3", "identifier"=>"10.5438/0000-00SS", "identifierType"=>"DOI", "issue"=>"9", "lastPage"=>"4", "title"=>"DataCite Blog", "type"=>"Series", "volume"=>"2")
553
558
  end
@@ -562,7 +567,7 @@ describe Bolognese::Metadata, vcr: true do
562
567
  expect(subject.creators.length).to eq(3)
563
568
  expect(subject.creators.first).to eq("familyName"=>"Schumann", "givenName"=>"Kai", "name"=>"Schumann, Kai", "nameType"=>"Personal", "nameIdentifiers" => [], "affiliation" => [])
564
569
  expect(subject.titles).to eq([{"title"=>"Gridded results of swath bathymetric mapping of Disko Bay, Western Greenland, 2007-2008"}])
565
- expect(subject.publisher).to eq("PANGAEA - Data Publisher for Earth & Environmental Science")
570
+ expect(subject.publisher).to eq({"name"=>"PANGAEA - Data Publisher for Earth & Environmental Science"})
566
571
  expect(subject.publication_year).to eq("2011")
567
572
  expect(subject.related_identifiers).to eq([{"relatedIdentifier"=>"10.5072/timeseries", "relatedIdentifierType"=>"DOI", "relationType"=>"Continues"}])
568
573
  expect(subject.geo_locations).to eq([{"geoLocationPlace"=>"Disko Bay", "geoLocationPoint"=>{"pointLatitude"=>"69.000000", "pointLongitude"=>"-52.000000"}}])
@@ -579,7 +584,7 @@ describe Bolognese::Metadata, vcr: true do
579
584
  expect(subject.creators.length).to eq(6)
580
585
  expect(subject.creators.first).to eq("familyName"=>"Bales", "givenName"=>"Roger", "name"=>"Bales, Roger", "nameType"=>"Personal", "affiliation" => [{"name"=>"UC Merced"}, {"name"=>"NSF"}], "nameIdentifiers" => [])
581
586
  expect(subject.titles).to eq([{"title"=>"Southern Sierra Critical Zone Observatory (SSCZO), Providence Creek meteorological data, soil moisture and temperature, snow depth and air temperature"}])
582
- expect(subject.publisher).to eq("UC Merced")
587
+ expect(subject.publisher).to eq({"name"=>"UC Merced"})
583
588
  expect(subject.dates).to eq([{"date"=>"2014-10-17", "dateType"=>"Updated"}, {"date"=>"2016-03-14T17:02:02Z", "dateType"=>"Available"}, {"date"=>"2013", "dateType"=>"Issued"}])
584
589
  expect(subject.publication_year).to eq("2013")
585
590
  expect(subject.subjects).to eq([{"subject"=>"Earth sciences"},
@@ -659,7 +664,7 @@ describe Bolognese::Metadata, vcr: true do
659
664
  expect(subject.titles).to eq([{"title"=>"Dataset for \"Direct Evidence for Solid-Like Hydrogen in a Nanoporous Carbon Hydrogen Storage Material at Supercritical Temperatures\""}])
660
665
  expect(subject.descriptions.first["description"]).to start_with("Dataset for Direct Evidence for Solid-Like Hydrogen")
661
666
  expect(subject.publication_year).to eq("2015")
662
- expect(subject.publisher).to eq("University of Bath")
667
+ expect(subject.publisher).to eq({"name"=>"University of Bath"})
663
668
  expect(subject.funding_references.length).to eq(5)
664
669
  expect(subject.funding_references.first).to eq("awardNumber" => "EP/J016454/1",
665
670
  "awardTitle" => "SUPERGEN Hub Funding",
@@ -693,7 +698,7 @@ describe Bolognese::Metadata, vcr: true do
693
698
  expect(subject.titles).to eq([{"title"=>"Technical and Human Infrastructure for Open Research (THOR)"}])
694
699
  expect(subject.descriptions.first["description"]).to start_with("Five years ago, a global infrastructure")
695
700
  expect(subject.publication_year).to eq("2015")
696
- expect(subject.publisher).to eq("DataCite")
701
+ expect(subject.publisher).to eq({"name"=>"DataCite"})
697
702
  expect(subject.funding_references).to eq([{"awardNumber"=>"654039",
698
703
  "awardTitle"=>"THOR – Technical and Human Infrastructure for Open Research",
699
704
  "awardUri"=>"http://cordis.europa.eu/project/rcn/194927_en.html",
@@ -717,7 +722,7 @@ describe Bolognese::Metadata, vcr: true do
717
722
  expect(subject.titles).to eq([{"title"=>"МОДЕЛЬ СИСТЕМНОЙ ДИНАМИКИ ПРОЦЕССА ОБУЧЕНИЯ"}, {"title"=>"MODEL OF SYSTEM DYNAMICS OF PROCESS OF TRAINING", "titleType"=>"TranslatedTitle"}])
718
723
  expect(subject.descriptions.first["description"]).to start_with("Актуальность данной работы обусловлена важностью учета в учебном процессе личностных качеств обучаем")
719
724
  expect(subject.publication_year).to eq("2019")
720
- expect(subject.publisher).to eq("МОДЕЛИРОВАНИЕ, ОПТИМИЗАЦИЯ И ИНФОРМАЦИОННЫЕ ТЕХНОЛОГИИ")
725
+ expect(subject.publisher).to eq({"name"=>"МОДЕЛИРОВАНИЕ, ОПТИМИЗАЦИЯ И ИНФОРМАЦИОННЫЕ ТЕХНОЛОГИИ"})
721
726
  expect(subject.funding_references.length).to eq(1)
722
727
  expect(subject.funding_references.first).to eq("awardNumber"=>"проект № 170100728", "funderName"=>"РФФИ")
723
728
  expect(subject.agency).to eq("datacite")
@@ -770,7 +775,7 @@ describe Bolognese::Metadata, vcr: true do
770
775
  "rightsIdentifierScheme"=>"SPDX",
771
776
  "rightsUri"=>"https://creativecommons.org/licenses/by-nd/2.0/legalcode",
772
777
  "schemeUri"=>"https://spdx.org/licenses/"}])
773
- expect(subject.publisher).to eq("Springer")
778
+ expect(subject.publisher).to eq({"name"=>"Springer"})
774
779
  expect(subject.agency).to eq("datacite")
775
780
  expect(subject.schema_version).to eq("http://datacite.org/schema/kernel-4")
776
781
  end
@@ -800,7 +805,7 @@ describe Bolognese::Metadata, vcr: true do
800
805
  "rightsIdentifierScheme"=>"SPDX",
801
806
  "rightsUri"=>"https://creativecommons.org/licenses/by-nd/2.0/legalcode",
802
807
  "schemeUri"=>"https://spdx.org/licenses/"}])
803
- expect(subject.publisher).to eq("Springer")
808
+ expect(subject.publisher).to eq({"name"=>"Springer"})
804
809
  expect(subject.agency).to eq("datacite")
805
810
  expect(subject.schema_version).to eq("http://datacite.org/schema/kernel-4.0")
806
811
  end
@@ -829,7 +834,7 @@ describe Bolognese::Metadata, vcr: true do
829
834
  "rightsIdentifierScheme"=>"SPDX",
830
835
  "rightsUri"=>"https://creativecommons.org/publicdomain/zero/1.0/legalcode",
831
836
  "schemeUri"=>"https://spdx.org/licenses/"}])
832
- expect(subject.publisher).to eq("Dryad Digital Repository")
837
+ expect(subject.publisher).to eq({"name"=>"Dryad Digital Repository"})
833
838
  expect(subject.agency).to eq("datacite")
834
839
  expect(subject.schema_version).to eq("http://datacite.org/schema/kernel-3")
835
840
  end
@@ -859,7 +864,7 @@ describe Bolognese::Metadata, vcr: true do
859
864
  "rightsIdentifierScheme"=>"SPDX",
860
865
  "rightsUri"=>"https://creativecommons.org/licenses/by-nd/2.0/legalcode",
861
866
  "schemeUri"=>"https://spdx.org/licenses/"}])
862
- expect(subject.publisher).to eq("Springer")
867
+ expect(subject.publisher).to eq({"name"=>"Springer"})
863
868
  expect(subject.agency).to eq("datacite")
864
869
  expect(subject.schema_version).to eq("http://datacite.org/schema/kernel-3.0")
865
870
  end
@@ -883,7 +888,7 @@ describe Bolognese::Metadata, vcr: true do
883
888
  expect(subject.publication_year).to eq("2010")
884
889
  expect(subject.related_identifiers.length).to eq(1)
885
890
  expect(subject.related_identifiers.last).to eq("relatedIdentifier"=>"10.5272/oldertestpub", "relatedIdentifierType"=>"DOI", "relationType"=>"IsPartOf")
886
- expect(subject.publisher).to eq("Springer")
891
+ expect(subject.publisher).to eq({"name"=>"Springer"})
887
892
  expect(subject.agency).to eq("datacite")
888
893
  expect(subject.schema_version).to eq("http://datacite.org/schema/kernel-2.2")
889
894
  end
@@ -917,7 +922,7 @@ describe Bolognese::Metadata, vcr: true do
917
922
  "rightsIdentifierScheme"=>"SPDX",
918
923
  "rightsUri"=>"https://creativecommons.org/licenses/by-nd/2.0/legalcode",
919
924
  "schemeUri"=>"https://spdx.org/licenses/"}])
920
- expect(subject.publisher).to eq("Springer")
925
+ expect(subject.publisher).to eq({"name"=>"Springer"})
921
926
  expect(subject.agency).to eq("datacite")
922
927
  end
923
928
 
@@ -934,7 +939,7 @@ describe Bolognese::Metadata, vcr: true do
934
939
  expect(subject.titles).to eq([{"title"=>"LAMMPS Data-File Generator"}])
935
940
  expect(subject.dates).to eq([{"date"=>"2018-07-18", "dateType"=>"Valid"}, {"date"=>"2018-07-18", "dateType"=>"Accepted"}, {"date"=>"2018", "dateType"=>"Issued"}])
936
941
  expect(subject.publication_year).to eq("2018")
937
- expect(subject.publisher).to eq("nanoHUB")
942
+ expect(subject.publisher).to eq({"name"=>"nanoHUB"})
938
943
  expect(subject.agency).to eq("datacite")
939
944
  expect(subject.schema_version).to eq("http://datacite.org/schema/kernel-2.2")
940
945
  end
@@ -950,7 +955,7 @@ describe Bolognese::Metadata, vcr: true do
950
955
  expect(subject.types["ris"]).to eq("DATA")
951
956
  expect(subject.types["bibtex"]).to eq("misc")
952
957
  expect(subject.creators.length).to eq(1)
953
- expect(subject.creators.first).to eq("affiliation" => [{"affiliationIdentifier"=>"https://ror.org/04zt3wx35", "affiliationIdentifierScheme"=>"ROR", "name"=>"Canada Mortgage and Housing Corporation"}],
958
+ expect(subject.creators.first).to eq("affiliation" => [{"affiliationIdentifier"=>"https://ror.org/04zt3wx35", "affiliationIdentifierScheme"=>"ROR", "name"=>"Canada Mortgage and Housing Corporation", "schemeUri"=>"https://ror.org"}],
954
959
  "name" => "Statistique Canada",
955
960
  "nameIdentifiers" => [],
956
961
  "nameType" => "Organizational")
@@ -966,7 +971,7 @@ describe Bolognese::Metadata, vcr: true do
966
971
  expect(subject.creators).to eq([{"familyName"=>"Wong", "givenName"=>"Takmeng", "name"=>"Wong, Takmeng"}])
967
972
  expect(subject.titles).to eq([{"title"=>"CERES Level 3 Cloud Type Historgram Terra+Aqua HDF file - Edition4"}])
968
973
  expect(subject.publication_year).to eq("2016")
969
- expect(subject.publisher).to eq("NASA Langley Atmospheric Science Data Center DAAC")
974
+ expect(subject.publisher).to eq({"name"=>"NASA Langley Atmospheric Science Data Center DAAC"})
970
975
  expect(subject.agency).to eq("datacite")
971
976
  expect(subject.schema_version).to eq("http://datacite.org/schema/kernel-4")
972
977
  end
@@ -1007,7 +1012,7 @@ describe Bolognese::Metadata, vcr: true do
1007
1012
  "subjectScheme"=>"CESSDA Topic Classification"}])
1008
1013
  expect(subject.dates).to eq([{"date"=>"1995-12", "dateType"=>"Collected"}, {"date"=>"1996", "dateType"=>"Issued"}])
1009
1014
  expect(subject.publication_year).to eq("1996")
1010
- expect(subject.publisher).to eq("GESIS Data Archive")
1015
+ expect(subject.publisher).to eq({"name"=>"GESIS Data Archive"})
1011
1016
  expect(subject.agency).to eq("datacite")
1012
1017
  expect(subject.schema_version).to eq("http://datacite.org/schema/kernel-4")
1013
1018
  end
@@ -1029,7 +1034,7 @@ describe Bolognese::Metadata, vcr: true do
1029
1034
  expect(subject.container).to eq("firstPage"=>"Spain; 3353", "lastPage"=>"3356", "title"=>"23rd European Photovoltaic Solar Energy Conference and Exhibition", "type"=>"Series", "volume"=>"1-5 September 2008")
1030
1035
  expect(subject.descriptions[1]["description"]).to start_with("Aim of this paper is the presentation")
1031
1036
  expect(subject.subjects).to eq([{"subject"=>"PV Systems"}, {"subject"=>"Off-grid Applications"}])
1032
- expect(subject.publisher).to eq("WIP-Munich")
1037
+ expect(subject.publisher).to eq({"name"=>"WIP-Munich"})
1033
1038
  expect(subject.agency).to eq("datacite")
1034
1039
  expect(subject.schema_version).to eq("http://datacite.org/schema/kernel-2.2")
1035
1040
  end
@@ -1060,7 +1065,7 @@ describe Bolognese::Metadata, vcr: true do
1060
1065
  expect(subject.titles).to eq([{"title"=>"Messung der Bildunschaerfe in H.264-codierten Bildern und Videosequenzen"}])
1061
1066
  expect(subject.dates).to eq([{"date"=>"2017", "dateType"=>"Issued"}])
1062
1067
  expect(subject.publication_year).to eq("2017")
1063
- expect(subject.publisher).to eq("Siemens AG")
1068
+ expect(subject.publisher).to eq({"name"=>"Siemens AG"})
1064
1069
  expect(subject.agency).to eq("datacite")
1065
1070
  expect(subject.schema_version).to eq("http://datacite.org/schema/kernel-3")
1066
1071
  end
@@ -1100,7 +1105,7 @@ describe Bolognese::Metadata, vcr: true do
1100
1105
  expect(subject.version_info).to eq("2")
1101
1106
  expect(subject.dates).to eq([{"date"=>"2014-04-25", "dateType"=>"Available"}, {"date"=>"2015", "dateType"=>"Issued"}])
1102
1107
  expect(subject.publication_year).to eq("2015")
1103
- expect(subject.publisher).to eq("Royal Netherlands Meteorological Institute (KNMI)")
1108
+ expect(subject.publisher).to eq({"name"=>"Royal Netherlands Meteorological Institute (KNMI)"})
1104
1109
  expect(subject.agency).to eq("datacite")
1105
1110
  expect(subject.schema_version).to eq("http://datacite.org/schema/kernel-4")
1106
1111
  end
@@ -1126,7 +1131,7 @@ describe Bolognese::Metadata, vcr: true do
1126
1131
  expect(subject.titles).to eq([{"title"=>"Test license"}])
1127
1132
  expect(subject.dates).to eq([{"date"=>"2018-01-12", "dateType"=>"Issued"}])
1128
1133
  expect(subject.publication_year).to eq("2018")
1129
- expect(subject.publisher).to eq("CaltechDATA")
1134
+ expect(subject.publisher).to eq({"name"=>"CaltechDATA"})
1130
1135
  expect(subject.agency).to eq("datacite")
1131
1136
  expect(subject.schema_version).to eq("http://datacite.org/schema/kernel-4")
1132
1137
  expect(subject.state).to eq("findable")
@@ -1143,7 +1148,7 @@ describe Bolognese::Metadata, vcr: true do
1143
1148
  expect(subject.titles).to eq([{"title"=>"Referee report. For: FL Regression Wellcome [version 1; referees: retracted]"}])
1144
1149
  expect(subject.dates).to eq([{"date"=>"2018", "dateType"=>"Issued"}])
1145
1150
  expect(subject.publication_year).to eq("2018")
1146
- expect(subject.publisher).to eq("F1000 Research Limited")
1151
+ expect(subject.publisher).to eq({"name"=>"F1000 Research Limited"})
1147
1152
  expect(subject.agency).to eq("datacite")
1148
1153
  expect(subject.schema_version).to eq("http://datacite.org/schema/kernel-3")
1149
1154
  expect(subject.state).to eq("findable")
@@ -1162,7 +1167,7 @@ describe Bolognese::Metadata, vcr: true do
1162
1167
  expect(subject.creators.first).to eq("nameType"=>"Personal", "name"=>"Patel, Lina", "givenName"=>"Lina", "familyName"=>"Patel", "nameIdentifiers" => [], "affiliation" => [])
1163
1168
  expect(subject.titles).to eq([{"title"=>"Referee report. For: Gates - add article keywords to the metatags [version 2; referees: 1 approved]"}])
1164
1169
  expect(subject.publication_year).to eq("2018")
1165
- expect(subject.publisher).to eq("Gates Open Research")
1170
+ expect(subject.publisher).to eq({"name"=>"Gates Open Research"})
1166
1171
  expect(subject.agency).to eq("datacite")
1167
1172
  expect(subject.schema_version).to eq("http://datacite.org/schema/kernel-3")
1168
1173
  end
@@ -1255,7 +1260,7 @@ describe Bolognese::Metadata, vcr: true do
1255
1260
  {"date"=>"2014", "dateType"=>"Copyrighted"},
1256
1261
  {"date"=>"2009-10-01/2014-01-23", "dateType"=>"Created"}])
1257
1262
  expect(subject.publication_year).to eq("2014")
1258
- expect(subject.publisher).to eq("Deutsches Elektronen-Synchrotron, DESY, Hamburg")
1263
+ expect(subject.publisher).to eq({"name"=>"Deutsches Elektronen-Synchrotron, DESY, Hamburg"})
1259
1264
  expect(subject.agency).to eq("datacite")
1260
1265
  expect(subject.schema_version).to eq("http://datacite.org/schema/kernel-3")
1261
1266
  end
@@ -1280,7 +1285,7 @@ describe Bolognese::Metadata, vcr: true do
1280
1285
  expect(subject.titles.last).to eq("title"=>"MODEL OF SYSTEM DYNAMICS OF PROCESS OF TRAINING", "titleType"=>"TranslatedTitle")
1281
1286
  expect(subject.dates).to eq([{"date"=>"2019-02-09", "dateType"=>"Issued"}])
1282
1287
  expect(subject.publication_year).to eq("2019")
1283
- expect(subject.publisher).to eq("МОДЕЛИРОВАНИЕ, ОПТИМИЗАЦИЯ И ИНФОРМАЦИОННЫЕ ТЕХНОЛОГИИ")
1288
+ expect(subject.publisher).to eq({"name"=>"МОДЕЛИРОВАНИЕ, ОПТИМИЗАЦИЯ И ИНФОРМАЦИОННЫЕ ТЕХНОЛОГИИ"})
1284
1289
  expect(subject.funding_references.count).to eq(1)
1285
1290
  expect(subject.funding_references.first).to eq("awardNumber"=>"проект № 170100728", "funderName"=>"РФФИ")
1286
1291
  expect(subject.agency).to eq("datacite")
@@ -1335,7 +1340,7 @@ describe Bolognese::Metadata, vcr: true do
1335
1340
  expect(subject.doi).to eq("10.5061/dryad.8515")
1336
1341
  expect(subject.creators).to eq([{"nameIdentifiers"=> [{"nameIdentifier"=>"https://orcid.org/0000-0003-1419-2405", "nameIdentifierScheme"=>"ORCID", "schemeUri"=>"https://orcid.org"}], "name"=>"Fenner, Martin", "givenName"=>"Martin", "familyName"=>"Fenner"}])
1337
1342
  expect(subject.titles).to eq([{"title"=>"Eating your own Dog Food"}])
1338
- expect(subject.publisher).to eq("DataCite")
1343
+ expect(subject.publisher).to eq({"name"=>"DataCite"})
1339
1344
  expect(subject.publication_year).to eq("2016")
1340
1345
  end
1341
1346
  end
@@ -1362,7 +1367,7 @@ describe Bolognese::Metadata, vcr: true do
1362
1367
  expect(subject.formats).to eq(["application/tar"])
1363
1368
  expect(subject.sizes).to eq(["15.7M"])
1364
1369
  expect(subject.container).to eq("identifier"=>"https://www.ebi.ac.uk/miriam/main/datatypes/MIR:00000663", "identifierType"=>"URL", "title"=>"GTEx", "type"=>"DataRepository")
1365
- expect(subject.publisher).to eq("GTEx")
1370
+ expect(subject.publisher).to eq({"name"=>"GTEx"})
1366
1371
  expect(subject.funding_references.count).to eq(7)
1367
1372
  expect(subject.funding_references.first).to eq("funderIdentifier"=>"https://doi.org/10.13039/100000052", "funderIdentifierType"=>"Crossref Funder ID", "funderName"=>"Common Fund of the Office of the Director of the NIH")
1368
1373
  end
@@ -1379,7 +1384,7 @@ describe Bolognese::Metadata, vcr: true do
1379
1384
  expect(subject.creators.first).to eq("familyName"=>"Den Heijer", "givenName"=>"C", "name"=>"Den Heijer, C", "nameType"=>"Personal", "nameIdentifiers" => [], "affiliation" => [])
1380
1385
  expect(subject.titles).to eq([{"lang"=>"en", "title"=>"Meteo measurements at the Sand Motor"}])
1381
1386
  expect(subject.publication_year).to eq("2017")
1382
- expect(subject.publisher).to eq("4TU.Centre for Research Data")
1387
+ expect(subject.publisher).to eq({"name"=>"4TU.Centre for Research Data"})
1383
1388
  expect(subject.agency).to eq("datacite")
1384
1389
  expect(subject.schema_version).to eq("http://datacite.org/schema/kernel-4")
1385
1390
  expect(subject.geo_locations.first["geoLocationPlace"]).to eq("Zandmotor, sand suppletion area on the Dutch coast.")
@@ -1445,7 +1450,12 @@ describe Bolognese::Metadata, vcr: true do
1445
1450
  "schemeUri"=>"https://spdx.org/licenses/"
1446
1451
  }
1447
1452
  ])
1448
- expect(subject.publisher).to eq("DataCite")
1453
+ expect(subject.publisher).to eq(
1454
+ {
1455
+ "name"=>"DataCite",
1456
+ "lang"=>"en",
1457
+ }
1458
+ )
1449
1459
  expect(subject.agency).to eq("datacite")
1450
1460
  expect(subject.schema_version).to eq("http://datacite.org/schema/kernel-4")
1451
1461
  expect(subject.related_items.last).to eq(
@@ -1555,6 +1565,49 @@ describe Bolognese::Metadata, vcr: true do
1555
1565
  )
1556
1566
  end
1557
1567
 
1568
+ it "Schema 4.4 related items from string with attributes" do
1569
+ input = fixture_path + "datacite-example-relateditems-with-attributes.xml"
1570
+ subject = Bolognese::Metadata.new(input: input)
1571
+ expect(subject.valid?).to be true
1572
+
1573
+ expect(subject.related_items.last).to eq(
1574
+ {
1575
+ "relatedItemType"=>"Journal",
1576
+ "relationType"=>"IsPublishedIn",
1577
+ "relatedItemIdentifier"=>
1578
+ {
1579
+ "relatedItemIdentifier"=>"10.5072/john-smiths-1234",
1580
+ "relatedItemIdentifierType"=>"DOI",
1581
+ "relatedMetadataScheme"=>"citeproc+json",
1582
+ "schemeURI"=>"https://github.com/citation-style-language/schema/raw/master/csl-data.json",
1583
+ "schemeType"=>"URL"
1584
+ },
1585
+ "creators" =>
1586
+ [
1587
+ {"nameType"=>"Personal", "name"=>"Smith, John", "givenName"=>"John", "familyName"=>"Smith"}
1588
+ ],
1589
+ "titles"=>
1590
+ [
1591
+ {"title"=>"Understanding the fictional John Smith"},
1592
+ {"title"=>"A detailed look", "titleType"=>"Subtitle"}
1593
+ ],
1594
+ "volume"=>"776",
1595
+ "issue"=>"1",
1596
+ "number"=>"1",
1597
+ "numberType"=>"Chapter",
1598
+ "firstPage"=>"50",
1599
+ "lastPage"=>"60",
1600
+ "publisher"=>"Example Inc",
1601
+ "publicationYear"=>"1776",
1602
+ "edition"=>"1",
1603
+ "contributors"=>
1604
+ [
1605
+ {"name"=>"Hallett, Richard", "givenName"=>"Richard", "familyName"=>"Hallett", "contributorType"=>"ProjectLeader"}
1606
+ ]
1607
+ }
1608
+ )
1609
+ end
1610
+
1558
1611
  it "Schema 4.4 dissertation from string" do
1559
1612
  input = fixture_path + "datacite-example-dissertation-v4.4.xml"
1560
1613
  subject = Bolognese::Metadata.new(input: input)
@@ -1640,7 +1693,12 @@ describe Bolognese::Metadata, vcr: true do
1640
1693
  "schemeUri"=>"https://spdx.org/licenses/"
1641
1694
  }
1642
1695
  ])
1643
- expect(subject.publisher).to eq("GigaScience Database")
1696
+ expect(subject.publisher).to eq(
1697
+ {
1698
+ "name"=>"GigaScience Database",
1699
+ "lang"=>"en",
1700
+ }
1701
+ )
1644
1702
  expect(subject.agency).to eq("datacite")
1645
1703
  expect(subject.schema_version).to eq("http://datacite.org/schema/kernel-4")
1646
1704
  end
@@ -1685,4 +1743,111 @@ describe Bolognese::Metadata, vcr: true do
1685
1743
  )
1686
1744
  end
1687
1745
 
1746
+ describe "Schema 4.5" do
1747
+ it "publisher with attributes" do
1748
+ input = fixture_path + "datacite-example-full-v4.5.xml"
1749
+ subject = Bolognese::Metadata.new(input: input)
1750
+ expect(subject.valid?).to be true
1751
+ expect(subject.publisher).to eq(
1752
+ {
1753
+ "name" => "Example Publisher",
1754
+ "publisherIdentifier" => "https://ror.org/04z8jg394",
1755
+ "publisherIdentifierScheme" => "ROR",
1756
+ "schemeUri" => "https://ror.org/",
1757
+ "lang" => "en",
1758
+ }
1759
+ )
1760
+ end
1761
+ end
1762
+
1763
+ it "blank nameIdentifier" do
1764
+ input = fixture_path + "datacite_blank_name_identifier.xml"
1765
+ subject = Bolognese::Metadata.new(input: input)
1766
+ expect(subject.creators).to eq(
1767
+ [
1768
+ {
1769
+ "nameType" => "Personal",
1770
+ "name" => "KARST, SNO",
1771
+ "givenName" => "SNO",
1772
+ "familyName" => "KARST",
1773
+ "nameIdentifiers" =>
1774
+ [
1775
+ {
1776
+ "schemeUri" => "https://orcid.org",
1777
+ "nameIdentifierScheme" => "ORCID"
1778
+ }
1779
+ ],
1780
+ "affiliation" => []
1781
+ }
1782
+ ]
1783
+ )
1784
+ expect(subject.contributors).to eq(
1785
+ [
1786
+ {
1787
+ "nameType" => "Personal",
1788
+ "name" => "Manche, Yannick",
1789
+ "givenName" => "Yannick",
1790
+ "familyName" => "Manche",
1791
+ "nameIdentifiers" =>
1792
+ [
1793
+ {
1794
+ "schemeUri" => "https://orcid.org",
1795
+ "nameIdentifierScheme" => "ORCID"
1796
+ }
1797
+ ],
1798
+ "affiliation" => [],
1799
+ "contributorType" => "ProjectMember"
1800
+ }
1801
+ ]
1802
+ )
1803
+ end
1804
+
1805
+ it "blank publisher" do
1806
+ input = fixture_path + "datacite_blank_publisher.xml"
1807
+ subject = Bolognese::Metadata.new(input: input)
1808
+ expect(subject.publisher).to eq(
1809
+ { "publisherIdentifier" => "https://ror.org/04wxnsj81" }
1810
+ )
1811
+ end
1812
+
1813
+ describe "DataCite Schema 4.6" do
1814
+ it "handles all DataCite 4.6 features in one XML" do
1815
+ input = fixture_path + 'datacite-example-full-v4.6.xml'
1816
+ subject = Bolognese::Metadata.new(input: input)
1817
+
1818
+ expect(subject.valid?).to be true
1819
+
1820
+ # Test resourceTypeGeneral for Project
1821
+ expect(subject.types["resourceTypeGeneral"]).to eq("Project")
1822
+ expect(subject.types["resourceType"]).to eq("Research Project")
1823
+
1824
+ # Test relatedIdentifiers for RRID and CSTR
1825
+ expect(subject.related_identifiers.length).to eq(4)
1826
+ expect(subject.related_identifiers).to include(
1827
+ { "relatedIdentifier" => "RRID:AB_90755", "relatedIdentifierType" => "RRID", "relationType" => "References" },
1828
+ { "relatedIdentifier" => "CSTR:AB_12345", "relatedIdentifierType" => "CSTR", "relationType" => "References" }
1829
+ )
1830
+
1831
+ # Test relationType HasTranslation and IsTranslationOf
1832
+ expect(subject.related_identifiers).to include(
1833
+ { "relatedIdentifier" => "10.1234/translated-version", "relatedIdentifierType" => "DOI", "relationType" => "HasTranslation" },
1834
+ { "relatedIdentifier" => "10.1234/other-version", "relatedIdentifierType" => "DOI", "relationType" => "IsTranslationOf" }
1835
+ )
1836
+
1837
+ # Test contributorType for Translator
1838
+ expect(subject.contributors.length).to eq(2)
1839
+ expect(subject.contributors.first).to include(
1840
+ "contributorType" => "Translator",
1841
+ "familyName" => "Doe",
1842
+ "givenName" => "Jane"
1843
+ )
1844
+
1845
+ # Test dateType for Coverage
1846
+ expect(subject.dates).to include(
1847
+ { "dateType" => "Coverage", "date" => "2020-01-01" }
1848
+ )
1849
+
1850
+ end
1851
+ end
1688
1852
  end
1853
+
@@ -38,6 +38,7 @@ describe Bolognese::Metadata, vcr: true do
38
38
  #expect(subject.url).to eq("https://blog.datacite.org/eating-your-own-dog-food")
39
39
  expect(subject.types).to eq("bibtex"=>"misc", "citeproc"=>"article", "reourceType"=>"NPM Package", "resourceTypeGeneral"=>"Software", "ris"=>"GEN", "schemaOrg"=>"SoftwareSourceCode")
40
40
  expect(subject.creators).to eq([{"name"=>":(unav)", "nameType"=>"Organizational"}])
41
+ expect(subject.publisher).to eq(nil)
41
42
  expect(subject.titles).to eq([{"title"=>"CITapp"}])
42
43
  expect(subject.descriptions).to eq([{"description"=>"Concealed Information Test app", "descriptionType"=>"Abstract"}])
43
44
  expect(subject.version_info).to eq("1.1.0")
@@ -54,6 +55,7 @@ describe Bolognese::Metadata, vcr: true do
54
55
  #expect(subject.url).to eq("https://blog.datacite.org/eating-your-own-dog-food")
55
56
  expect(subject.types).to eq("bibtex"=>"misc", "citeproc"=>"article", "reourceType"=>"NPM Package", "resourceTypeGeneral"=>"Software", "ris"=>"GEN", "schemaOrg"=>"SoftwareSourceCode")
56
57
  expect(subject.creators).to eq([{"affiliation"=>[], "familyName"=>"Brancotte", "givenName"=>"Bryan", "name"=>"Brancotte, Bryan", "nameIdentifiers"=>[], "nameType"=>"Personal"}])
58
+ expect(subject.publisher).to eq(nil)
57
59
  expect(subject.titles).to eq([{"title"=>"edam-browser"}])
58
60
  expect(subject.descriptions).to eq([{"description"=>
59
61
  + "The EDAM Browser is a client-side web-based visualization javascript widget. Its goals are to help describing bio-related resources and service with EDAM, and to facilitate and foster community contributions to EDAM.",
@@ -38,6 +38,7 @@ describe Bolognese::Metadata, vcr: true do
38
38
  "familyName"=>"Sankar",
39
39
  "nameIdentifiers" => [],
40
40
  "affiliation" => [])
41
+ expect(subject.publisher).to eq({"name"=>"(:unav)"})
41
42
  expect(subject.titles).to eq([{"title"=>"Automated quantitative histology reveals vascular morphodynamics during Arabidopsis hypocotyl secondary growth"}])
42
43
  expect(subject.descriptions.first["description"]).to start_with("Among various advantages, their small size makes model organisms preferred subjects of investigation.")
43
44
  expect(subject.dates).to eq([{"date"=>"2014", "dateType"=>"Issued"}])
@@ -55,6 +56,7 @@ describe Bolognese::Metadata, vcr: true do
55
56
  expect(subject.id).to eq("https://doi.org/10.7554/elife.01567")
56
57
  expect(subject.types).to eq("citeproc"=>"misc", "resourceTypeGeneral"=>"Dissertation", "ris"=>"THES", "schemaOrg"=>"Thesis")
57
58
  expect(subject.creators).to eq([{"nameType"=>"Personal", "name"=>"Toparlar, Y.", "givenName"=>"Y.", "familyName"=>"Toparlar", "nameIdentifiers" => [], "affiliation" => []}])
59
+ expect(subject.publisher).to eq({"name"=>"Technische Universiteit Eindhoven"})
58
60
  expect(subject.titles).to eq([{"title"=>"A multiscale analysis of the urban heat island effect"}])
59
61
  expect(subject.descriptions.first["description"]).to start_with("Designing the climates of cities")
60
62
  expect(subject.dates).to eq([{"date"=>"2018-04-25", "dateType"=>"Issued"}, {"date"=>"2018-04-25", "dateType"=>"Created"}])
@@ -68,6 +70,7 @@ describe Bolognese::Metadata, vcr: true do
68
70
  subject = Bolognese::Metadata.new(input: input, doi: doi)
69
71
  expect(subject.valid?).to be true
70
72
  expect(subject.id).to eq("https://doi.org/10.7554/elife.01567")
73
+ expect(subject.publisher).to eq({"name"=>"Drexel University"})
71
74
  expect(subject.titles).to eq([{"title"=>"Validation of an Image-based Subject-Specific Dynamic Model of the Ankle Joint Complex and its Applications to the Study of the Effect of Articular Surface Morphology on Ankle Joint Mechanics"}])
72
75
  expect(subject.descriptions.first["description"]).to eq(abs)
73
76
  end