datacite-mapping 0.1.17.2 → 0.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (205) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGES.md +33 -0
  3. data/README.md +93 -150
  4. data/datacite-mapping.gemspec +1 -1
  5. data/lib/datacite/mapping.rb +12 -27
  6. data/lib/datacite/mapping/alternate_identifier.rb +2 -0
  7. data/lib/datacite/mapping/contributor.rb +6 -2
  8. data/lib/datacite/mapping/creator.rb +33 -3
  9. data/lib/datacite/mapping/date.rb +28 -76
  10. data/lib/datacite/mapping/date_value.rb +116 -0
  11. data/lib/datacite/mapping/description.rb +9 -8
  12. data/lib/datacite/mapping/funding_reference.rb +20 -5
  13. data/lib/datacite/mapping/geo_location.rb +25 -4
  14. data/lib/datacite/mapping/geo_location_box.rb +10 -8
  15. data/lib/datacite/mapping/geo_location_node.rb +68 -0
  16. data/lib/datacite/mapping/geo_location_point.rb +8 -8
  17. data/lib/datacite/mapping/geo_location_polygon.rb +76 -0
  18. data/lib/datacite/mapping/identifier.rb +23 -11
  19. data/lib/datacite/mapping/module_info.rb +3 -3
  20. data/lib/datacite/mapping/name_identifier.rb +1 -0
  21. data/lib/datacite/mapping/namespace_extensions.rb +12 -0
  22. data/lib/datacite/mapping/read_only_nodes.rb +65 -0
  23. data/lib/datacite/mapping/related_identifier.rb +28 -0
  24. data/lib/datacite/mapping/resource.rb +88 -43
  25. data/lib/datacite/mapping/rights.rb +2 -0
  26. data/lib/datacite/mapping/subject.rb +10 -9
  27. data/lib/datacite/mapping/title.rb +7 -11
  28. data/spec/data/{dash1-datacite-xml → dash1}/dataone-ark+=c5146=r3059p-mrt-datacite.xml +0 -0
  29. data/spec/data/{dash1-datacite-xml → dash1}/dataone-ark+=c5146=r31017-mrt-datacite.xml +0 -0
  30. data/spec/data/{dash1-datacite-xml → dash1}/dataone-ark+=c5146=r3201j-mrt-datacite.xml +0 -0
  31. data/spec/data/{dash1-datacite-xml → dash1}/dataone-ark+=c5146=r33w26-mrt-datacite.xml +0 -0
  32. data/spec/data/{dash1-datacite-xml → dash1}/dataone-ark+=c5146=r34s3v-mrt-datacite.xml +0 -0
  33. data/spec/data/{dash1-datacite-xml → dash1}/dataone-ark+=c5146=r36p4t-mrt-datacite.xml +0 -0
  34. data/spec/data/{dash1-datacite-xml → dash1}/dataone-ark+=c5146=r39g6f-mrt-datacite.xml +0 -0
  35. data/spec/data/{dash1-datacite-xml → dash1}/dataone-ark+=c5146=r3cc7d-mrt-datacite.xml +0 -0
  36. data/spec/data/{dash1-datacite-xml → dash1}/dataone-ark+=c5146=r3d59d-mrt-datacite.xml +0 -0
  37. data/spec/data/{dash1-datacite-xml → dash1}/dataone-ark+=c5146=r3f59q-mrt-datacite.xml +0 -0
  38. data/spec/data/{dash1-datacite-xml → dash1}/dataone-ark+=c5146=r3g591-mrt-datacite.xml +0 -0
  39. data/spec/data/{dash1-datacite-xml → dash1}/dataone-ark+=c5146=r3k016-mrt-datacite.xml +0 -0
  40. data/spec/data/{dash1-datacite-xml → dash1}/dataone-ark+=c5146=r3kw2j-mrt-datacite.xml +0 -0
  41. data/spec/data/{dash1-datacite-xml → dash1}/dataone-ark+=c5146=r3mw2v-mrt-datacite.xml +0 -0
  42. data/spec/data/{dash1-datacite-xml → dash1}/dataone-ark+=c5146=r3np4v-mrt-datacite.xml +0 -0
  43. data/spec/data/{dash1-datacite-xml → dash1}/dataone-ark+=c5146=r3pp45-mrt-datacite.xml +0 -0
  44. data/spec/data/{dash1-datacite-xml → dash1}/dataone-ark+=c5146=r3rp4s-mrt-datacite.xml +0 -0
  45. data/spec/data/{dash1-datacite-xml → dash1}/dataone-ark+=c5146=r3tg63-mrt-datacite.xml +0 -0
  46. data/spec/data/{dash1-datacite-xml → dash1}/ucb-ark+=b6078=d1159q-mrt-datacite.xml +0 -0
  47. data/spec/data/{dash1-datacite-xml → dash1}/ucb-ark+=b6078=d17g6j-mrt-datacite.xml +0 -0
  48. data/spec/data/{dash1-datacite-xml → dash1}/ucb-ark+=b6078=d1c88g-mrt-datacite.xml +0 -0
  49. data/spec/data/{dash1-datacite-xml → dash1}/ucb-ark+=b6078=d1cc74-mrt-datacite.xml +0 -0
  50. data/spec/data/{dash1-datacite-xml → dash1}/ucb-ark+=b6078=d1h019-mrt-datacite.xml +0 -0
  51. data/spec/data/{dash1-datacite-xml → dash1}/ucb-ark+=b6078=d1ms3x-mrt-datacite.xml +0 -0
  52. data/spec/data/{dash1-datacite-xml → dash1}/ucb-ark+=b6078=d1mw2k-mrt-datacite.xml +0 -0
  53. data/spec/data/{dash1-datacite-xml → dash1}/ucb-ark+=b6078=d1rg66-mrt-datacite.xml +0 -0
  54. data/spec/data/{dash1-datacite-xml → dash1}/ucb-ark+=b6078=d1rp4h-mrt-datacite.xml +0 -0
  55. data/spec/data/{dash1-datacite-xml → dash1}/ucb-ark+=b6078=d1wc7s-mrt-datacite.xml +0 -0
  56. data/spec/data/{dash1-datacite-xml → dash1}/uci-ark+=b7280=d1001p-mrt-datacite.xml +0 -0
  57. data/spec/data/{dash1-datacite-xml → dash1}/uci-ark+=b7280=d1059f-mrt-datacite.xml +0 -0
  58. data/spec/data/{dash1-datacite-xml → dash1}/uci-ark+=b7280=d11010-mrt-datacite.xml +0 -0
  59. data/spec/data/{dash1-datacite-xml → dash1}/uci-ark+=b7280=d1159r-mrt-datacite.xml +0 -0
  60. data/spec/data/{dash1-datacite-xml → dash1}/uci-ark+=b7280=d12019-mrt-datacite.xml +0 -0
  61. data/spec/data/{dash1-datacite-xml → dash1}/uci-ark+=b7280=d12s30-mrt-datacite.xml +0 -0
  62. data/spec/data/{dash1-datacite-xml → dash1}/uci-ark+=b7280=d1301m-mrt-datacite.xml +0 -0
  63. data/spec/data/{dash1-datacite-xml → dash1}/uci-ark+=b7280=d13s39-mrt-datacite.xml +0 -0
  64. data/spec/data/{dash1-datacite-xml → dash1}/uci-ark+=b7280=d13w2z-mrt-datacite.xml +0 -0
  65. data/spec/data/{dash1-datacite-xml → dash1}/uci-ark+=b7280=d14s3m-mrt-datacite.xml +0 -0
  66. data/spec/data/{dash1-datacite-xml → dash1}/uci-ark+=b7280=d15k5m-mrt-datacite.xml +0 -0
  67. data/spec/data/{dash1-datacite-xml → dash1}/uci-ark+=b7280=d15p48-mrt-datacite.xml +0 -0
  68. data/spec/data/{dash1-datacite-xml → dash1}/uci-ark+=b7280=d16k5x-mrt-datacite.xml +0 -0
  69. data/spec/data/{dash1-datacite-xml → dash1}/uci-ark+=b7280=d16p4k-mrt-datacite.xml +0 -0
  70. data/spec/data/{dash1-datacite-xml → dash1}/uci-ark+=b7280=d17g6k-mrt-datacite.xml +0 -0
  71. data/spec/data/{dash1-datacite-xml → dash1}/uci-ark+=b7280=d17p4w-mrt-datacite.xml +0 -0
  72. data/spec/data/{dash1-datacite-xml → dash1}/uci-ark+=b7280=d18g6w-mrt-datacite.xml +0 -0
  73. data/spec/data/{dash1-datacite-xml → dash1}/uci-ark+=b7280=d1988w-mrt-datacite.xml +0 -0
  74. data/spec/data/{dash1-datacite-xml → dash1}/uci-ark+=b7280=d19g66-mrt-datacite.xml +0 -0
  75. data/spec/data/{dash1-datacite-xml → dash1}/uci-ark+=b7280=d1b886-mrt-datacite.xml +0 -0
  76. data/spec/data/{dash1-datacite-xml → dash1}/uci-ark+=b7280=d1bc7v-mrt-datacite.xml +0 -0
  77. data/spec/data/{dash1-datacite-xml → dash1}/uci-ark+=b7280=d1c88h-mrt-datacite.xml +0 -0
  78. data/spec/data/{dash1-datacite-xml → dash1}/uci-ark+=b7280=d1cc75-mrt-datacite.xml +0 -0
  79. data/spec/data/{dash1-datacite-xml → dash1}/uci-ark+=b7280=d1d595-mrt-datacite.xml +0 -0
  80. data/spec/data/{dash1-datacite-xml → dash1}/uci-ark+=b7280=d1f30c-mrt-datacite.xml +0 -0
  81. data/spec/data/{dash1-datacite-xml → dash1}/uci-ark+=b7280=d1f59g-mrt-datacite.xml +0 -0
  82. data/spec/data/{dash1-datacite-xml → dash1}/uci-ark+=b7280=d1g011-mrt-datacite.xml +0 -0
  83. data/spec/data/{dash1-datacite-xml → dash1}/uci-ark+=b7280=d1g59s-mrt-datacite.xml +0 -0
  84. data/spec/data/{dash1-datacite-xml → dash1}/uci-ark+=b7280=d1h01b-mrt-datacite.xml +0 -0
  85. data/spec/data/{dash1-datacite-xml → dash1}/uci-ark+=b7280=d1h593-mrt-datacite.xml +0 -0
  86. data/spec/data/{dash1-datacite-xml → dash1}/uci-ark+=b7280=d1j01n-mrt-datacite.xml +0 -0
  87. data/spec/data/{dash1-datacite-xml → dash1}/uci-ark+=b7280=d1js3b-mrt-datacite.xml +0 -0
  88. data/spec/data/{dash1-datacite-xml → dash1}/uci-ark+=b7280=d1k01z-mrt-datacite.xml +0 -0
  89. data/spec/data/{dash1-datacite-xml → dash1}/uci-ark+=b7280=d1ks3n-mrt-datacite.xml +0 -0
  90. data/spec/data/{dash1-datacite-xml → dash1}/uci-ark+=b7280=d1kw29-mrt-datacite.xml +0 -0
  91. data/spec/data/{dash1-datacite-xml → dash1}/uci-ark+=b7280=d1ms3z-mrt-datacite.xml +0 -0
  92. data/spec/data/{dash1-datacite-xml → dash1}/uci-ark+=b7280=d1mw2m-mrt-datacite.xml +0 -0
  93. data/spec/data/{dash1-datacite-xml → dash1}/uci-ark+=b7280=d1np4m-mrt-datacite.xml +0 -0
  94. data/spec/data/{dash1-datacite-xml → dash1}/uci-ark+=b7280=d1pk58-mrt-datacite.xml +0 -0
  95. data/spec/data/{dash1-datacite-xml → dash1}/uci-ark+=b7280=d1pp4x-mrt-datacite.xml +0 -0
  96. data/spec/data/{dash1-datacite-xml → dash1}/uci-ark+=b7280=d1qg6x-mrt-datacite.xml +0 -0
  97. data/spec/data/{dash1-datacite-xml → dash1}/uci-ark+=b7280=d1qp47-mrt-datacite.xml +0 -0
  98. data/spec/data/{dash1-datacite-xml → dash1}/uci-ark+=b7280=d1rg67-mrt-datacite.xml +0 -0
  99. data/spec/data/{dash1-datacite-xml → dash1}/uci-ark+=b7280=d1rp4j-mrt-datacite.xml +0 -0
  100. data/spec/data/{dash1-datacite-xml → dash1}/uci-ark+=b7280=d1sg6j-mrt-datacite.xml +0 -0
  101. data/spec/data/{dash1-datacite-xml → dash1}/uci-ark+=b7280=d1t88j-mrt-datacite.xml +0 -0
  102. data/spec/data/{dash1-datacite-xml → dash1}/uci-ark+=b7280=d1tg6v-mrt-datacite.xml +0 -0
  103. data/spec/data/{dash1-datacite-xml → dash1}/uci-ark+=b7280=d1v88v-mrt-datacite.xml +0 -0
  104. data/spec/data/{dash1-datacite-xml → dash1}/uci-ark+=b7280=d1vc7h-mrt-datacite.xml +0 -0
  105. data/spec/data/{dash1-datacite-xml → dash1}/uci-ark+=b7280=d1w885-mrt-datacite.xml +0 -0
  106. data/spec/data/{dash1-datacite-xml → dash1}/uci-ark+=b7280=d1wc7t-mrt-datacite.xml +0 -0
  107. data/spec/data/{dash1-datacite-xml → dash1}/uci-ark+=b7280=d1x59t-mrt-datacite.xml +0 -0
  108. data/spec/data/{dash1-datacite-xml → dash1}/uci-ark+=b7280=d1z594-mrt-datacite.xml +0 -0
  109. data/spec/data/{dash1-datacite-xml → dash1}/ucla-ark+=b5060=d2qr4v2t-mrt-datacite.xml +0 -0
  110. data/spec/data/{dash1-datacite-xml → dash1}/ucla-ark+=b5068=d1cc7x-mrt-datacite.xml +0 -0
  111. data/spec/data/{dash1-datacite-xml → dash1}/ucla-ark+=b5068=d1h59v-mrt-datacite.xml +0 -0
  112. data/spec/data/{dash1-datacite-xml → dash1}/ucla-ark+=b5068=d1rp49-mrt-datacite.xml +0 -0
  113. data/spec/data/{dash1-datacite-xml → dash1}/ucla-ark+=b5068=d1wc7k-mrt-datacite.xml +0 -0
  114. data/spec/data/{dash1-datacite-xml → dash1}/ucm-ark+=13030=m51g217t-mrt-datacite.xml +0 -0
  115. data/spec/data/{dash1-datacite-xml → dash1}/ucm-ark+=b6071=z7wc73-mrt-datacite.xml +0 -0
  116. data/spec/data/{dash1-datacite-xml → dash1}/ucop-ark+=b5060=d8301x-mrt-datacite.xml +0 -0
  117. data/spec/data/{dash1-datacite-xml → dash1}/ucop-ark+=b5060=d86p4w-mrt-datacite.xml +0 -0
  118. data/spec/data/{dash1-datacite-xml → dash1}/ucop-ark+=b5060=d8bc75-mrt-datacite.xml +0 -0
  119. data/spec/data/{dash1-datacite-xml → dash1}/ucop-ark+=b5060=d8g593-mrt-datacite.xml +0 -0
  120. data/spec/data/{dash1-datacite-xml → dash1}/ucop-ark+=b5060=d8h59d-mrt-datacite.xml +0 -0
  121. data/spec/data/{dash1-datacite-xml → dash1}/ucop-ark+=b5060=d8kw2m-mrt-datacite.xml +0 -0
  122. data/spec/data/{dash1-datacite-xml → dash1}/ucop-ark+=b5060=d8rp4v-mrt-datacite.xml +0 -0
  123. data/spec/data/{dash1-datacite-xml → dash1}/ucop-ark+=b5060=d8z59f-mrt-datacite.xml +0 -0
  124. data/spec/data/{dash1-datacite-xml → dash1}/ucsc-ark+=b7291=d11592-mrt-datacite.xml +0 -0
  125. data/spec/data/{dash1-datacite-xml → dash1}/ucsc-ark+=b7291=d17p46-mrt-datacite.xml +0 -0
  126. data/spec/data/{dash1-datacite-xml → dash1}/ucsc-ark+=b7291=d1h59d-mrt-datacite.xml +0 -0
  127. data/spec/data/{dash1-datacite-xml → dash1}/ucsc-ark+=b7291=d1mw2x-mrt-datacite.xml +0 -0
  128. data/spec/data/{dash1-datacite-xml → dash1}/ucsc-ark+=b7291=d1wc74-mrt-datacite.xml +0 -0
  129. data/spec/data/{dash1-datacite-xml → dash1}/ucsf-ark+=b7272=q6057cv6-mrt-datacite.xml +0 -0
  130. data/spec/data/{dash1-datacite-xml → dash1}/ucsf-ark+=b7272=q6154f00-mrt-datacite.xml +0 -0
  131. data/spec/data/{dash1-datacite-xml → dash1}/ucsf-ark+=b7272=q61z429d-mrt-datacite.xml +0 -0
  132. data/spec/data/{dash1-datacite-xml → dash1}/ucsf-ark+=b7272=q62z13fs-mrt-datacite.xml +0 -0
  133. data/spec/data/{dash1-datacite-xml → dash1}/ucsf-ark+=b7272=q65q4t1r-mrt-datacite.xml +0 -0
  134. data/spec/data/{dash1-datacite-xml → dash1}/ucsf-ark+=b7272=q66q1v54-mrt-datacite.xml +0 -0
  135. data/spec/data/{dash1-datacite-xml → dash1}/ucsf-ark+=b7272=q67p8w9z-mrt-datacite.xml +0 -0
  136. data/spec/data/{dash1-datacite-xml → dash1}/ucsf-ark+=b7272=q68g8hmp-mrt-datacite.xml +0 -0
  137. data/spec/data/{dash1-datacite-xml → dash1}/ucsf-ark+=b7272=q6bg2kwf-mrt-datacite.xml +0 -0
  138. data/spec/data/{dash1-datacite-xml → dash1}/ucsf-ark+=b7272=q6c8276k-mrt-datacite.xml +0 -0
  139. data/spec/data/{dash1-datacite-xml → dash1}/ucsf-ark+=b7272=q6cc0xmh-mrt-datacite.xml +0 -0
  140. data/spec/data/{dash1-datacite-xml → dash1}/ucsf-ark+=b7272=q6d798bd-mrt-datacite.xml +0 -0
  141. data/spec/data/{dash1-datacite-xml → dash1}/ucsf-ark+=b7272=q6h12zxh-mrt-datacite.xml +0 -0
  142. data/spec/data/{dash1-datacite-xml → dash1}/ucsf-ark+=b7272=q6h41pb7-mrt-datacite.xml +0 -0
  143. data/spec/data/{dash1-datacite-xml → dash1}/ucsf-ark+=b7272=q6kw5cxv-mrt-datacite.xml +0 -0
  144. data/spec/data/{dash1-datacite-xml → dash1}/ucsf-ark+=b7272=q6ms3qnx-mrt-datacite.xml +0 -0
  145. data/spec/data/{dash1-datacite-xml → dash1}/ucsf-ark+=b7272=q6mw2f2n-mrt-datacite.xml +0 -0
  146. data/spec/data/{dash1-datacite-xml → dash1}/ucsf-ark+=b7272=q6pn93h6-mrt-datacite.xml +0 -0
  147. data/spec/data/{dash1-datacite-xml → dash1}/ucsf-ark+=b7272=q6qn64nk-mrt-datacite.xml +0 -0
  148. data/spec/data/{dash1-datacite-xml → dash1}/ucsf-ark+=b7272=q6rf5rzx-mrt-datacite.xml +0 -0
  149. data/spec/data/{dash1-datacite-xml → dash1}/ucsf-ark+=b7272=q6rn35sz-mrt-datacite.xml +0 -0
  150. data/spec/data/{dash1-datacite-xml → dash1}/ucsf-ark+=b7272=q6sf2t3q-mrt-datacite.xml +0 -0
  151. data/spec/data/{dash1-datacite-xml → dash1}/ucsf-ark+=b7272=q6td9v7j-mrt-datacite.xml +0 -0
  152. data/spec/data/{dash1-datacite-xml → dash1}/ucsf-ark+=b7272=q6w66hpn-mrt-datacite.xml +0 -0
  153. data/spec/data/{dash1-datacite-xml → dash1}/ucsf-ark+=b7272=q6x63jt1-mrt-datacite.xml +0 -0
  154. data/spec/data/{dash1-datacite-xml → dash1}/ucsf-ark+=b7272=q6z60kzd-mrt-datacite.xml +0 -0
  155. data/spec/data/datacite-4-synthetic.xml +110 -0
  156. data/spec/data/datacite3/datacite-example-Box_dateCollected_DataCollector-v3.0.xml +46 -0
  157. data/spec/data/datacite3/datacite-example-GeoLocation-v3.0.xml +50 -0
  158. data/spec/data/datacite3/datacite-example-HasMetadata-v3.0.xml +52 -0
  159. data/spec/data/datacite3/datacite-example-ResearchGroup_Methods-v3.0.xml +36 -0
  160. data/spec/data/datacite3/datacite-example-ResourceTypeGeneral_Collection-v3.0.xml +38 -0
  161. data/spec/data/datacite3/datacite-example-complicated-v3.0.xml +48 -0
  162. data/spec/data/datacite3/datacite-example-dataset-v3.0.xml +35 -0
  163. data/spec/data/datacite3/datacite-example-full-v3.1.xml +61 -0
  164. data/spec/data/datacite3/datacite-example-relationTypeIsIdenticalTo-v3.0.xml +48 -0
  165. data/spec/data/datacite3/datacite-example-video-v3.0.xml +26 -0
  166. data/spec/data/datacite3/datacite-example-workflow-v3.0.xml +43 -0
  167. data/spec/data/{metadata.xsd → datacite3/metadata.xsd} +0 -0
  168. data/spec/data/datacite4/datacite-example-Box_dateCollected_DataCollector-v4.0.xml +52 -0
  169. data/spec/data/datacite4/datacite-example-GeoLocation-v4.0.xml +66 -0
  170. data/spec/data/datacite4/datacite-example-HasMetadata-v4.0.xml +62 -0
  171. data/spec/data/datacite4/datacite-example-ResearchGroup_Methods-v4.0.xml +44 -0
  172. data/spec/data/datacite4/datacite-example-ResourceTypeGeneral_Collection-v4.0.xml +52 -0
  173. data/spec/data/datacite4/datacite-example-complicated-v4.0.xml +54 -0
  174. data/spec/data/datacite4/datacite-example-dataset-v4.0.xml +39 -0
  175. data/spec/data/{resource.xml → datacite4/datacite-example-full-v4.0.xml} +14 -4
  176. data/spec/data/{kernel-4.0 → datacite4}/datacite-example-fundingReference-v.4.0.xml +0 -0
  177. data/spec/data/datacite4/datacite-example-relationTypeIsIdenticalTo-v4.0.xml +65 -0
  178. data/spec/data/datacite4/datacite-example-video-v4.0.xml +31 -0
  179. data/spec/data/datacite4/datacite-example-workflow-v4.0.xml +55 -0
  180. data/spec/data/{kernel-4.0 → datacite4}/metadata.xsd +0 -0
  181. data/spec/rspec_custom_matchers.rb +5 -1
  182. data/spec/spec_helper.rb +1 -1
  183. data/spec/unit/datacite/mapping/contributor_spec.rb +7 -0
  184. data/spec/unit/datacite/mapping/creator_spec.rb +92 -0
  185. data/spec/unit/datacite/mapping/date_spec.rb +25 -214
  186. data/spec/unit/datacite/mapping/date_value_spec.rb +143 -0
  187. data/spec/unit/datacite/mapping/description_spec.rb +4 -3
  188. data/spec/unit/datacite/mapping/funding_reference_spec.rb +5 -5
  189. data/spec/unit/datacite/mapping/geo_location_box_spec.rb +0 -36
  190. data/spec/unit/datacite/mapping/geo_location_point_spec.rb +0 -25
  191. data/spec/unit/datacite/mapping/geo_location_polygon_spec.rb +47 -0
  192. data/spec/unit/datacite/mapping/geo_location_spec.rb +153 -6
  193. data/spec/unit/datacite/mapping/identifier_spec.rb +9 -0
  194. data/spec/unit/datacite/mapping/related_identifier_spec.rb +23 -0
  195. data/spec/unit/datacite/mapping/resource_spec.rb +994 -874
  196. data/spec/unit/datacite/mapping/subject_spec.rb +12 -6
  197. data/spec/unit/datacite/mapping/title_spec.rb +20 -6
  198. metadata +320 -278
  199. data/lib/datacite/mapping/nonvalidating.rb +0 -10
  200. data/lib/datacite/mapping/nonvalidating/identifier.rb +0 -40
  201. data/lib/datacite/mapping/nonvalidating/subject.rb +0 -43
  202. data/spec/data/mrt-datacite.xml +0 -61
  203. data/spec/unit/datacite/mapping/log_spec.rb +0 -23
  204. data/spec/unit/datacite/mapping/nonvalidating/identifier_spec.rb +0 -52
  205. data/spec/unit/datacite/mapping/resource_type_spec.rb +0 -68
