bolognese 0.9.8 → 0.9.9

Sign up to get free protection for your applications and to get access to all the features.
Files changed (322) hide show
  1. checksums.yaml +4 -4
  2. data/Gemfile.lock +16 -16
  3. data/README.md +9 -0
  4. data/lib/bolognese.rb +0 -8
  5. data/lib/bolognese/array.rb +2 -2
  6. data/lib/bolognese/author_utils.rb +18 -6
  7. data/lib/bolognese/cli.rb +2 -17
  8. data/lib/bolognese/datacite_utils.rb +8 -7
  9. data/lib/bolognese/metadata.rb +291 -178
  10. data/lib/bolognese/readers/bibtex_reader.rb +66 -0
  11. data/lib/bolognese/readers/citeproc_reader.rb +74 -0
  12. data/lib/bolognese/readers/codemeta_reader.rb +71 -0
  13. data/lib/bolognese/readers/crosscite_reader.rb +12 -0
  14. data/lib/bolognese/readers/crossref_reader.rb +209 -0
  15. data/lib/bolognese/readers/datacite_json_reader.rb +75 -0
  16. data/lib/bolognese/readers/datacite_reader.rb +181 -0
  17. data/lib/bolognese/readers/ris_reader.rb +84 -0
  18. data/lib/bolognese/readers/schema_org_reader.rb +119 -0
  19. data/lib/bolognese/utils.rb +42 -67
  20. data/lib/bolognese/version.rb +1 -1
  21. data/lib/bolognese/writers/bibtex_writer.rb +25 -0
  22. data/lib/bolognese/writers/citeproc_writer.rb +29 -0
  23. data/lib/bolognese/writers/codemeta_writer.rb +25 -0
  24. data/lib/bolognese/writers/crosscite_writer.rb +49 -0
  25. data/lib/bolognese/writers/crossref_writer.rb +9 -0
  26. data/lib/bolognese/writers/datacite_json_writer.rb +45 -0
  27. data/lib/bolognese/writers/datacite_writer.rb +10 -0
  28. data/lib/bolognese/writers/rdf_xml_writer.rb +9 -0
  29. data/lib/bolognese/writers/ris_writer.rb +26 -0
  30. data/lib/bolognese/writers/schema_org_writer.rb +45 -0
  31. data/lib/bolognese/writers/turtle_writer.rb +9 -0
  32. data/spec/author_utils_spec.rb +74 -34
  33. data/spec/cli_spec.rb +6 -6
  34. data/spec/datacite_utils_spec.rb +10 -11
  35. data/spec/doi_utils_spec.rb +2 -1
  36. data/spec/fixtures/crossref.ris +2 -1
  37. data/spec/fixtures/datacite.json +6 -9
  38. data/spec/fixtures/vcr_cassettes/Bolognese_CLI/convert_from_id/crossref/default.yml +9 -7
  39. data/spec/fixtures/vcr_cassettes/Bolognese_CLI/convert_from_id/crossref/to_bibtex.yml +9 -7
  40. data/spec/fixtures/vcr_cassettes/Bolognese_CLI/convert_from_id/crossref/to_crossref.yml +6 -6
  41. data/spec/fixtures/vcr_cassettes/Bolognese_CLI/convert_from_id/crossref/to_datacite.yml +6 -6
  42. data/spec/fixtures/vcr_cassettes/Bolognese_CLI/convert_from_id/crossref/to_schema_org.yml +8 -6
  43. data/spec/fixtures/vcr_cassettes/Bolognese_CLI/convert_from_id/datacite/default.yml +10 -6
  44. data/spec/fixtures/vcr_cassettes/Bolognese_CLI/convert_from_id/datacite/to_bibtex.yml +8 -6
  45. data/spec/fixtures/vcr_cassettes/Bolognese_CLI/convert_from_id/datacite/to_datacite.yml +11 -7
  46. data/spec/fixtures/vcr_cassettes/Bolognese_CLI/convert_from_id/datacite/to_datacite_json.yml +10 -6
  47. data/spec/fixtures/vcr_cassettes/Bolognese_CLI/convert_from_id/datacite/to_schema_org.yml +10 -6
  48. data/spec/fixtures/vcr_cassettes/Bolognese_CLI/convert_from_id/schema_org/default.yml +201 -200
  49. data/spec/fixtures/vcr_cassettes/Bolognese_CLI/convert_from_id/schema_org/to_bibtex.yml +201 -200
  50. data/spec/fixtures/vcr_cassettes/Bolognese_CLI/convert_from_id/schema_org/to_datacite.yml +201 -200
  51. data/spec/fixtures/vcr_cassettes/Bolognese_CLI/convert_from_id/schema_org/to_schema_org.yml +201 -200
  52. data/spec/fixtures/vcr_cassettes/{Bolognese_Crossref/is_personal_name_/has_type_organization.yml → Bolognese_Metadata/authors_as_string/author.yml} +61 -2
  53. data/spec/fixtures/vcr_cassettes/{Bolognese_Crossref/authors_as_string/single_author.yml → Bolognese_Metadata/authors_as_string/no_author.yml} +60 -3
  54. data/spec/fixtures/vcr_cassettes/Bolognese_Metadata/authors_as_string/single_author.yml +203 -0
  55. data/spec/fixtures/vcr_cassettes/Bolognese_Metadata/authors_as_string/with_organization.yml +203 -0
  56. data/spec/fixtures/vcr_cassettes/Bolognese_Metadata/doi_from_url/doi.yml +203 -0
  57. data/spec/fixtures/vcr_cassettes/Bolognese_Metadata/doi_from_url/not_a_doi.yml +203 -0
  58. data/spec/fixtures/vcr_cassettes/Bolognese_Metadata/doi_from_url/url.yml +203 -0
  59. data/spec/fixtures/vcr_cassettes/Bolognese_Metadata/doi_registration_agency/crossref.yml +204 -6
  60. data/spec/fixtures/vcr_cassettes/Bolognese_Metadata/doi_registration_agency/datacite.yml +204 -4
  61. data/spec/fixtures/vcr_cassettes/Bolognese_Metadata/doi_registration_agency/medra.yml +204 -4
  62. data/spec/fixtures/vcr_cassettes/Bolognese_Metadata/doi_registration_agency/not_a_valid_prefix.yml +203 -0
  63. data/spec/fixtures/vcr_cassettes/Bolognese_Metadata/doi_registration_agency/not_found.yml +204 -4
  64. data/spec/fixtures/vcr_cassettes/Bolognese_Metadata/find_from_format_by_ID/crossref.yml +102 -4
  65. data/spec/fixtures/vcr_cassettes/Bolognese_Metadata/find_from_format_by_ID/crossref_doi_not_url.yml +100 -4
  66. data/spec/fixtures/vcr_cassettes/Bolognese_Metadata/find_from_format_by_ID/datacite.yml +102 -4
  67. data/spec/fixtures/vcr_cassettes/Bolognese_Metadata/find_from_format_by_ID/datacite_doi_http.yml +100 -4
  68. data/spec/fixtures/vcr_cassettes/Bolognese_Metadata/find_from_format_by_ID/github.yml +97 -0
  69. data/spec/fixtures/vcr_cassettes/Bolognese_Metadata/find_from_format_by_ID/orcid.yml +99 -0
  70. data/spec/fixtures/vcr_cassettes/{Bolognese_Crossref/get_name_identifier/has_ORCID.yml → Bolognese_Metadata/find_from_format_by_ID/schema_org.yml} +61 -2
  71. data/spec/fixtures/vcr_cassettes/Bolognese_Metadata/find_from_format_from_file/bibtex.yml +99 -0
  72. data/spec/fixtures/vcr_cassettes/Bolognese_Metadata/find_from_format_from_file/citeproc.yml +99 -0
  73. data/spec/fixtures/vcr_cassettes/{Bolognese_Crossref/get_one_author/has_familyName.yml → Bolognese_Metadata/find_from_format_from_file/codemeta.yml} +61 -2
  74. data/spec/fixtures/vcr_cassettes/Bolognese_Metadata/find_from_format_from_file/crossref.yml +99 -0
  75. data/spec/fixtures/vcr_cassettes/Bolognese_Metadata/find_from_format_from_file/datacite.yml +99 -0
  76. data/spec/fixtures/vcr_cassettes/Bolognese_Metadata/find_from_format_from_file/datacite_json.yml +99 -0
  77. data/spec/fixtures/vcr_cassettes/Bolognese_Metadata/find_from_format_from_file/ris.yml +99 -0
  78. data/spec/fixtures/vcr_cassettes/Bolognese_Metadata/find_from_format_from_file/schema_org.yml +97 -0
  79. data/spec/fixtures/vcr_cassettes/{Bolognese_Crossref/is_personal_name_/has_no_info.yml → Bolognese_Metadata/from_schema_org/with_id.yml} +59 -2
  80. data/spec/fixtures/vcr_cassettes/{Bolognese_Codemeta/get_metadata → Bolognese_Metadata/get_codemeta_metadata}/maremma.yml +9 -9
  81. data/spec/fixtures/vcr_cassettes/{Bolognese_Codemeta/get_metadata → Bolognese_Metadata/get_codemeta_metadata}/no_codemeta_json.yml +8 -8
  82. data/spec/fixtures/vcr_cassettes/{Bolognese_Codemeta/get_metadata → Bolognese_Metadata/get_codemeta_metadata}/not_found_error.yml +8 -8
  83. data/spec/fixtures/vcr_cassettes/{Bolognese_Crossref/get_metadata → Bolognese_Metadata/get_crossref_metadata}/DOI_with_ORCID_ID.yml +61 -2
  84. data/spec/fixtures/vcr_cassettes/{Bolognese_Crossref/get_metadata → Bolognese_Metadata/get_crossref_metadata}/DOI_with_SICI_DOI.yml +62 -3
  85. data/spec/fixtures/vcr_cassettes/{Bolognese_Crossref/get_metadata → Bolognese_Metadata/get_crossref_metadata}/DOI_with_data_citation.yml +61 -2
  86. data/spec/fixtures/vcr_cassettes/{Bolognese_Crossref/get_metadata → Bolognese_Metadata/get_crossref_metadata}/date_in_future.yml +61 -2
  87. data/spec/fixtures/vcr_cassettes/{Bolognese_Crossref/get_metadata → Bolognese_Metadata/get_crossref_metadata}/journal_article.yml +62 -3
  88. data/spec/fixtures/vcr_cassettes/Bolognese_Metadata/get_crossref_metadata/not_found_error.yml +97 -0
  89. data/spec/fixtures/vcr_cassettes/Bolognese_Metadata/get_crossref_metadata/posted_content.yml +203 -0
  90. data/spec/fixtures/vcr_cassettes/Bolognese_Metadata/get_datacite_metadata/BlogPosting.yml +99 -0
  91. data/spec/fixtures/vcr_cassettes/Bolognese_Metadata/get_datacite_metadata/Dataset.yml +99 -0
  92. data/spec/fixtures/vcr_cassettes/Bolognese_Metadata/get_datacite_metadata/Funding_schema_version_4.yml +97 -0
  93. data/spec/fixtures/vcr_cassettes/{Bolognese_Datacite/get_metadata → Bolognese_Metadata/get_datacite_metadata}/author_only_full_name.yml +61 -2
  94. data/spec/fixtures/vcr_cassettes/Bolognese_Metadata/get_datacite_metadata/author_with_scheme.yml +97 -0
  95. data/spec/fixtures/vcr_cassettes/{Bolognese_Crossref/get_name_identifier/has_no_ORCID.yml → Bolognese_Metadata/get_datacite_metadata/date.yml} +63 -2
  96. data/spec/fixtures/vcr_cassettes/Bolognese_Metadata/get_datacite_metadata/funding_schema_version_3.yml +99 -0
  97. data/spec/fixtures/vcr_cassettes/Bolognese_Metadata/get_datacite_metadata/is_identical_to.yml +99 -0
  98. data/spec/fixtures/vcr_cassettes/{Bolognese_Datacite/get_metadata → Bolognese_Metadata/get_datacite_metadata}/keywords_with_attributes.yml +64 -3
  99. data/spec/fixtures/vcr_cassettes/{Bolognese_Datacite/get_metadata → Bolognese_Metadata/get_datacite_metadata}/multiple_author_names_in_one_creatorName.yml +63 -2
  100. data/spec/fixtures/vcr_cassettes/{Bolognese_Crossref/get_one_author/has_name_in_display-order.yml → Bolognese_Metadata/get_datacite_metadata/multiple_licenses.yml} +63 -2
  101. data/spec/fixtures/vcr_cassettes/{Bolognese_Crossref/get_metadata/posted_content.yml → Bolognese_Metadata/get_date_from_date_parts/date.yml} +59 -2
  102. data/spec/fixtures/vcr_cassettes/Bolognese_Metadata/get_date_from_date_parts/year-month.yml +203 -0
  103. data/spec/fixtures/vcr_cassettes/Bolognese_Metadata/get_date_from_date_parts/year.yml +203 -0
  104. data/spec/fixtures/vcr_cassettes/Bolognese_Metadata/get_date_parts/date.yml +203 -0
  105. data/spec/fixtures/vcr_cassettes/Bolognese_Metadata/get_date_parts/year-month.yml +203 -0
  106. data/spec/fixtures/vcr_cassettes/Bolognese_Metadata/get_date_parts/year.yml +201 -0
  107. data/spec/fixtures/vcr_cassettes/Bolognese_Metadata/get_name_identifier/has_ORCID.yml +136 -0
  108. data/spec/fixtures/vcr_cassettes/Bolognese_Metadata/get_name_identifier/has_jacow_org_scheme.yml +136 -0
  109. data/spec/fixtures/vcr_cassettes/Bolognese_Metadata/get_name_identifier/has_no_ORCID.yml +136 -0
  110. data/spec/fixtures/vcr_cassettes/Bolognese_Metadata/get_one_author/has_familyName.yml +136 -0
  111. data/spec/fixtures/vcr_cassettes/Bolognese_Metadata/get_one_author/has_multiple_names_in_display-order.yml +136 -0
  112. data/spec/fixtures/vcr_cassettes/Bolognese_Metadata/get_one_author/has_name_in_Thai.yml +134 -0
  113. data/spec/fixtures/vcr_cassettes/Bolognese_Metadata/get_one_author/has_name_in_display-order.yml +136 -0
  114. data/spec/fixtures/vcr_cassettes/Bolognese_Metadata/get_one_author/has_name_in_display-order_with_ORCID.yml +136 -0
  115. data/spec/fixtures/vcr_cassettes/Bolognese_Metadata/get_one_author/has_name_in_sort-order.yml +136 -0
  116. data/spec/fixtures/vcr_cassettes/Bolognese_Metadata/get_one_author/hyper-authorship.yml +132 -0
  117. data/spec/fixtures/vcr_cassettes/Bolognese_Metadata/get_one_author/is_organization.yml +203 -0
  118. data/spec/fixtures/vcr_cassettes/Bolognese_Metadata/get_one_author/multiple_author_names_in_one_field.yml +136 -0
  119. data/spec/fixtures/vcr_cassettes/{Bolognese_SchemaOrg/get_metadata → Bolognese_Metadata/get_schema_org_metadata}/BlogPosting.yml +201 -200
  120. data/spec/fixtures/vcr_cassettes/{Bolognese_SchemaOrg/get_metadata → Bolognese_Metadata/get_schema_org_metadata}/not_found_error.yml +2 -2
  121. data/spec/fixtures/vcr_cassettes/Bolognese_Metadata/insert_alternate_identifiers/insert.yml +97 -0
  122. data/spec/fixtures/vcr_cassettes/Bolognese_Metadata/insert_contributors/none.yml +99 -0
  123. data/spec/fixtures/vcr_cassettes/Bolognese_Metadata/insert_creators/insert.yml +99 -0
  124. data/spec/fixtures/vcr_cassettes/Bolognese_Metadata/insert_dates/insert.yml +99 -0
  125. data/spec/fixtures/vcr_cassettes/Bolognese_Metadata/insert_descriptions/insert.yml +99 -0
  126. data/spec/fixtures/vcr_cassettes/Bolognese_Metadata/insert_identifier/doi.yml +99 -0
  127. data/spec/fixtures/vcr_cassettes/Bolognese_Metadata/insert_person/creator_only_name.yml +99 -0
  128. data/spec/fixtures/vcr_cassettes/Bolognese_Metadata/insert_publication_year/insert.yml +99 -0
  129. data/spec/fixtures/vcr_cassettes/Bolognese_Metadata/insert_publisher/insert.yml +99 -0
  130. data/spec/fixtures/vcr_cassettes/Bolognese_Metadata/insert_related_identifiers/insert.yml +99 -0
  131. data/spec/fixtures/vcr_cassettes/Bolognese_Metadata/insert_related_identifiers/related_identifier.yml +99 -0
  132. data/spec/fixtures/vcr_cassettes/Bolognese_Metadata/insert_resource_type/insert.yml +99 -0
  133. data/spec/fixtures/vcr_cassettes/Bolognese_Metadata/insert_rights_list/insert.yml +97 -0
  134. data/spec/fixtures/vcr_cassettes/Bolognese_Metadata/insert_subjects/insert.yml +99 -0
  135. data/spec/fixtures/vcr_cassettes/Bolognese_Metadata/insert_titles/insert.yml +99 -0
  136. data/spec/fixtures/vcr_cassettes/Bolognese_Metadata/insert_version/insert.yml +97 -0
  137. data/spec/fixtures/vcr_cassettes/Bolognese_Metadata/is_personal_name_/has_comma.yml +203 -0
  138. data/spec/fixtures/vcr_cassettes/{Bolognese_Crossref → Bolognese_Metadata}/is_personal_name_/has_family_name.yml +61 -2
  139. data/spec/fixtures/vcr_cassettes/Bolognese_Metadata/is_personal_name_/has_id.yml +201 -0
  140. data/spec/fixtures/vcr_cassettes/{Bolognese_Crossref → Bolognese_Metadata}/is_personal_name_/has_known_given_name.yml +61 -2
  141. data/spec/fixtures/vcr_cassettes/{Bolognese_Crossref/is_personal_name_/has_type_person.yml → Bolognese_Metadata/is_personal_name_/has_no_info.yml} +61 -2
  142. data/spec/fixtures/vcr_cassettes/Bolognese_Metadata/is_personal_name_/has_type_organization.yml +203 -0
  143. data/spec/fixtures/vcr_cassettes/Bolognese_Metadata/jsonlint/missing_comma.yml +99 -0
  144. data/spec/fixtures/vcr_cassettes/Bolognese_Metadata/jsonlint/nil.yml +99 -0
  145. data/spec/fixtures/vcr_cassettes/Bolognese_Metadata/jsonlint/overlapping_keys.yml +97 -0
  146. data/spec/fixtures/vcr_cassettes/Bolognese_Metadata/jsonlint/valid.yml +99 -0
  147. data/spec/fixtures/vcr_cassettes/{Bolognese_Crossref/authors_as_string/author.yml → Bolognese_Metadata/normalize_doi/SICI_doi.yml} +59 -2
  148. data/spec/fixtures/vcr_cassettes/Bolognese_Metadata/normalize_doi/doi.yml +203 -0
  149. data/spec/fixtures/vcr_cassettes/Bolognese_Metadata/normalize_doi/doi_from_url_without_doi_proxy.yml +203 -0
  150. data/spec/fixtures/vcr_cassettes/Bolognese_Metadata/normalize_doi/doi_prefix_too_long.yml +203 -0
  151. data/spec/fixtures/vcr_cassettes/Bolognese_Metadata/normalize_doi/doi_prefix_with_string.yml +203 -0
  152. data/spec/fixtures/vcr_cassettes/{Bolognese_Crossref/authors_as_string/no_author.yml → Bolognese_Metadata/normalize_doi/doi_with_protocol.yml} +59 -2
  153. data/spec/fixtures/vcr_cassettes/Bolognese_Metadata/normalize_doi/dx_doi_org_url.yml +203 -0
  154. data/spec/fixtures/vcr_cassettes/Bolognese_Metadata/normalize_doi/https_url.yml +203 -0
  155. data/spec/fixtures/vcr_cassettes/Bolognese_Metadata/normalize_doi/not_valid_doi_prefix.yml +203 -0
  156. data/spec/fixtures/vcr_cassettes/Bolognese_Metadata/normalize_doi/url_with_one_slash.yml +203 -0
  157. data/spec/fixtures/vcr_cassettes/Bolognese_Metadata/normalize_id/doi.yml +203 -0
  158. data/spec/fixtures/vcr_cassettes/Bolognese_Metadata/normalize_id/doi_as_url.yml +203 -0
  159. data/spec/fixtures/vcr_cassettes/Bolognese_Metadata/normalize_id/ftp.yml +203 -0
  160. data/spec/fixtures/vcr_cassettes/Bolognese_Metadata/normalize_id/invalid_url.yml +203 -0
  161. data/spec/fixtures/vcr_cassettes/Bolognese_Metadata/normalize_id/string.yml +203 -0
  162. data/spec/fixtures/vcr_cassettes/{Bolognese_Crossref/get_one_author/is_organization.yml → Bolognese_Metadata/normalize_id/url.yml} +59 -2
  163. data/spec/fixtures/vcr_cassettes/Bolognese_Metadata/normalize_id/url_with_utf-8.yml +203 -0
  164. data/spec/fixtures/vcr_cassettes/Bolognese_Metadata/normalize_ids/doi.yml +203 -0
  165. data/spec/fixtures/vcr_cassettes/Bolognese_Metadata/normalize_ids/url.yml +203 -0
  166. data/spec/fixtures/vcr_cassettes/{Bolognese_Crossref/is_personal_name_/has_comma.yml → Bolognese_Metadata/normalize_url/uri.yml} +2 -2
  167. data/spec/fixtures/vcr_cassettes/{Bolognese_Crossref/authors_as_string/with_organization.yml → Bolognese_Metadata/normalize_url/with_trailing_slash.yml} +2 -2
  168. data/spec/fixtures/vcr_cassettes/Bolognese_Metadata/parse_attributes/array.yml +203 -0
  169. data/spec/fixtures/vcr_cassettes/{Bolognese_Crossref/is_personal_name_/has_id.yml → Bolognese_Metadata/parse_attributes/hash.yml} +59 -2
  170. data/spec/fixtures/vcr_cassettes/Bolognese_Metadata/parse_attributes/nil.yml +203 -0
  171. data/spec/fixtures/vcr_cassettes/Bolognese_Metadata/parse_attributes/string.yml +203 -0
  172. data/spec/fixtures/vcr_cassettes/Bolognese_Metadata/sanitize/should_only_keep_specific_tags.yml +203 -0
  173. data/spec/fixtures/vcr_cassettes/Bolognese_Metadata/sanitize/should_remove_a_tags.yml +203 -0
  174. data/spec/fixtures/vcr_cassettes/Bolognese_Metadata/to_schema_org/with_id.yml +203 -0
  175. data/spec/fixtures/vcr_cassettes/Bolognese_Metadata/validate_url/DOI.yml +203 -0
  176. data/spec/fixtures/vcr_cassettes/Bolognese_Metadata/validate_url/ISSN.yml +203 -0
  177. data/spec/fixtures/vcr_cassettes/Bolognese_Metadata/validate_url/URL.yml +203 -0
  178. data/spec/fixtures/vcr_cassettes/Bolognese_Metadata/validate_url/string.yml +203 -0
  179. data/spec/fixtures/vcr_cassettes/Bolognese_Metadata/write_metadata_as_bibtex/BlogPosting.yml +99 -0
  180. data/spec/fixtures/vcr_cassettes/Bolognese_Metadata/write_metadata_as_bibtex/Dataset.yml +99 -0
  181. data/spec/fixtures/vcr_cassettes/{Bolognese_SchemaOrg/get_metadata/BlogPosting_schema_org_JSON.yml → Bolognese_Metadata/write_metadata_as_bibtex/from_schema_org.yml} +201 -200
  182. data/spec/fixtures/vcr_cassettes/{Bolognese_Codemeta/get_metadata_as_datacite_xml → Bolognese_Metadata/write_metadata_as_bibtex}/maremma.yml +9 -9
  183. data/spec/fixtures/vcr_cassettes/Bolognese_Metadata/write_metadata_as_bibtex/with_data_citation.yml +731 -0
  184. data/spec/fixtures/vcr_cassettes/{Bolognese_Crossref/get_metadata_as_citeproc → Bolognese_Metadata/write_metadata_as_bibtex}/with_pages.yml +61 -2
  185. data/spec/fixtures/vcr_cassettes/Bolognese_Metadata/write_metadata_as_citeproc/BlogPosting.yml +99 -0
  186. data/spec/fixtures/vcr_cassettes/{Bolognese_SchemaOrg/get_metadata_as_bibtex/with_data_citation.yml → Bolognese_Metadata/write_metadata_as_citeproc/BlogPosting_schema_org.yml} +201 -200
  187. data/spec/fixtures/vcr_cassettes/Bolognese_Metadata/write_metadata_as_citeproc/Dataset.yml +99 -0
  188. data/spec/fixtures/vcr_cassettes/{Bolognese_Crossref/get_metadata_as_citeproc → Bolognese_Metadata/write_metadata_as_citeproc}/journal_article.yml +62 -3
  189. data/spec/fixtures/vcr_cassettes/{Bolognese_Codemeta/get_metadata_as_ris → Bolognese_Metadata/write_metadata_as_citeproc}/maremma.yml +8 -8
  190. data/spec/fixtures/vcr_cassettes/{Bolognese_Crossref/get_metadata_as_ris → Bolognese_Metadata/write_metadata_as_citeproc}/with_pages.yml +61 -2
  191. data/spec/fixtures/vcr_cassettes/Bolognese_Metadata/write_metadata_as_codemeta/SoftwareSourceCode_DataCite.yml +99 -0
  192. data/spec/fixtures/vcr_cassettes/{Bolognese_Codemeta/get_metadata_as_bibtex → Bolognese_Metadata/write_metadata_as_crosscite}/maremma.yml +9 -9
  193. data/spec/fixtures/vcr_cassettes/{Bolognese_Crossref/get_metadata_as_datacite_xml → Bolognese_Metadata/write_metadata_as_crosscite}/with_ORCID_ID.yml +61 -2
  194. data/spec/fixtures/vcr_cassettes/Bolognese_Metadata/write_metadata_as_crosscite/with_data_citation.yml +731 -0
  195. data/spec/fixtures/vcr_cassettes/{Bolognese_SchemaOrg/get_metadata_as_citeproc/BlogPosting.yml → Bolognese_Metadata/write_metadata_as_crosscite/with_data_citation_schema_org.yml} +201 -200
  196. data/spec/fixtures/vcr_cassettes/{Bolognese_Crossref/get_metadata_as_datacite_xml → Bolognese_Metadata/write_metadata_as_crosscite}/with_editor.yml +62 -3
  197. data/spec/fixtures/vcr_cassettes/{Bolognese_Crossref/get_one_author/has_name_in_sort-order.yml → Bolognese_Metadata/write_metadata_as_crossref/from_DataCite.yml} +61 -2
  198. data/spec/fixtures/vcr_cassettes/Bolognese_Metadata/write_metadata_as_datacite_json/maremma.yml +100 -0
  199. data/spec/fixtures/vcr_cassettes/Bolognese_Metadata/write_metadata_as_datacite_json/with_ORCID_ID.yml +377 -0
  200. data/spec/fixtures/vcr_cassettes/{Bolognese_Crossref/get_metadata_as_datacite_xml → Bolognese_Metadata/write_metadata_as_datacite_json}/with_data_citation.yml +61 -2
  201. data/spec/fixtures/vcr_cassettes/Bolognese_Metadata/write_metadata_as_datacite_json/with_data_citation_schema_org.yml +654 -0
  202. data/spec/fixtures/vcr_cassettes/Bolognese_Metadata/write_metadata_as_datacite_xml/Dataset_in_schema_4_0.yml +97 -0
  203. data/spec/fixtures/vcr_cassettes/{Bolognese_Codemeta/get_metadata_as_citeproc → Bolognese_Metadata/write_metadata_as_datacite_xml}/maremma.yml +9 -9
  204. data/spec/fixtures/vcr_cassettes/Bolognese_Metadata/write_metadata_as_datacite_xml/with_ORCID_ID.yml +377 -0
  205. data/spec/fixtures/vcr_cassettes/{Bolognese_Crossref/get_metadata_as_ris/journal_article.yml → Bolognese_Metadata/write_metadata_as_datacite_xml/with_data_citation.yml} +61 -2
  206. data/spec/fixtures/vcr_cassettes/Bolognese_Metadata/write_metadata_as_datacite_xml/with_data_citation_schema_org.yml +654 -0
  207. data/spec/fixtures/vcr_cassettes/Bolognese_Metadata/write_metadata_as_datacite_xml/with_editor.yml +944 -0
  208. data/spec/fixtures/vcr_cassettes/{Bolognese_DataciteJson/get_metadata_as_rdf_xml → Bolognese_Metadata/write_metadata_as_rdf_xml}/BlogPosting.yml +88 -23
  209. data/spec/fixtures/vcr_cassettes/{Bolognese_Citeproc/get_metadata_as_rdf_xml/BlogPosting.yml → Bolognese_Metadata/write_metadata_as_rdf_xml/BlogPosting_Citeproc_JSON.yml} +26 -20
  210. data/spec/fixtures/vcr_cassettes/{Bolognese_Bibtex/get_metadata_as_rdf_xml → Bolognese_Metadata/write_metadata_as_rdf_xml}/Crossref_DOI.yml +26 -20
  211. data/spec/fixtures/vcr_cassettes/{Bolognese_Crossref/get_metadata_as_rdf_xml → Bolognese_Metadata/write_metadata_as_rdf_xml}/journal_article.yml +87 -22
  212. data/spec/fixtures/vcr_cassettes/{Bolognese_Codemeta/get_metadata_as_rdf_xml → Bolognese_Metadata/write_metadata_as_rdf_xml}/maremma.yml +35 -29
  213. data/spec/fixtures/vcr_cassettes/{Bolognese_Crossref/get_metadata_as_turtle → Bolognese_Metadata/write_metadata_as_rdf_xml}/with_pages.yml +88 -23
  214. data/spec/fixtures/vcr_cassettes/Bolognese_Metadata/write_metadata_as_ris/BlogPosting.yml +99 -0
  215. data/spec/fixtures/vcr_cassettes/Bolognese_Metadata/write_metadata_as_ris/BlogPosting_schema_org.yml +654 -0
  216. data/spec/fixtures/vcr_cassettes/Bolognese_Metadata/write_metadata_as_ris/Dataset.yml +99 -0
  217. data/spec/fixtures/vcr_cassettes/{Bolognese_Crossref/get_metadata_as_bibtex/with_data_citation.yml → Bolognese_Metadata/write_metadata_as_ris/journal_article.yml} +59 -2
  218. data/spec/fixtures/vcr_cassettes/Bolognese_Metadata/write_metadata_as_ris/maremma.yml +100 -0
  219. data/spec/fixtures/vcr_cassettes/{Bolognese_Crossref/get_metadata_as_bibtex → Bolognese_Metadata/write_metadata_as_ris}/with_pages.yml +62 -3
  220. data/spec/fixtures/vcr_cassettes/Bolognese_Metadata/write_metadata_as_schema_org/Schema_org_JSON_IsSupplementTo.yml +99 -0
  221. data/spec/fixtures/vcr_cassettes/Bolognese_Metadata/write_metadata_as_schema_org/Schema_org_JSON_isReferencedBy.yml +99 -0
  222. data/spec/fixtures/vcr_cassettes/{Bolognese_Crossref/get_metadata/Schema_org_JSON.yml → Bolognese_Metadata/write_metadata_as_schema_org/journal_article.yml} +61 -2
  223. data/spec/fixtures/vcr_cassettes/{Bolognese_Codemeta/get_metadata → Bolognese_Metadata/write_metadata_as_schema_org}/maremma_schema_org_JSON.yml +9 -9
  224. data/spec/fixtures/vcr_cassettes/{Bolognese_Datacite/get_metadata_as_rdf_xml → Bolognese_Metadata/write_metadata_as_turtle}/BlogPosting.yml +88 -23
  225. data/spec/fixtures/vcr_cassettes/{Bolognese_Citeproc/get_metadata_as_turtle/BlogPosting.yml → Bolognese_Metadata/write_metadata_as_turtle/BlogPosting_Citeproc_JSON.yml} +26 -20
  226. data/spec/fixtures/vcr_cassettes/Bolognese_Metadata/write_metadata_as_turtle/BlogPosting_DataCite_JSON.yml +4589 -0
  227. data/spec/fixtures/vcr_cassettes/{Bolognese_Bibtex/get_metadata_as_turtle → Bolognese_Metadata/write_metadata_as_turtle}/Crossref_DOI.yml +26 -20
  228. data/spec/fixtures/vcr_cassettes/Bolognese_Metadata/write_metadata_as_turtle/DataONE.yml +4589 -0
  229. data/spec/fixtures/vcr_cassettes/{Bolognese_Datacite/get_metadata_as_turtle → Bolognese_Metadata/write_metadata_as_turtle}/Dataset.yml +88 -23
  230. data/spec/fixtures/vcr_cassettes/{Bolognese_Crossref/get_metadata_as_turtle → Bolognese_Metadata/write_metadata_as_turtle}/journal_article.yml +87 -22
  231. data/spec/fixtures/vcr_cassettes/{Bolognese_Crossref/get_metadata_as_rdf_xml → Bolognese_Metadata/write_metadata_as_turtle}/with_pages.yml +87 -22
  232. data/spec/metadata_spec.rb +8 -2
  233. data/spec/readers/bibtex_reader_spec.rb +30 -0
  234. data/spec/readers/citeproc_reader_spec.rb +28 -0
  235. data/spec/readers/codemeta_reader_spec.rb +90 -0
  236. data/spec/readers/crossref_reader_spec.rb +142 -0
  237. data/spec/readers/datacite_json_reader_spec.rb +48 -0
  238. data/spec/readers/datacite_reader_spec.rb +215 -0
  239. data/spec/readers/ris_reader_spec.rb +32 -0
  240. data/spec/readers/schema_org_reader_spec.rb +63 -0
  241. data/spec/utils_spec.rb +24 -25
  242. data/spec/writers/bibtex_writer_spec.rb +102 -0
  243. data/spec/writers/citeproc_writer_spec.rb +138 -0
  244. data/spec/writers/codemeta_writer_spec.rb +36 -0
  245. data/spec/writers/crosscite_writer_spec.rb +81 -0
  246. data/spec/writers/crossref_writer_spec.rb +19 -0
  247. data/spec/writers/datacite_json_writer_spec.rb +74 -0
  248. data/spec/writers/datacite_writer_spec.rb +124 -0
  249. data/spec/writers/rdf_xml_writer_spec.rb +97 -0
  250. data/spec/writers/ris_writer_spec.rb +153 -0
  251. data/spec/writers/schema_org_writer_spec.rb +59 -0
  252. data/spec/writers/turtle_writer_spec.rb +82 -0
  253. metadata +213 -132
  254. data/codemeta.json +0 -39
  255. data/lib/bolognese/bibtex.rb +0 -163
  256. data/lib/bolognese/citeproc.rb +0 -120
  257. data/lib/bolognese/codemeta.rb +0 -153
  258. data/lib/bolognese/crossref.rb +0 -281
  259. data/lib/bolognese/datacite.rb +0 -288
  260. data/lib/bolognese/datacite_json.rb +0 -220
  261. data/lib/bolognese/ris.rb +0 -117
  262. data/lib/bolognese/schema_org.rb +0 -196
  263. data/spec/bibtex_spec.rb +0 -90
  264. data/spec/citeproc_spec.rb +0 -66
  265. data/spec/codemeta_spec.rb +0 -221
  266. data/spec/crossref_spec.rb +0 -348
  267. data/spec/datacite_json_spec.rb +0 -125
  268. data/spec/datacite_spec.rb +0 -406
  269. data/spec/fixtures/vcr_cassettes/Bolognese_Codemeta/get_metadata_as_schema_org_JSON/maremma.yml +0 -100
  270. data/spec/fixtures/vcr_cassettes/Bolognese_Codemeta/get_metadata_as_turtle/maremma.yml +0 -4680
  271. data/spec/fixtures/vcr_cassettes/Bolognese_Crossref/get_metadata/not_found_error.yml +0 -38
  272. data/spec/fixtures/vcr_cassettes/Bolognese_Crossref/get_metadata_as_string/DOI_with_data_citation.yml +0 -672
  273. data/spec/fixtures/vcr_cassettes/Bolognese_Crossref/get_one_author/author.yml +0 -38
  274. data/spec/fixtures/vcr_cassettes/Bolognese_Crossref/get_one_author/has_multiple_names_in_display-order.yml +0 -38
  275. data/spec/fixtures/vcr_cassettes/Bolognese_Crossref/get_one_author/has_name_in_Thai.yml +0 -38
  276. data/spec/fixtures/vcr_cassettes/Bolognese_Crossref/get_one_author/has_name_in_display-order_with_ORCID.yml +0 -38
  277. data/spec/fixtures/vcr_cassettes/Bolognese_Crossref/get_one_author/hyper-authorship.yml +0 -38
  278. data/spec/fixtures/vcr_cassettes/Bolognese_Crossref/get_one_author/multiple_author_names.yml +0 -38
  279. data/spec/fixtures/vcr_cassettes/Bolognese_Crossref/get_one_author/multiple_author_names_in_one_field.yml +0 -38
  280. data/spec/fixtures/vcr_cassettes/Bolognese_Datacite/get_metadata/BlogPosting.yml +0 -40
  281. data/spec/fixtures/vcr_cassettes/Bolognese_Datacite/get_metadata/Dataset.yml +0 -40
  282. data/spec/fixtures/vcr_cassettes/Bolognese_Datacite/get_metadata/Date.yml +0 -40
  283. data/spec/fixtures/vcr_cassettes/Bolognese_Datacite/get_metadata/Funding_schema_version_3.yml +0 -40
  284. data/spec/fixtures/vcr_cassettes/Bolognese_Datacite/get_metadata/Funding_schema_version_4.yml +0 -38
  285. data/spec/fixtures/vcr_cassettes/Bolognese_Datacite/get_metadata/Schema_org_JSON_IsSupplementTo.yml +0 -40
  286. data/spec/fixtures/vcr_cassettes/Bolognese_Datacite/get_metadata/Schema_org_JSON_isReferencedBy.yml +0 -40
  287. data/spec/fixtures/vcr_cassettes/Bolognese_Datacite/get_metadata/author.yml +0 -38
  288. data/spec/fixtures/vcr_cassettes/Bolognese_Datacite/get_metadata/author_with_scheme.yml +0 -38
  289. data/spec/fixtures/vcr_cassettes/Bolognese_Datacite/get_metadata/is_identical_to.yml +0 -40
  290. data/spec/fixtures/vcr_cassettes/Bolognese_Datacite/get_metadata/jsonlint.yml +0 -38
  291. data/spec/fixtures/vcr_cassettes/Bolognese_Datacite/get_metadata/multiple_licenses.yml +0 -40
  292. data/spec/fixtures/vcr_cassettes/Bolognese_Datacite/get_metadata_as_bibtex/BlogPosting.yml +0 -40
  293. data/spec/fixtures/vcr_cassettes/Bolognese_Datacite/get_metadata_as_bibtex/Dataset.yml +0 -40
  294. data/spec/fixtures/vcr_cassettes/Bolognese_Datacite/get_metadata_as_citeproc/BlogPosting.yml +0 -38
  295. data/spec/fixtures/vcr_cassettes/Bolognese_Datacite/get_metadata_as_citeproc/Dataset.yml +0 -40
  296. data/spec/fixtures/vcr_cassettes/Bolognese_Datacite/get_metadata_as_codemeta/SoftwareSourceCode.yml +0 -40
  297. data/spec/fixtures/vcr_cassettes/Bolognese_Datacite/get_metadata_as_datacite_xml_4_0/Dataset.yml +0 -40
  298. data/spec/fixtures/vcr_cassettes/Bolognese_Datacite/get_metadata_as_ris/BlogPosting.yml +0 -40
  299. data/spec/fixtures/vcr_cassettes/Bolognese_Datacite/get_metadata_as_ris/Dataset.yml +0 -40
  300. data/spec/fixtures/vcr_cassettes/Bolognese_Datacite/get_metadata_as_turtle/BlogPosting.yml +0 -4620
  301. data/spec/fixtures/vcr_cassettes/Bolognese_Datacite/insert_alternate_identifiers/insert.yml +0 -38
  302. data/spec/fixtures/vcr_cassettes/Bolognese_Datacite/insert_contributors/none.yml +0 -40
  303. data/spec/fixtures/vcr_cassettes/Bolognese_Datacite/insert_creators/insert.yml +0 -40
  304. data/spec/fixtures/vcr_cassettes/Bolognese_Datacite/insert_dates/insert.yml +0 -40
  305. data/spec/fixtures/vcr_cassettes/Bolognese_Datacite/insert_descriptions/insert.yml +0 -38
  306. data/spec/fixtures/vcr_cassettes/Bolognese_Datacite/insert_identifier/doi.yml +0 -40
  307. data/spec/fixtures/vcr_cassettes/Bolognese_Datacite/insert_person/creator_only_name.yml +0 -38
  308. data/spec/fixtures/vcr_cassettes/Bolognese_Datacite/insert_publication_year/insert.yml +0 -38
  309. data/spec/fixtures/vcr_cassettes/Bolognese_Datacite/insert_publisher/insert.yml +0 -38
  310. data/spec/fixtures/vcr_cassettes/Bolognese_Datacite/insert_related_identifiers/insert.yml +0 -38
  311. data/spec/fixtures/vcr_cassettes/Bolognese_Datacite/insert_related_identifiers/related_identifier.yml +0 -40
  312. data/spec/fixtures/vcr_cassettes/Bolognese_Datacite/insert_resource_type/insert.yml +0 -40
  313. data/spec/fixtures/vcr_cassettes/Bolognese_Datacite/insert_rights_list/insert.yml +0 -40
  314. data/spec/fixtures/vcr_cassettes/Bolognese_Datacite/insert_subjects/insert.yml +0 -40
  315. data/spec/fixtures/vcr_cassettes/Bolognese_Datacite/insert_titles/insert.yml +0 -40
  316. data/spec/fixtures/vcr_cassettes/Bolognese_Datacite/insert_version/insert.yml +0 -40
  317. data/spec/fixtures/vcr_cassettes/Bolognese_DataciteJson/get_metadata_as_turtle/BlogPosting.yml +0 -4583
  318. data/spec/fixtures/vcr_cassettes/Bolognese_Metadata/generate/datacite.yml +0 -40
  319. data/spec/fixtures/vcr_cassettes/Bolognese_Metadata/read/datacite.yml +0 -40
  320. data/spec/fixtures/vcr_cassettes/Bolognese_SchemaOrg/get_metadata_as_datacite_xml/with_data_citation.yml +0 -653
  321. data/spec/fixtures/vcr_cassettes/Bolognese_SchemaOrg/get_metadata_as_ris/BlogPosting.yml +0 -653
  322. data/spec/schema_org_spec.rb +0 -151