@@ -0,0 +1,143 @@
1
+ require 'spec_helper'
2
+
3
+ module Datacite
4
+ module Mapping
5
+ describe DateValue do
6
+
7
+ before(:all) do
8
+ @values = {
9
+ with_date_time: DateTime.new(1914, 8, 4, 11, 1, 6.0123, '+1'),
10
+ with_date: ::Date.new(1914, 8, 4),
11
+ with_year: 1914,
12
+ with_year_str: '1914',
13
+ with_year_month: '1914-08',
14
+ iso8601: '1914-08-04T11:01+01:00',
15
+ iso8601_secs: '1914-08-04T11:01:06+01:00',
16
+ iso8601_frac: '1914-08-04T11:01:06.0123+01:00'
17
+ }
18
+ @dates = @values.map { |format, v| [format, DateValue.new(v)] }.to_h
19
+ end
20
+
21
+ describe '#initialize' do
22
+ it 'accepts a DateTime' do
23
+ d = @dates[:with_date_time]
24
+ expect(d).to be_a(DateValue)
25
+ expect(d.year).to eq(1914)
26
+ expect(d.month).to eq(8)
27
+ expect(d.day).to eq(4)
28
+ expect(d.date).to eq(::Date.new(1914, 8, 4))
29
+ expect(d.hour).to eq(11)
30
+ expect(d.minute).to eq(1)
31
+ expect(d.sec).to eq(6)
32
+ expect(d.nsec).to eq(12_300_000)
33
+ end
34
+
35
+ it 'accepts a DateValue' do
36
+ d = @dates[:with_date]
37
+ expect(d).to be_a(DateValue)
38
+ expect(d.year).to eq(1914)
39
+ expect(d.month).to eq(8)
40
+ expect(d.day).to eq(4)
41
+ expect(d.date).to eq(::Date.new(1914, 8, 4))
42
+ end
43
+
44
+ it 'accepts a year as an integer' do
45
+ d = @dates[:with_year]
46
+ expect(d).to be_a(DateValue)
47
+ expect(d.year).to eq(1914)
48
+ end
49
+
50
+ it 'accepts a year as a string' do
51
+ d = @dates[:with_year_str]
52
+ expect(d).to be_a(DateValue)
53
+ expect(d.year).to eq(1914)
54
+ end
55
+
56
+ it 'accepts a year-month string' do
57
+ d = @dates[:with_year_month]
58
+ expect(d).to be_a(DateValue)
59
+ expect(d.year).to eq(1914)
60
+ expect(d.month).to eq(8)
61
+ end
62
+
63
+ it 'accepts an ISO 8601 DateValue string with hours and minutes' do
64
+ d = @dates[:iso8601]
65
+ expect(d).to be_a(DateValue)
66
+ expect(d.year).to eq(1914)
67
+ expect(d.month).to eq(8)
68
+ expect(d.day).to eq(4)
69
+ expect(d.date).to eq(::Date.new(1914, 8, 4))
70
+ expect(d.hour).to eq(11)
71
+ expect(d.minute).to eq(1)
72
+ end
73
+
74
+ it 'accepts an ISO 8601 DateValue string with hours, minutes, and seconds' do
75
+ d = @dates[:iso8601_secs]
76
+ expect(d).to be_a(DateValue)
77
+ expect(d.year).to eq(1914)
78
+ expect(d.month).to eq(8)
79
+ expect(d.day).to eq(4)
80
+ expect(d.date).to eq(::Date.new(1914, 8, 4))
81
+ expect(d.hour).to eq(11)
82
+ expect(d.minute).to eq(1)
83
+ expect(d.sec).to eq(6)
84
+ end
85
+
86
+ it 'accepts an ISO 8601 DateValue string with hours, minutes, seconds, and fractional seconds' do
87
+ d = @dates[:iso8601_frac]
88
+ expect(d).to be_a(DateValue)
89
+ expect(d.year).to eq(1914)
90
+ expect(d.month).to eq(8)
91
+ expect(d.day).to eq(4)
92
+ expect(d.date).to eq(::Date.new(1914, 8, 4))
93
+ expect(d.hour).to eq(11)
94
+ expect(d.minute).to eq(1)
95
+ expect(d.sec).to eq(6)
96
+ expect(d.nsec).to eq(12_300_000)
97
+ end
98
+
99
+ it 'rejects invalid dates' do
100
+ expect { DateValue.new(value: 'elvis') }.to raise_error(ArgumentError)
101
+ end
102
+
103
+ it 'rejects nil' do
104
+ expect { DateValue.new(value: nil) }.to raise_error(ArgumentError)
105
+ end
106
+ end
107
+
108
+ describe '#<=>' do
109
+ it 'reports equal values as equal' do
110
+ d1 = DateValue.new(DateTime.new(1914, 8, 4, 11, 0o1, 6.0123, '+1'))
111
+ d2 = DateValue.new(DateTime.new(1914, 8, 4, 11, 0o1, 6.0123, '+1'))
112
+ expect(d1).to eq(d2)
113
+ expect(d1.hash).to eq(d2.hash)
114
+ end
115
+
116
+ it 'reports equal values initialized differently as equal' do
117
+ d1 = DateValue.new('1914-08-04T11:01:06.0123+01:00')
118
+ d2 = DateValue.new(DateTime.new(1914, 8, 4, 11, 0o1, 6.0123, '+1'))
119
+ expect(d1).to eq(d2)
120
+ expect(d1.hash).to eq(d2.hash)
121
+ end
122
+
123
+ it 'reports unequal values as unequal' do
124
+ d1 = DateValue.new('1914-08-04T11:01+01:00')
125
+ d2 = DateValue.new(DateTime.new(1914, 8, 4, 11, 0o1, 6.0123, '+1'))
126
+ expect(d1).not_to eq(d2)
127
+ expect(d1.hash).not_to eq(d2.hash)
128
+ end
129
+ end
130
+
131
+ describe '#to_s' do
132
+ it 'includes all relevant fields' do
133
+ val = '1914-08-04T11:01:06.0123+01:00'
134
+ str = DateValue.new(val).to_s
135
+ val.split(/[-T:+.]/).each do |v|
136
+ v = 12_300_000.to_s if v == '0123' # special case nanos
137
+ expect(str).to include(v)
138
+ end
139
+ end
140
+ end
141
+ end
142
+ end
143
+ end
@@ -3,6 +3,7 @@ require 'spec_helper'
3
3
  module Datacite
4
4
  module Mapping
5
5
  describe Description do
6
+
6
7
  describe '#load_from_xml' do
7
8
  it 'reads XML' do
8
9
  xml_text = '<description xml:lang="en-us" descriptionType="Abstract">
@@ -16,7 +17,7 @@ module Datacite
16
17
 
17
18
  expect(desc.language).to eq(expected_lang)
18
19
  expect(desc.type).to eq(expected_type)
19
- expect(desc.value.strip).to eq(expected_value)
20
+ expect(desc.value).to eq(expected_value)
20
21
  end
21
22
 
22
23
  it 'handles escaped HTML' do
@@ -55,12 +56,12 @@ module Datacite
55
56
  end
56
57
  it 'escapes HTML' do
57
58
  desc = Description.new(type: DescriptionType::ABSTRACT, value: '<p>This is HTML text</p>')
58
- expected_xml = '<description xml:lang="en" descriptionType="Abstract">&lt;p&gt;This is HTML text&lt;/p&gt;</description>'
59
+ expected_xml = '<description descriptionType="Abstract">&lt;p&gt;This is HTML text&lt;/p&gt;</description>'
59
60
  expect(desc.save_to_xml).to be_xml(expected_xml)
60
61
  end
61
62
  it 'preserves <br/> and <br></br> tags' do