@@ -0,0 +1,138 @@
1
+ require 'spec_helper'
2
+
3
+ describe Bolognese::Metadata, vcr: true do
4
+ context "write metadata as citeproc" do
5
+ it "Dataset" do
6
+ input = "https://doi.org/10.5061/DRYAD.8515"
7
+ subject = Bolognese::Metadata.new(input: input, from: "datacite")
8
+ expect(subject.valid?).to be true
9
+ json = JSON.parse(subject.citeproc)
10
+ expect(json["type"]).to eq("dataset")
11
+ expect(json["id"]).to eq("https://doi.org/10.5061/dryad.8515")
12
+ expect(json["DOI"]).to eq("10.5061/dryad.8515")
13
+ expect(json["title"]).to eq("Data from: A new malaria agent in African hominids.")
14
+ expect(json["author"]).to eq([{"family"=>"Ollomo", "given"=>"Benjamin"},
15
+ {"family"=>"Durand", "given"=>"Patrick"},
16
+ {"family"=>"Prugnolle", "given"=>"Franck"},
17
+ {"family"=>"Douzery", "given"=>"Emmanuel J. P."},
18
+ {"family"=>"Arnathau", "given"=>"Céline"},
19
+ {"family"=>"Nkoghe", "given"=>"Dieudonné"},
20
+ {"family"=>"Leroy", "given"=>"Eric"},
21
+ {"family"=>"Renaud", "given"=>"François"}])
22
+ expect(json["publisher"]).to eq("Dryad Digital Repository")
23
+ expect(json["issued"]).to eq("date-parts" => [[2011]])
24
+ end
25
+
26
+ it "BlogPosting" do
27
+ input = "https://doi.org/10.5438/4K3M-NYVG"
28
+ subject = Bolognese::Metadata.new(input: input, from: "datacite")
29
+ expect(subject.valid?).to be true
30
+ json = JSON.parse(subject.citeproc)
31
+ expect(json["type"]).to eq("report")
32
+ expect(json["id"]).to eq("https://doi.org/10.5438/4k3m-nyvg")
33
+ expect(json["DOI"]).to eq("10.5438/4k3m-nyvg")
34
+ expect(json["title"]).to eq("Eating your own Dog Food")
35
+ expect(json["author"]).to eq("family"=>"Fenner", "given"=>"Martin")
36
+ expect(json["publisher"]).to eq("DataCite")
37
+ expect(json["issued"]).to eq("date-parts"=>[[2016, 12, 20]])
38
+ end
39
+
40
+ it "BlogPosting DataCite JSON" do
41
+ input = fixture_path + "datacite.json"
42
+ subject = Bolognese::Metadata.new(input: input, from: "datacite_json")
43
+ json = JSON.parse(subject.citeproc)
44
+ expect(json["type"]).to eq("report")
45
+ expect(json["id"]).to eq("https://doi.org/10.5438/4k3m-nyvg")
46
+ expect(json["DOI"]).to eq("10.5438/4K3M-NYVG")
47
+ expect(json["title"]).to eq("Eating your own Dog Food")
48
+ expect(json["author"]).to eq("family" => "Fenner","given" => "Martin")
49
+ expect(json["publisher"]).to eq("DataCite")
50
+ expect(json["issued"]).to eq("date-parts" => [[2016, 12, 20]])
51
+ end
52
+
53
+ it "BlogPosting schema.org" do
54
+ input = "https://blog.datacite.org/eating-your-own-dog-food/"
55
+ subject = Bolognese::Metadata.new(input: input, from: "schema_org")
56
+ json = JSON.parse(subject.citeproc)
57
+ expect(json["type"]).to eq("post-weblog")
58
+ expect(json["id"]).to eq("https://doi.org/10.5438/4k3m-nyvg")
59
+ expect(json["DOI"]).to eq("10.5438/4k3m-nyvg")
60
+ expect(json["title"]).to eq("Eating your own Dog Food")
61
+ expect(json["author"]).to eq("family" => "Fenner","given" => "Martin")
62
+ expect(json["publisher"]).to eq("DataCite")
63
+ expect(json["issued"]).to eq("date-parts" => [[2016, 12, 20]])
64
+ end
65
+
66
+ it "journal article" do
67
+ input = "10.7554/eLife.01567"
68
+ subject = Bolognese::Metadata.new(input: input, from: "crossref")
69
+ expect(subject.valid?).to be true
70
+ json = JSON.parse(subject.citeproc)
71
+ expect(json["type"]).to eq("article-journal")
72
+ expect(json["id"]).to eq("https://doi.org/10.7554/elife.01567")
73
+ expect(json["DOI"]).to eq("10.7554/eLife.01567")
74
+ expect(json["title"]).to eq("Automated quantitative histology reveals vascular morphodynamics during Arabidopsis hypocotyl secondary growth")
75
+ expect(json["author"]).to eq([{"family"=>"Sankar", "given"=>"Martial"},
76
+ {"family"=>"Nieminen", "given"=>"Kaisa"},
77
+ {"family"=>"Ragni", "given"=>"Laura"},
78
+ {"family"=>"Xenarios", "given"=>"Ioannis"},
79
+ {"family"=>"Hardtke", "given"=>"Christian S"}])
80
+ expect(json["container-title"]).to eq("eLife")
81
+ expect(json["volume"]).to eq("3")
82
+ expect(json["issued"]).to eq("date-parts" => [[2014, 2, 11]])
83
+ end
84
+
85
+ it "with pages" do
86
+ input = "https://doi.org/10.1155/2012/291294"
87
+ subject = Bolognese::Metadata.new(input: input, from: "crossref")
88
+ expect(subject.valid?).to be true
89
+ json = JSON.parse(subject.citeproc)
90
+ expect(json["type"]).to eq("article-journal")
91
+ expect(json["id"]).to eq("https://doi.org/10.1155/2012/291294")
92
+ expect(json["DOI"]).to eq("10.1155/2012/291294")
93
+ expect(json["title"]).to eq("Delineating a Retesting Zone Using Receiver Operating Characteristic Analysis on Serial QuantiFERON Tuberculosis Test Results in US Healthcare Workers")
94
+ expect(json["author"]).to eq([{"family"=>"Thanassi", "given"=>"Wendy"},
95
+ {"family"=>"Noda", "given"=>"Art"},
96
+ {"family"=>"Hernandez", "given"=>"Beatriz"},
97
+ {"family"=>"Newell", "given"=>"Jeffery"},
98
+ {"family"=>"Terpeluk", "given"=>"Paul"},
99
+ {"family"=>"Marder", "given"=>"David"},
100
+ {"family"=>"Yesavage", "given"=>"Jerome A."}])
101
+ expect(json["container-title"]).to eq("Pulmonary Medicine")
102
+ expect(json["volume"]).to eq("2012")
103
+ expect(json["page"]).to eq("1-7")
104
+ expect(json["issued"]).to eq("date-parts"=>[[2012]])
105
+ end
106
+
107
+ it "Crossref DOI" do
108
+ input = fixture_path + "crossref.bib"
109
+ subject = Bolognese::Metadata.new(input: input, from: "bibtex")
110
+ json = JSON.parse(subject.citeproc)
111
+ expect(json["type"]).to eq("article-journal")
112
+ expect(json["id"]).to eq("https://doi.org/10.7554/elife.01567")
113
+ expect(json["DOI"]).to eq("10.7554/elife.01567")
114
+ expect(json["URL"]).to eq("http://elifesciences.org/lookup/doi/10.7554/eLife.01567")
115
+ expect(json["title"]).to eq("Automated quantitative histology reveals vascular morphodynamics during Arabidopsis hypocotyl secondary growth")
116
+ expect(json["author"]).to eq([{"family"=>"Sankar", "given"=>"Martial"},
117
+ {"family"=>"Nieminen", "given"=>"Kaisa"},
118
+ {"family"=>"Ragni", "given"=>"Laura"},
119
+ {"family"=>"Xenarios", "given"=>"Ioannis"},
120
+ {"family"=>"Hardtke", "given"=>"Christian S"}])
121
+ expect(json["container-title"]).to eq("eLife")
122
+ expect(json["issued"]).to eq("date-parts" => [[2014]])
123
+ end
124
+
125
+ it "maremma" do
126
+ input = "https://github.com/datacite/maremma"
127
+ subject = Bolognese::Metadata.new(input: input, from: "codemeta")
128
+ json = JSON.parse(subject.citeproc)
129
+ expect(json["type"]).to eq("computer_program")
130
+ expect(json["id"]).to eq("https://doi.org/10.5438/qeg0-3gm3")
131
+ expect(json["DOI"]).to eq("10.5438/qeg0-3gm3")
132
+ expect(json["title"]).to eq("Maremma: a Ruby library for simplified network calls")
133
+ expect(json["author"]).to eq("family" => "Fenner", "given" => "Martin")
134
+ expect(json["publisher"]).to eq("DataCite")
135
+ expect(json["issued"]).to eq("date-parts" => [[2017, 2, 24]])
136
+ end
137
+ end
138
+ end
@@ -0,0 +1,36 @@
1
+ require 'spec_helper'
2
+
3
+ describe Bolognese::Metadata, vcr: true do
4
+ context "write metadata as codemeta" do
5
+ it "SoftwareSourceCode DataCite JSON" do
6
+ input = fixture_path + "datacite_software.json"
7
+ subject = Bolognese::Metadata.new(input: input, from: "datacite_json")
8
+ expect(subject.valid?).to be true
9
+ json = JSON.parse(subject.codemeta)
10
+ expect(json["@context"]).to eq("https://raw.githubusercontent.com/codemeta/codemeta/master/codemeta.jsonld")
11
+ expect(json["@id"]).to eq("https://doi.org/10.5063/f1m61h5x")
12
+ expect(json["@type"]).to eq("SoftwareSourceCode")
13
+ expect(json["identifier"]).to eq("https://doi.org/10.5063/f1m61h5x")
14
+ expect(json["agents"]).to eq("type"=>"Person", "name"=>"Matthew B. Jones", "givenName"=>"Matthew B.", "familyName"=>"Jones")
15
+ expect(json["title"]).to eq("dataone: R interface to the DataONE network of data repositories")
16
+ expect(json["datePublished"]).to eq("2016")
17
+ expect(json["publisher"]).to eq("KNB Data Repository")
18
+ end
19
+
20
+ it "SoftwareSourceCode DataCite" do
21
+ input = "https://doi.org/10.5063/f1m61h5x"
22
+ subject = Bolognese::Metadata.new(input: input, from: "datacite")
23
+ expect(subject.valid?).to be true
24
+ json = JSON.parse(subject.codemeta)
25
+ expect(json["@context"]).to eq("https://raw.githubusercontent.com/codemeta/codemeta/master/codemeta.jsonld")
26
+ expect(json["@id"]).to eq("https://doi.org/10.5063/f1m61h5x")
27
+ expect(json["@type"]).to eq("SoftwareSourceCode")
28
+ expect(json["identifier"]).to eq("https://doi.org/10.5063/f1m61h5x")
29
+ expect(json["agents"].length).to eq(9)
30
+ expect(json["agents"].first).to eq("type"=>"Person", "name"=>"Matthew B. Jones", "givenName"=>"Matthew B.", "familyName"=>"Jones")
31
+ expect(json["title"]).to eq("dataone: R interface to the DataONE network of data repositories")
32
+ expect(json["datePublished"]).to eq("2016")
33
+ expect(json["publisher"]).to eq("KNB Data Repository")
34
+ end
35
+ end
36
+ end
@@ -0,0 +1,81 @@
1
+ require 'spec_helper'
2
+
3
+ describe Bolognese::Metadata, vcr: true do
4
+ context "write metadata as crosscite" do
5
+ it "with data citation" do
6
+ input = "10.7554/eLife.01567"
7
+ subject = Bolognese::Metadata.new(input: input, from: "crossref")
8
+ crosscite = JSON.parse(subject.crosscite)
9
+ expect(crosscite.fetch("resource_type_general")).to eq("Text")
10
+ expect(crosscite.fetch("title")).to eq("Automated quantitative histology reveals vascular morphodynamics during Arabidopsis hypocotyl secondary growth")
11
+ expect(crosscite.fetch("references").length).to eq(25)
12
+ expect(crosscite.fetch("references").first).to eq("id"=>"https://doi.org/10.1038/nature02100", "type"=>"CreativeWork")
13
+ expect(crosscite.fetch("license")).to eq("id"=>"http://creativecommons.org/licenses/by/3.0")
14
+ end
15
+
16
+ it "with ORCID ID" do
17
+ input = "https://doi.org/10.1155/2012/291294"
18
+ subject = Bolognese::Metadata.new(input: input, from: "crossref")
19
+ crosscite = JSON.parse(subject.crosscite)
20
+ expect(crosscite.fetch("resource_type_general")).to eq("Text")
21
+ expect(crosscite.fetch("author").count).to eq(7)
22
+ expect(crosscite.fetch("author")[2]).to eq("type"=>"Person", "id"=>"http://orcid.org/0000-0003-2043-4925", "name"=>"Beatriz Hernandez", "givenName"=>"Beatriz", "familyName"=>"Hernandez")
23
+ end
24
+
25
+ # it "with editor" do
26
+ # input = "https://doi.org/10.1371/journal.pone.0000030"
27
+ # subject = Bolognese::Metadata.new(input: input, from: "crossref")
28
+ # crosscite = JSON.parse(subject.crosscite)
29
+ # expect(crosscite["editor"]).to eq("contributorType"=>"Editor", "contributorName"=>"Janbon, Guilhem", "givenName"=>"Guilhem", "familyName"=>"Janbon")
30
+ # end
31
+
32
+ it "Crossref DOI" do
33
+ input = fixture_path + "crossref.bib"
34
+ subject = Bolognese::Metadata.new(input: input, from: "bibtex")
35
+ crosscite = JSON.parse(subject.crosscite)
36
+ expect(crosscite.fetch("resource_type_general")).to eq("Text")
37
+ expect(crosscite.fetch("title")).to eq("Automated quantitative histology reveals vascular morphodynamics during Arabidopsis hypocotyl secondary growth")
38
+ expect(crosscite.dig("description", "text")).to start_with("Among various advantages, their small size makes model organisms preferred subjects of investigation.")
39
+ expect(crosscite.fetch("author").count).to eq(5)
40
+ expect(crosscite.fetch("author").first).to eq("type"=>"Person", "name"=>"Martial Sankar", "givenName"=>"Martial", "familyName"=>"Sankar")
41
+ end
42
+
43
+ it "BlogPosting Citeproc JSON" do
44
+ input = fixture_path + "citeproc.json"
45
+ subject = Bolognese::Metadata.new(input: input, from: "citeproc")
46
+ crosscite = JSON.parse(subject.crosscite)
47
+ expect(crosscite["resource_type_general"]).to eq("Text")
48
+ expect(crosscite.fetch("title")).to eq("Eating your own Dog Food")
49
+ expect(crosscite.dig("description", "text")).to start_with("Eating your own dog food")
50
+ expect(crosscite.fetch("author")).to eq("type"=>"Person", "name"=>"Martin Fenner", "givenName"=>"Martin", "familyName"=>"Fenner")
51
+ end
52
+
53
+ it "rdataone" do
54
+ input = fixture_path + 'codemeta.json'
55
+ subject = Bolognese::Metadata.new(input: input, from: "codemeta")
56
+ crosscite = JSON.parse(subject.crosscite)
57
+ expect(crosscite["title"]).to eq("R Interface to the DataONE REST API")
58
+ expect(crosscite["author"].length).to eq(3)
59
+ expect(crosscite["author"].last).to eq("type"=>"Organization", "name"=>"University Of California, Santa Barbara")
60
+ expect(crosscite["version"]).to eq("2.0.0")
61
+ end
62
+
63
+ it "maremma" do
64
+ input = "https://github.com/datacite/maremma"
65
+ subject = Bolognese::Metadata.new(input: input, from: "codemeta")
66
+ crosscite = JSON.parse(subject.crosscite)
67
+ expect(crosscite.fetch("title")).to eq("Maremma: a Ruby library for simplified network calls")
68
+ expect(crosscite.fetch("author")).to eq("type"=>"Person", "id"=>"http://orcid.org/0000-0003-0077-4738", "name"=>"Martin Fenner", "givenName"=>"Martin", "familyName"=>"Fenner")
69
+ end
70
+
71
+ it "with data citation schema.org" do
72
+ input = "https://blog.datacite.org/eating-your-own-dog-food/"
73
+ subject = Bolognese::Metadata.new(input: input, from: "schema_org")
74
+ expect(subject.valid?).to be true
75
+ crosscite = JSON.parse(subject.crosscite)
76
+ expect(crosscite.fetch("title")).to eq("Eating your own Dog Food")
77
+ expect(crosscite.fetch("references").count).to eq(2)
78
+ expect(crosscite.fetch("references").first).to eq("id"=>"https://doi.org/10.5438/0012", "type"=>"CreativeWork")
79
+ end
80
+ end
81
+ end
@@ -0,0 +1,19 @@
1
+ require 'spec_helper'
2
+
3
+ describe Bolognese::Metadata, vcr: true do
4
+ context "write metadata as crossref" do
5
+ it "journal article" do
6
+ input = fixture_path + 'crossref.xml'
7
+ subject = Bolognese::Metadata.new(input: input)
8
+ crossref = Maremma.from_xml(subject.crossref).dig("doi_records", "doi_record")
9
+ expect(crossref.dig("crossref", "journal", "journal_metadata", "full_title")).to eq("PLoS ONE")
10
+ expect(crossref.dig("crossref", "journal", "journal_article", "doi_data", "doi")).to eq("10.1371/journal.pone.0000030")
11
+ end
12
+
13
+ it "from DataCite" do
14
+ input = "https://doi.org/10.5061/DRYAD.8515"
15
+ subject = Bolognese::Metadata.new(input: input, from: "datacite")
16
+ expect(subject.crossref).to be nil
17
+ end
18
+ end
19
+ end
@@ -0,0 +1,74 @@
1
+ require 'spec_helper'
2
+
3
+ describe Bolognese::Metadata, vcr: true do
4
+ context "write metadata as datacite json" do
5
+ it "with data citation" do
6
+ input = "10.7554/eLife.01567"
7
+ subject = Bolognese::Metadata.new(input: input, from: "crossref")
8
+ datacite = JSON.parse(subject.datacite_json)
9
+ expect(datacite.fetch("resource_type_general")).to eq("Text")
10
+ expect(datacite.fetch("title")).to eq("Automated quantitative histology reveals vascular morphodynamics during Arabidopsis hypocotyl secondary growth")
11
+ expect(datacite.fetch("references").length).to eq(25)
12
+ expect(datacite.fetch("references").first).to eq("id"=>"https://doi.org/10.1038/nature02100", "type"=>"CreativeWork")
13
+ expect(datacite.fetch("rights")).to eq("id"=>"http://creativecommons.org/licenses/by/3.0")
14
+ end
15
+
16
+ it "with ORCID ID" do
17
+ input = "https://doi.org/10.1155/2012/291294"
18
+ subject = Bolognese::Metadata.new(input: input, from: "crossref")
19
+ datacite = JSON.parse(subject.datacite_json)
20
+ expect(datacite.fetch("resource_type_general")).to eq("Text")
21
+ expect(datacite.fetch("creator").length).to eq(7)
22
+ expect(datacite.fetch("creator").first).to eq("type"=>"Person", "name"=>"Wendy Thanassi", "givenName"=>"Wendy", "familyName"=>"Thanassi")
23
+ end
24
+
25
+ it "Crossref DOI" do
26
+ input = fixture_path + "crossref.bib"
27
+ subject = Bolognese::Metadata.new(input: input, from: "bibtex")
28
+ datacite = JSON.parse(subject.datacite_json)
29
+ expect(datacite.fetch("resource_type_general")).to eq("Text")
30
+ expect(datacite.fetch("title")).to eq("Automated quantitative histology reveals vascular morphodynamics during Arabidopsis hypocotyl secondary growth")
31
+ expect(datacite.dig("description", "text")).to start_with("Among various advantages, their small size makes model organisms preferred subjects of investigation.")
32
+ expect(datacite.fetch("creator").length).to eq(5)
33
+ expect(datacite.fetch("creator").first).to eq("type"=>"Person", "name"=>"Martial Sankar", "givenName"=>"Martial", "familyName"=>"Sankar")
34
+ end
35
+
36
+ it "BlogPosting Citeproc JSON" do
37
+ input = fixture_path + "citeproc.json"
38
+ subject = Bolognese::Metadata.new(input: input, from: "citeproc")
39
+ datacite = JSON.parse(subject.datacite_json)
40
+ expect(datacite.fetch("resource_type_general")).to eq("Text")
41
+ expect(datacite.fetch("title")).to eq("Eating your own Dog Food")
42
+ expect(datacite.dig("description", "text")).to start_with("Eating your own dog food")
43
+ expect(datacite.fetch("creator")).to eq("type"=>"Person", "name"=>"Martin Fenner", "givenName"=>"Martin", "familyName"=>"Fenner")
44
+ end
45
+
46
+ it "rdataone" do
47
+ input = fixture_path + 'codemeta.json'
48
+ subject = Bolognese::Metadata.new(input: input, from: "codemeta")
49
+ datacite = JSON.parse(subject.datacite_json)
50
+ expect(datacite.fetch("title")).to eq("R Interface to the DataONE REST API")
51
+ expect(datacite.fetch("creator").length).to eq(3)
52
+ expect(datacite.fetch("creator").first).to eq("type"=>"Person", "id"=>"http://orcid.org/0000-0003-0077-4738", "name"=>"Matt Jones", "givenName"=>"Matt", "familyName"=>"Jones")
53
+ expect(datacite.fetch("version")).to eq("2.0.0")
54
+ end
55
+
56
+ it "maremma" do
57
+ input = "https://github.com/datacite/maremma"
58
+ subject = Bolognese::Metadata.new(input: input, from: "codemeta")
59
+ datacite = JSON.parse(subject.datacite_json)
60
+ expect(datacite.fetch("title")).to eq("Maremma: a Ruby library for simplified network calls")
61
+ expect(datacite.fetch("creator")).to eq("type"=>"Person", "id"=>"http://orcid.org/0000-0003-0077-4738", "name"=>"Martin Fenner", "givenName"=>"Martin", "familyName"=>"Fenner")
62
+ end
63
+
64
+ it "with data citation schema.org" do
65
+ input = "https://blog.datacite.org/eating-your-own-dog-food/"
66
+ subject = Bolognese::Metadata.new(input: input, from: "schema_org")
67
+ expect(subject.valid?).to be true
68
+ datacite = JSON.parse(subject.datacite_json)
69
+ expect(datacite.fetch("title")).to eq("Eating your own Dog Food")
70
+ expect(datacite.fetch("references").count).to eq(2)
71
+ expect(datacite.fetch("references").first).to eq("id"=>"https://doi.org/10.5438/0012", "type"=>"CreativeWork")
72
+ end
73
+ end
74
+ end
@@ -0,0 +1,124 @@
1
+ require 'spec_helper'
2
+
3
+ describe Bolognese::Metadata, vcr: true do
4
+ context "write metadata as datacite xml" do
5
+ it "with data citation" do
6
+ input = "10.7554/eLife.01567"
7
+ subject = Bolognese::Metadata.new(input: input, from: "crossref")
8
+ datacite = Maremma.from_xml(subject.datacite).fetch("resource", {})
9
+ expect(datacite.dig("resourceType", "resourceTypeGeneral")).to eq("Text")
10
+ expect(datacite.dig("titles", "title")).to eq("Automated quantitative histology reveals vascular morphodynamics during Arabidopsis hypocotyl secondary growth")
11
+ expect(datacite.dig("relatedIdentifiers", "relatedIdentifier").length).to eq(26)
12
+ expect(datacite.dig("relatedIdentifiers", "relatedIdentifier")[1]).to eq("relatedIdentifierType"=>"DOI", "relationType"=>"References", "__content__"=>"https://doi.org/10.1038/nature02100")
13
+ expect(datacite.dig("rightsList")).to eq("rights"=>{"rightsURI"=>"http://creativecommons.org/licenses/by/3.0"})
14
+ expect(datacite.dig("fundingReferences", "fundingReference").count).to eq(4)
15
+ expect(datacite.dig("fundingReferences", "fundingReference").last).to eq("funderName"=>"University of Lausanne", "funderIdentifier"=>{"funderIdentifierType"=>"Crossref Funder ID", "__content__"=>"https://doi.org/10.13039/501100006390"})
16
+ end
17
+
18
+ it "with ORCID ID" do
19
+ input = "https://doi.org/10.1155/2012/291294"
20
+ subject = Bolognese::Metadata.new(input: input, from: "crossref")
21
+ datacite = Maremma.from_xml(subject.datacite).fetch("resource", {})
22
+ expect(datacite.dig("resourceType", "resourceTypeGeneral")).to eq("Text")
23
+ expect(datacite.dig("creators", "creator").count).to eq(7)
24
+ expect(datacite.dig("creators", "creator")[2]).to eq("creatorName" => "Hernandez, Beatriz",
25
+ "familyName" => "Hernandez",
26
+ "givenName" => "Beatriz",
27
+ "nameIdentifier" => {"schemeURI"=>"http://orcid.org/", "nameIdentifierScheme"=>"ORCID", "__content__"=>"http://orcid.org/0000-0003-2043-4925"})
28
+ end
29
+
30
+ it "with editor" do
31
+ input = "https://doi.org/10.1371/journal.pone.0000030"
32
+ subject = Bolognese::Metadata.new(input: input, from: "crossref")
33
+ datacite = Maremma.from_xml(subject.datacite).fetch("resource", {})
34
+ expect(datacite.dig("contributors", "contributor")).to eq("contributorType"=>"Editor", "contributorName"=>"Janbon, Guilhem", "givenName"=>"Guilhem", "familyName"=>"Janbon")
35
+ end
36
+
37
+ it "Crossref DOI" do
38
+ input = fixture_path + "crossref.bib"
39
+ subject = Bolognese::Metadata.new(input: input, from: "bibtex")
40
+ datacite = Maremma.from_xml(subject.datacite).fetch("resource", {})
41
+ expect(datacite.dig("resourceType", "resourceTypeGeneral")).to eq("Text")
42
+ expect(datacite.dig("titles", "title")).to eq("Automated quantitative histology reveals vascular morphodynamics during Arabidopsis hypocotyl secondary growth")
43
+ expect(datacite.dig("descriptions", "description", "__content__")).to start_with("Among various advantages, their small size makes model organisms preferred subjects of investigation.")
44
+ expect(datacite.dig("creators", "creator").count).to eq(5)
45
+ expect(datacite.dig("creators", "creator").first).to eq("creatorName"=>"Sankar, Martial", "givenName"=>"Martial", "familyName"=>"Sankar")
46
+ end
47
+
48
+ it "BlogPosting Citeproc JSON" do
49
+ input = fixture_path + "citeproc.json"
50
+ subject = Bolognese::Metadata.new(input: input, from: "citeproc")
51
+ datacite = Maremma.from_xml(subject.datacite).fetch("resource", {})
52
+ expect(datacite.dig("resourceType", "resourceTypeGeneral")).to eq("Text")
53
+ expect(datacite.dig("titles", "title")).to eq("Eating your own Dog Food")
54
+ expect(datacite.dig("descriptions", "description", "__content__")).to start_with("Eating your own dog food")
55
+ expect(datacite.dig("creators", "creator")).to eq("creatorName"=>"Fenner, Martin", "givenName"=>"Martin", "familyName"=>"Fenner")
56
+ end
57
+
58
+ it "rdataone" do
59
+ input = fixture_path + 'codemeta.json'
60
+ subject = Bolognese::Metadata.new(input: input, from: "codemeta")
61
+ datacite = Maremma.from_xml(subject.datacite).fetch("resource", {})
62
+ expect(datacite.dig("titles", "title")).to eq("R Interface to the DataONE REST API")
63
+ expect(datacite.dig("creators", "creator")).to eq([{"creatorName"=>"Jones, Matt",
64
+ "givenName"=>"Matt",
65
+ "familyName"=>"Jones",
66
+ "nameIdentifier"=>
67
+ {"schemeURI"=>"http://orcid.org/",
68
+ "nameIdentifierScheme"=>"ORCID",
69
+ "__content__"=>"http://orcid.org/0000-0003-0077-4738"}},
70
+ {"creatorName"=>"Slaughter, Peter",
71
+ "givenName"=>"Peter",
72
+ "familyName"=>"Slaughter",
73
+ "nameIdentifier"=>
74
+ {"schemeURI"=>"http://orcid.org/",
75
+ "nameIdentifierScheme"=>"ORCID",
76
+ "__content__"=>"http://orcid.org/0000-0002-2192-403X"}},
77
+ {"creatorName"=>"University Of California, Santa Barbara"}])
78
+ expect(datacite.fetch("version")).to eq("2.0.0")
79
+ end
80
+
81
+ it "maremma" do
82
+ input = "https://github.com/datacite/maremma"
83
+ subject = Bolognese::Metadata.new(input: input, from: "codemeta")
84
+ datacite = Maremma.from_xml(subject.datacite).fetch("resource", {})
85
+ expect(datacite.dig("titles", "title")).to eq("Maremma: a Ruby library for simplified network calls")
86
+ expect(datacite.dig("creators", "creator")).to eq("creatorName"=>"Fenner, Martin", "givenName"=>"Martin", "familyName"=>"Fenner", "nameIdentifier"=>{"schemeURI"=>"http://orcid.org/", "nameIdentifierScheme"=>"ORCID", "__content__"=>"http://orcid.org/0000-0003-0077-4738"})
87
+ end
88
+
89
+ it "Dataset in schema 4.0" do
90
+ input = "https://doi.org/10.5061/DRYAD.8515"
91
+ subject = Bolognese::Metadata.new(input: input, from: "datacite", regenerate: true)
92
+ expect(subject.valid?).to be true
93
+ expect(subject.id).to eq("https://doi.org/10.5061/dryad.8515")
94
+ expect(subject.type).to eq("Dataset")
95
+ expect(subject.additional_type).to eq("DataPackage")
96
+ expect(subject.resource_type_general).to eq("Dataset")
97
+ expect(subject.author.length).to eq(8)
98
+ expect(subject.author.first).to eq("type"=>"Person", "name"=>"Benjamin Ollomo", "givenName"=>"Benjamin", "familyName"=>"Ollomo")
99
+ expect(subject.title).to eq("Data from: A new malaria agent in African hominids.")
100
+ expect(subject.alternate_name).to eq("type"=>"citation", "name"=>"Ollomo B, Durand P, Prugnolle F, Douzery EJP, Arnathau C, Nkoghe D, Leroy E, Renaud F (2009) A new malaria agent in African hominids. PLoS Pathogens 5(5): e1000446.")
101
+ expect(subject.license).to eq("id"=>"http://creativecommons.org/publicdomain/zero/1.0")
102
+ expect(subject.date_published).to eq("2011")
103
+ expect(subject.has_part).to eq([{"id"=>"https://doi.org/10.5061/dryad.8515/1"},
104
+ {"id"=>"https://doi.org/10.5061/dryad.8515/2"}])
105
+ expect(subject.is_referenced_by).to eq("id"=>"https://doi.org/10.1371/journal.ppat.1000446")
106
+ expect(subject.publisher).to eq("Dryad Digital Repository")
107
+ expect(subject.provider).to eq("DataCite")
108
+ expect(subject.schema_version).to eq("http://datacite.org/schema/kernel-3")
109
+
110
+ datacite = Maremma.from_xml(subject.datacite).fetch("resource", {})
111
+ expect(datacite.fetch("xsi:schemaLocation", "").split(" ").first).to eq("http://datacite.org/schema/kernel-4")
112
+ end
113
+
114
+ it "with data citation schema.org" do
115
+ input = "https://blog.datacite.org/eating-your-own-dog-food/"
116
+ subject = Bolognese::Metadata.new(input: input, from: "schema_org")
117
+ expect(subject.valid?).to be true
118
+ datacite = Maremma.from_xml(subject.datacite).fetch("resource", {})
119
+ expect(datacite.dig("titles", "title")).to eq("Eating your own Dog Food")
120
+ expect(datacite.dig("relatedIdentifiers", "relatedIdentifier").count).to eq(3)
121
+ expect(datacite.dig("relatedIdentifiers", "relatedIdentifier").first).to eq("relatedIdentifierType"=>"DOI", "relationType"=>"IsPartOf", "__content__"=>"https://doi.org/10.5438/0000-00ss")
122
+ end
123
+ end
124
+ end