62
63
  desc = Description.new(type: DescriptionType::ABSTRACT, value: '<br/> &lt;br/&gt; abstract <br></br> full <br /> of <br> </br>s')
63
- expected_xml = '<description xml:lang="en" descriptionType="Abstract"><br/> &amp;lt;br/&amp;gt; abstract <br/> full <br/> of <br/>s</description>'
64
+ expected_xml = '<description descriptionType="Abstract"><br/> &amp;lt;br/&amp;gt; abstract <br/> full <br/> of <br/>s</description>'
64
65
  expect(desc.save_to_xml).to be_xml(expected_xml)
65
66
  end
66
67
  end
@@ -42,11 +42,11 @@ module Datacite
42
42
 
43
43
  before(:all) do
44
44
  @fref_xml = '<fundingReference>
45
- <funderName>European Commission</funderName>
46
- <funderIdentifier funderIdentifierType="Crossref Funder ID">http://doi.org/10.13039/501100000780</funderIdentifier>
47
- <awardNumber awardURI="http://cordis.europa.eu/project/rcn/100180_en.html">282625</awardNumber>
48
- <awardTitle>MOTivational strength of ecosystem services and alternative ways to express the value of BIOdiversity</awardTitle>
49
- </fundingReference>'.freeze
45
+ <funderName>European Commission</funderName>
46
+ <funderIdentifier funderIdentifierType="Crossref Funder ID">http://doi.org/10.13039/501100000780</funderIdentifier>
47
+ <awardNumber awardURI="http://cordis.europa.eu/project/rcn/100180_en.html">282625</awardNumber>
48
+ <awardTitle>MOTivational strength of ecosystem services and alternative ways to express the value of BIOdiversity</awardTitle>
49
+ </fundingReference>'.freeze
50
50
 
51
51
  @fref = FundingReference.parse_xml(fref_xml)
52
52
  end
@@ -201,41 +201,5 @@ module Datacite
201
201
  end
202
202
  end
203
203
  end
204
-
205
- describe GeoLocationBoxNode do
206
-
207
- class SomeElement
208
- include XML::Mapping
209
- end
210
-
211
- describe '#to_value' do
212
- it 'parses the value' do
213
- xml_text = '-33.45 -122.33 47.61 -70.67'
214
- node = GeoLocationBoxNode.new(SomeElement, :box, 'box')
215
- expected_box = GeoLocationBox.new(-33.45, -122.33, 47.61, -70.67)
216
- expect(node.to_value(xml_text)).to eq(expected_box)
217
- end
218
- it 'deals with flipped east/west coordinates' do
219
- xml_text = '-33.45 -70.67 47.61 -122.33'
220
- node = GeoLocationBoxNode.new(SomeElement, :box, 'box')
221
- expected_box = GeoLocationBox.new(-33.45, -122.33, 47.61, -70.67)
222
- expect(node.to_value(xml_text)).to eq(expected_box)
223
- end
224
- it 'deals with flipped north/south coordinates' do
225
- xml_text = '47.61 -122.33 -33.45 -70.67'
226
- node = GeoLocationBoxNode.new(SomeElement, :box, 'box')
227
- expected_box = GeoLocationBox.new(-33.45, -122.33, 47.61, -70.67)
228
- expect(node.to_value(xml_text)).to eq(expected_box)
229
- end
230
- it 'deals with weird whitespace' do
231
- node = GeoLocationBoxNode.new(SomeElement, :box, 'box')
232
- xml_text = %(
233
- -33.45 -122.33\t47.61 -70.67
234
- )
235
- expected = GeoLocationBox.new(-33.45, -122.33, 47.61, -70.67)
236
- expect(node.to_value(xml_text)).to eq(expected)
237
- end
238
- end
239
- end
240
204
  end
241
205
  end
@@ -119,30 +119,5 @@ module Datacite
119
119
  end
120
120
  end
121
121
  end
122
-
123
- describe GeoLocationPointNode do
124
-
125
- class SomeElement
126
- include XML::Mapping
127
- end
128
-
129
- describe '#to_value' do
130
- it 'parses the value' do
131
- node = GeoLocationPointNode.new(SomeElement, :point, 'point')
132
- xml_text = '-33.45 -122.33'
133
- expected = GeoLocationPoint.new(-33.45, -122.33)
134
- expect(node.to_value(xml_text)).to eq(expected)
135
- end
136
- it 'deals with weird whitespace' do
137
- node = GeoLocationPointNode.new(SomeElement, :point, 'point')
138
- xml_text = %(
139
- -33.45\t-122.33
140
- )
141
- expected = GeoLocationPoint.new(-33.45, -122.33)
142
- expect(node.to_value(xml_text)).to eq(expected)
143
- end
144
- end
145
- end
146
-
147
122
  end
148
123
  end
@@ -0,0 +1,47 @@
1
+ require 'spec_helper'
2
+
3
+ module Datacite
4
+ module Mapping
5
+ describe GeoLocationPolygon do
6
+ describe '#==' do
7
+ it 'reports equal values as equal' do
8
+ polygon1 = GeoLocationPolygon.new(points: [
9
+ GeoLocationPoint.new(-33.45, -122.33),
10
+ GeoLocationPoint.new(33.45, -122.33),
11
+ GeoLocationPoint.new(33.45, 122.33),
12
+ GeoLocationPoint.new(-33.45, -122.33)
13
+ ])
14
+ polygon2 = GeoLocationPolygon.new(points: [
15
+ GeoLocationPoint.new(-33.45, -122.33),
16
+ GeoLocationPoint.new(33.45, -122.33),
17
+ GeoLocationPoint.new(33.45, 122.33),
18
+ GeoLocationPoint.new(-33.45, -122.33)
19
+ ])
20
+ expect(polygon1).to eq(polygon2)
21
+ expect(polygon1.hash).to eq(polygon2.hash)
22
+ expect(polygon2).to eq(polygon1)
23
+ expect(polygon2.hash).to eq(polygon1.hash)
24
+ end
25
+
26
+ it 'reports unequal values as unequal' do
27
+ polygon1 = GeoLocationPolygon.new(points: [
28
+ GeoLocationPoint.new(-33.45, -122.33),
29
+ GeoLocationPoint.new(33.45, -122.33),
30
+ GeoLocationPoint.new(33.45, 122.33),
31
+ GeoLocationPoint.new(-33.45, -122.33)
32
+ ])
33
+ polygon2 = GeoLocationPolygon.new(points: [
34
+ GeoLocationPoint.new(33.45, 122.33),
35
+ GeoLocationPoint.new(-33.45, 122.33),
36
+ GeoLocationPoint.new(-33.45, -122.33),
37
+ GeoLocationPoint.new(33.45, 122.33)
38
+ ])
39
+ expect(polygon1).not_to eq(polygon2)
40
+ expect(polygon1.hash).not_to eq(polygon2.hash)
41
+ expect(polygon2).not_to eq(polygon1)
42
+ expect(polygon2.hash).not_to eq(polygon1.hash)
43
+ end
44
+ end
45
+ end
46
+ end
47
+ end
@@ -4,6 +4,29 @@ module Datacite
4
4
  module Mapping
5
5
 
6
6
  describe GeoLocation do
7
+
8
+ attr_reader :warnings
9
+
10
+ def warnings_including(substring)
11
+ warnings.select { |w| w.include?(substring) }
12
+ end
13
+
14
+ def expect_warning(substring, count, include_matches = false)
15
+ matches = warnings_including(substring)
16
+ found_count = matches.size
17
+ msg = "expected #{count} warnings including '#{substring}', found #{found_count}"
18
+ msg << ": #{matches}" if include_matches
19
+ expect(found_count).to eq(count), msg
20
+ end
21
+
22
+ before(:each) do
23
+ @warnings = []
24
+ allow(ReadOnlyNodes).to receive(:warn) do |w|
25
+ warnings << w
26
+ Kernel.warn(w) # for debugging
27
+ end
28
+ end
29
+
7
30
  describe '#initialize' do
8
31
  it 'accepts a point' do
9
32
  point = GeoLocationPoint.new(47.61, -122.33)
@@ -20,6 +43,16 @@ module Datacite
20
43
  loc = GeoLocation.new(place: place)
21
44
  expect(loc.place).to eq(place)
22
45
  end
46
+ it 'accepts a polygon' do
47
+ polygon = GeoLocationPolygon.new(points: [
48
+ GeoLocationPoint.new(47.61, -122.33),
49
+ GeoLocationPoint.new(-33.45, -122.33),
50
+ GeoLocationPoint.new(47.61, -70.67),
51
+ GeoLocationPoint.new(47.61, -122.33)
52
+ ])
53
+ loc = GeoLocation.new(polygon: polygon)
54
+ expect(loc.polygon).to eq(polygon)
55
+ end
23
56
  it 'allows an empty location' do
24
57
  loc = GeoLocation.new
25
58
  expect(loc.point).to be_nil
@@ -70,17 +103,77 @@ module Datacite
70
103
  end
71
104
  end
72
105
 
106
+ describe '#polygon=' do
107
+ it 'sets the polygon' do
108
+ polygon = GeoLocationPolygon.new(points: [
109
+ GeoLocationPoint.new(47.61, -122.33),
110
+ GeoLocationPoint.new(-33.45, -122.33),
111
+ GeoLocationPoint.new(47.61, -70.67),
112
+ GeoLocationPoint.new(47.61, -122.33)
113
+ ])
114
+ loc = GeoLocation.new
115
+ loc.polygon = polygon
116
+ expect(loc.polygon).to eq(polygon)
117
+ end
118
+ end
119
+
73
120
  describe '#load_from_xml' do
74
- it 'parses XML' do
121
+ it 'parses DC3' do
75
122
  xml_text = '<geoLocation>
123
+ <geoLocationPlace>Atlantic Ocean</geoLocationPlace>
76
124
  <geoLocationPoint>31.233 -67.302</geoLocationPoint>
77
125
  <geoLocationBox>41.090 -71.032 42.893 -68.211</geoLocationBox>
126
+ </geoLocation>'
127
+ loc = GeoLocation.parse_xml(xml_text)
128
+ expect(loc.point).to eq(GeoLocationPoint.new(31.233, -67.302))
129
+ expect(loc.box).to eq(GeoLocationBox.new(41.09, -71.032, 42.893, -68.211))
130
+ expect(loc.place).to eq('Atlantic Ocean')
131
+ end
132
+
133
+ it 'parses DC4' do
134
+ xml_text = '<geoLocation>
78
135
  <geoLocationPlace>Atlantic Ocean</geoLocationPlace>
136
+ <geoLocationPoint>
137
+ <pointLatitude>31.233</pointLatitude>
138
+ <pointLongitude>-67.302</pointLongitude>
139
+ </geoLocationPoint>
140
+ <geoLocationBox>
141
+ <southBoundLatitude>41.090</southBoundLatitude>
142
+ <westBoundLongitude>-71.032</westBoundLongitude>
143
+ <northBoundLatitude>42.893</northBoundLatitude>
144
+ <eastBoundLongitude>-68.211</eastBoundLongitude>
145
+ </geoLocationBox>
146
+ <geoLocationPolygon>
147
+ <polygonPoint>
148
+ <pointLongitude>-67.302</pointLongitude>
149
+ <pointLatitude>31.233</pointLatitude>
150
+ </polygonPoint>
151
+ <polygonPoint>
152
+ <pointLongitude>-71.032</pointLongitude>
153
+ <pointLatitude>-68.211</pointLatitude>
154
+ </polygonPoint>
155
+ <polygonPoint>
156
+ <pointLongitude>41.09</pointLongitude>
157
+ <pointLatitude>42.893</pointLatitude>
158
+ </polygonPoint>
159
+ <polygonPoint>
160
+ <pointLongitude>-67.302</pointLongitude>
161
+ <pointLatitude>31.233</pointLatitude>
162
+ </polygonPoint>
163
+ </geoLocationPolygon>
79
164
  </geoLocation>'
80
165
  loc = GeoLocation.parse_xml(xml_text)
81
166
  expect(loc.point).to eq(GeoLocationPoint.new(31.233, -67.302))
82
167
  expect(loc.box).to eq(GeoLocationBox.new(41.09, -71.032, 42.893, -68.211))
83
168
  expect(loc.place).to eq('Atlantic Ocean')
169
+ actual_polygon = loc.polygon
170
+ expected_polygon = GeoLocationPolygon.new(points: [
171
+ GeoLocationPoint.new(31.233, -67.302),
172
+ GeoLocationPoint.new(-68.211, -71.032),
173
+ GeoLocationPoint.new(42.893, 41.09),
174
+ GeoLocationPoint.new(31.233, -67.302)
175
+ ])
176
+ expect(actual_polygon).to eq(expected_polygon)
84
177
  end
85
178
 
86
179
  it 'trims place-name whitespace' do
@@ -95,18 +188,72 @@ module Datacite
95
188
  end
96
189
 
97
190
  describe '#save_to_xml' do
98
- it 'writes XML' do
99
- loc = GeoLocation.new(
191
+
192
+ attr_reader :loc
193
+
194
+ before(:each) do
195
+ @loc = GeoLocation.new(
100
196
  point: GeoLocationPoint.new(31.233, -67.302),
101
197
  box: GeoLocationBox.new(41.09, -71.032, 42.893, -68.211),
102
- place: 'Atlantic Ocean'
198
+ place: 'Atlantic Ocean',
199
+ polygon: (GeoLocationPolygon.new(points: [
200
+ GeoLocationPoint.new(-67.302, 31.233),
201
+ GeoLocationPoint.new(-71.032, -68.211),
202
+ GeoLocationPoint.new(41.09, 42.893),
203
+ GeoLocationPoint.new(-67.302, 31.233)
204
+ ]))
103
205
  )
104
- expected_xml = '<geoLocation>
206
+ end
207
+
208
+ describe 'DC4 mode' do
209
+ it 'writes DC4' do
210
+ expected_xml = '<geoLocation>
211
+ <geoLocationPlace>Atlantic Ocean</geoLocationPlace>
212
+ <geoLocationPoint>
213
+ <pointLatitude>31.233</pointLatitude>
214
+ <pointLongitude>-67.302</pointLongitude>
215
+ </geoLocationPoint>
216
+ <geoLocationBox>
217
+ <westBoundLongitude>-71.032</westBoundLongitude>
218
+ <eastBoundLongitude>-68.211</eastBoundLongitude>
219
+ <southBoundLatitude>41.09</southBoundLatitude>
220
+ <northBoundLatitude>42.893</northBoundLatitude>
221
+ </geoLocationBox>
222
+ <geoLocationPolygon>
223
+ <polygonPoint>
224
+ <pointLongitude>31.233</pointLongitude>
225
+ <pointLatitude>-67.302</pointLatitude>
226
+ </polygonPoint>
227
+ <polygonPoint>
228
+ <pointLongitude>-68.211</pointLongitude>
229
+ <pointLatitude>-71.032</pointLatitude>
230
+ </polygonPoint>
231
+ <polygonPoint>
232
+ <pointLongitude>42.893</pointLongitude>
233
+ <pointLatitude>41.09</pointLatitude>
234
+ </polygonPoint>
235
+ <polygonPoint>
236
+ <pointLongitude>31.233</pointLongitude>
237
+ <pointLatitude>-67.302</pointLatitude>
238
+ </polygonPoint>
239
+ </geoLocationPolygon>
240
+ </geoLocation>'
241
+ actual_xml = loc.save_to_xml
242
+ expect(actual_xml).to be_xml(expected_xml)
243
+ end
244
+ end
245
+
246
+ describe 'DC3 mapping' do
247
+ it 'writes DC3 points and boxes' do
248
+ expected_xml = '<geoLocation>
105
249
  <geoLocationPoint>31.233 -67.302</geoLocationPoint>
106
250
  <geoLocationBox>41.09 -71.032 42.893 -68.211</geoLocationBox>
107
251
  <geoLocationPlace>Atlantic Ocean</geoLocationPlace>
108
252
  </geoLocation>'
109
- expect(loc.save_to_xml).to be_xml(expected_xml)
253
+ actual_xml = loc.save_to_xml(mapping: :datacite_3)
254
+ expect(actual_xml).to be_xml(expected_xml)
255
+ expect_warning(loc.polygon.to_s, 1)
256
+ end
110
257
  end
111
258
  end
112
259
  end