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.
- checksums.yaml +4 -4
- data/CHANGES.md +33 -0
- data/README.md +93 -150
- data/datacite-mapping.gemspec +1 -1
- data/lib/datacite/mapping.rb +12 -27
- data/lib/datacite/mapping/alternate_identifier.rb +2 -0
- data/lib/datacite/mapping/contributor.rb +6 -2
- data/lib/datacite/mapping/creator.rb +33 -3
- data/lib/datacite/mapping/date.rb +28 -76
- data/lib/datacite/mapping/date_value.rb +116 -0
- data/lib/datacite/mapping/description.rb +9 -8
- data/lib/datacite/mapping/funding_reference.rb +20 -5
- data/lib/datacite/mapping/geo_location.rb +25 -4
- data/lib/datacite/mapping/geo_location_box.rb +10 -8
- data/lib/datacite/mapping/geo_location_node.rb +68 -0
- data/lib/datacite/mapping/geo_location_point.rb +8 -8
- data/lib/datacite/mapping/geo_location_polygon.rb +76 -0
- data/lib/datacite/mapping/identifier.rb +23 -11
- data/lib/datacite/mapping/module_info.rb +3 -3
- data/lib/datacite/mapping/name_identifier.rb +1 -0
- data/lib/datacite/mapping/namespace_extensions.rb +12 -0
- data/lib/datacite/mapping/read_only_nodes.rb +65 -0
- data/lib/datacite/mapping/related_identifier.rb +28 -0
- data/lib/datacite/mapping/resource.rb +88 -43
- data/lib/datacite/mapping/rights.rb +2 -0
- data/lib/datacite/mapping/subject.rb +10 -9
- data/lib/datacite/mapping/title.rb +7 -11
- data/spec/data/{dash1-datacite-xml → dash1}/dataone-ark+=c5146=r3059p-mrt-datacite.xml +0 -0
- data/spec/data/{dash1-datacite-xml → dash1}/dataone-ark+=c5146=r31017-mrt-datacite.xml +0 -0
- data/spec/data/{dash1-datacite-xml → dash1}/dataone-ark+=c5146=r3201j-mrt-datacite.xml +0 -0
- data/spec/data/{dash1-datacite-xml → dash1}/dataone-ark+=c5146=r33w26-mrt-datacite.xml +0 -0
- data/spec/data/{dash1-datacite-xml → dash1}/dataone-ark+=c5146=r34s3v-mrt-datacite.xml +0 -0
- data/spec/data/{dash1-datacite-xml → dash1}/dataone-ark+=c5146=r36p4t-mrt-datacite.xml +0 -0
- data/spec/data/{dash1-datacite-xml → dash1}/dataone-ark+=c5146=r39g6f-mrt-datacite.xml +0 -0
- data/spec/data/{dash1-datacite-xml → dash1}/dataone-ark+=c5146=r3cc7d-mrt-datacite.xml +0 -0
- data/spec/data/{dash1-datacite-xml → dash1}/dataone-ark+=c5146=r3d59d-mrt-datacite.xml +0 -0
- data/spec/data/{dash1-datacite-xml → dash1}/dataone-ark+=c5146=r3f59q-mrt-datacite.xml +0 -0
- data/spec/data/{dash1-datacite-xml → dash1}/dataone-ark+=c5146=r3g591-mrt-datacite.xml +0 -0
- data/spec/data/{dash1-datacite-xml → dash1}/dataone-ark+=c5146=r3k016-mrt-datacite.xml +0 -0
- data/spec/data/{dash1-datacite-xml → dash1}/dataone-ark+=c5146=r3kw2j-mrt-datacite.xml +0 -0
- data/spec/data/{dash1-datacite-xml → dash1}/dataone-ark+=c5146=r3mw2v-mrt-datacite.xml +0 -0
- data/spec/data/{dash1-datacite-xml → dash1}/dataone-ark+=c5146=r3np4v-mrt-datacite.xml +0 -0
- data/spec/data/{dash1-datacite-xml → dash1}/dataone-ark+=c5146=r3pp45-mrt-datacite.xml +0 -0
- data/spec/data/{dash1-datacite-xml → dash1}/dataone-ark+=c5146=r3rp4s-mrt-datacite.xml +0 -0
- data/spec/data/{dash1-datacite-xml → dash1}/dataone-ark+=c5146=r3tg63-mrt-datacite.xml +0 -0
- data/spec/data/{dash1-datacite-xml → dash1}/ucb-ark+=b6078=d1159q-mrt-datacite.xml +0 -0
- data/spec/data/{dash1-datacite-xml → dash1}/ucb-ark+=b6078=d17g6j-mrt-datacite.xml +0 -0
- data/spec/data/{dash1-datacite-xml → dash1}/ucb-ark+=b6078=d1c88g-mrt-datacite.xml +0 -0
- data/spec/data/{dash1-datacite-xml → dash1}/ucb-ark+=b6078=d1cc74-mrt-datacite.xml +0 -0
- data/spec/data/{dash1-datacite-xml → dash1}/ucb-ark+=b6078=d1h019-mrt-datacite.xml +0 -0
- data/spec/data/{dash1-datacite-xml → dash1}/ucb-ark+=b6078=d1ms3x-mrt-datacite.xml +0 -0
- data/spec/data/{dash1-datacite-xml → dash1}/ucb-ark+=b6078=d1mw2k-mrt-datacite.xml +0 -0
- data/spec/data/{dash1-datacite-xml → dash1}/ucb-ark+=b6078=d1rg66-mrt-datacite.xml +0 -0
- data/spec/data/{dash1-datacite-xml → dash1}/ucb-ark+=b6078=d1rp4h-mrt-datacite.xml +0 -0
- data/spec/data/{dash1-datacite-xml → dash1}/ucb-ark+=b6078=d1wc7s-mrt-datacite.xml +0 -0
- data/spec/data/{dash1-datacite-xml → dash1}/uci-ark+=b7280=d1001p-mrt-datacite.xml +0 -0
- data/spec/data/{dash1-datacite-xml → dash1}/uci-ark+=b7280=d1059f-mrt-datacite.xml +0 -0
- data/spec/data/{dash1-datacite-xml → dash1}/uci-ark+=b7280=d11010-mrt-datacite.xml +0 -0
- data/spec/data/{dash1-datacite-xml → dash1}/uci-ark+=b7280=d1159r-mrt-datacite.xml +0 -0
- data/spec/data/{dash1-datacite-xml → dash1}/uci-ark+=b7280=d12019-mrt-datacite.xml +0 -0
- data/spec/data/{dash1-datacite-xml → dash1}/uci-ark+=b7280=d12s30-mrt-datacite.xml +0 -0
- data/spec/data/{dash1-datacite-xml → dash1}/uci-ark+=b7280=d1301m-mrt-datacite.xml +0 -0
- data/spec/data/{dash1-datacite-xml → dash1}/uci-ark+=b7280=d13s39-mrt-datacite.xml +0 -0
- data/spec/data/{dash1-datacite-xml → dash1}/uci-ark+=b7280=d13w2z-mrt-datacite.xml +0 -0
- data/spec/data/{dash1-datacite-xml → dash1}/uci-ark+=b7280=d14s3m-mrt-datacite.xml +0 -0
- data/spec/data/{dash1-datacite-xml → dash1}/uci-ark+=b7280=d15k5m-mrt-datacite.xml +0 -0
- data/spec/data/{dash1-datacite-xml → dash1}/uci-ark+=b7280=d15p48-mrt-datacite.xml +0 -0
- data/spec/data/{dash1-datacite-xml → dash1}/uci-ark+=b7280=d16k5x-mrt-datacite.xml +0 -0
- data/spec/data/{dash1-datacite-xml → dash1}/uci-ark+=b7280=d16p4k-mrt-datacite.xml +0 -0
- data/spec/data/{dash1-datacite-xml → dash1}/uci-ark+=b7280=d17g6k-mrt-datacite.xml +0 -0
- data/spec/data/{dash1-datacite-xml → dash1}/uci-ark+=b7280=d17p4w-mrt-datacite.xml +0 -0
- data/spec/data/{dash1-datacite-xml → dash1}/uci-ark+=b7280=d18g6w-mrt-datacite.xml +0 -0
- data/spec/data/{dash1-datacite-xml → dash1}/uci-ark+=b7280=d1988w-mrt-datacite.xml +0 -0
- data/spec/data/{dash1-datacite-xml → dash1}/uci-ark+=b7280=d19g66-mrt-datacite.xml +0 -0
- data/spec/data/{dash1-datacite-xml → dash1}/uci-ark+=b7280=d1b886-mrt-datacite.xml +0 -0
- data/spec/data/{dash1-datacite-xml → dash1}/uci-ark+=b7280=d1bc7v-mrt-datacite.xml +0 -0
- data/spec/data/{dash1-datacite-xml → dash1}/uci-ark+=b7280=d1c88h-mrt-datacite.xml +0 -0
- data/spec/data/{dash1-datacite-xml → dash1}/uci-ark+=b7280=d1cc75-mrt-datacite.xml +0 -0
- data/spec/data/{dash1-datacite-xml → dash1}/uci-ark+=b7280=d1d595-mrt-datacite.xml +0 -0
- data/spec/data/{dash1-datacite-xml → dash1}/uci-ark+=b7280=d1f30c-mrt-datacite.xml +0 -0
- data/spec/data/{dash1-datacite-xml → dash1}/uci-ark+=b7280=d1f59g-mrt-datacite.xml +0 -0
- data/spec/data/{dash1-datacite-xml → dash1}/uci-ark+=b7280=d1g011-mrt-datacite.xml +0 -0
- data/spec/data/{dash1-datacite-xml → dash1}/uci-ark+=b7280=d1g59s-mrt-datacite.xml +0 -0
- data/spec/data/{dash1-datacite-xml → dash1}/uci-ark+=b7280=d1h01b-mrt-datacite.xml +0 -0
- data/spec/data/{dash1-datacite-xml → dash1}/uci-ark+=b7280=d1h593-mrt-datacite.xml +0 -0
- data/spec/data/{dash1-datacite-xml → dash1}/uci-ark+=b7280=d1j01n-mrt-datacite.xml +0 -0
- data/spec/data/{dash1-datacite-xml → dash1}/uci-ark+=b7280=d1js3b-mrt-datacite.xml +0 -0
- data/spec/data/{dash1-datacite-xml → dash1}/uci-ark+=b7280=d1k01z-mrt-datacite.xml +0 -0
- data/spec/data/{dash1-datacite-xml → dash1}/uci-ark+=b7280=d1ks3n-mrt-datacite.xml +0 -0
- data/spec/data/{dash1-datacite-xml → dash1}/uci-ark+=b7280=d1kw29-mrt-datacite.xml +0 -0
- data/spec/data/{dash1-datacite-xml → dash1}/uci-ark+=b7280=d1ms3z-mrt-datacite.xml +0 -0
- data/spec/data/{dash1-datacite-xml → dash1}/uci-ark+=b7280=d1mw2m-mrt-datacite.xml +0 -0
- data/spec/data/{dash1-datacite-xml → dash1}/uci-ark+=b7280=d1np4m-mrt-datacite.xml +0 -0
- data/spec/data/{dash1-datacite-xml → dash1}/uci-ark+=b7280=d1pk58-mrt-datacite.xml +0 -0
- data/spec/data/{dash1-datacite-xml → dash1}/uci-ark+=b7280=d1pp4x-mrt-datacite.xml +0 -0
- data/spec/data/{dash1-datacite-xml → dash1}/uci-ark+=b7280=d1qg6x-mrt-datacite.xml +0 -0
- data/spec/data/{dash1-datacite-xml → dash1}/uci-ark+=b7280=d1qp47-mrt-datacite.xml +0 -0
- data/spec/data/{dash1-datacite-xml → dash1}/uci-ark+=b7280=d1rg67-mrt-datacite.xml +0 -0
- data/spec/data/{dash1-datacite-xml → dash1}/uci-ark+=b7280=d1rp4j-mrt-datacite.xml +0 -0
- data/spec/data/{dash1-datacite-xml → dash1}/uci-ark+=b7280=d1sg6j-mrt-datacite.xml +0 -0
- data/spec/data/{dash1-datacite-xml → dash1}/uci-ark+=b7280=d1t88j-mrt-datacite.xml +0 -0
- data/spec/data/{dash1-datacite-xml → dash1}/uci-ark+=b7280=d1tg6v-mrt-datacite.xml +0 -0
- data/spec/data/{dash1-datacite-xml → dash1}/uci-ark+=b7280=d1v88v-mrt-datacite.xml +0 -0
- data/spec/data/{dash1-datacite-xml → dash1}/uci-ark+=b7280=d1vc7h-mrt-datacite.xml +0 -0
- data/spec/data/{dash1-datacite-xml → dash1}/uci-ark+=b7280=d1w885-mrt-datacite.xml +0 -0
- data/spec/data/{dash1-datacite-xml → dash1}/uci-ark+=b7280=d1wc7t-mrt-datacite.xml +0 -0
- data/spec/data/{dash1-datacite-xml → dash1}/uci-ark+=b7280=d1x59t-mrt-datacite.xml +0 -0
- data/spec/data/{dash1-datacite-xml → dash1}/uci-ark+=b7280=d1z594-mrt-datacite.xml +0 -0
- data/spec/data/{dash1-datacite-xml → dash1}/ucla-ark+=b5060=d2qr4v2t-mrt-datacite.xml +0 -0
- data/spec/data/{dash1-datacite-xml → dash1}/ucla-ark+=b5068=d1cc7x-mrt-datacite.xml +0 -0
- data/spec/data/{dash1-datacite-xml → dash1}/ucla-ark+=b5068=d1h59v-mrt-datacite.xml +0 -0
- data/spec/data/{dash1-datacite-xml → dash1}/ucla-ark+=b5068=d1rp49-mrt-datacite.xml +0 -0
- data/spec/data/{dash1-datacite-xml → dash1}/ucla-ark+=b5068=d1wc7k-mrt-datacite.xml +0 -0
- data/spec/data/{dash1-datacite-xml → dash1}/ucm-ark+=13030=m51g217t-mrt-datacite.xml +0 -0
- data/spec/data/{dash1-datacite-xml → dash1}/ucm-ark+=b6071=z7wc73-mrt-datacite.xml +0 -0
- data/spec/data/{dash1-datacite-xml → dash1}/ucop-ark+=b5060=d8301x-mrt-datacite.xml +0 -0
- data/spec/data/{dash1-datacite-xml → dash1}/ucop-ark+=b5060=d86p4w-mrt-datacite.xml +0 -0
- data/spec/data/{dash1-datacite-xml → dash1}/ucop-ark+=b5060=d8bc75-mrt-datacite.xml +0 -0
- data/spec/data/{dash1-datacite-xml → dash1}/ucop-ark+=b5060=d8g593-mrt-datacite.xml +0 -0
- data/spec/data/{dash1-datacite-xml → dash1}/ucop-ark+=b5060=d8h59d-mrt-datacite.xml +0 -0
- data/spec/data/{dash1-datacite-xml → dash1}/ucop-ark+=b5060=d8kw2m-mrt-datacite.xml +0 -0
- data/spec/data/{dash1-datacite-xml → dash1}/ucop-ark+=b5060=d8rp4v-mrt-datacite.xml +0 -0
- data/spec/data/{dash1-datacite-xml → dash1}/ucop-ark+=b5060=d8z59f-mrt-datacite.xml +0 -0
- data/spec/data/{dash1-datacite-xml → dash1}/ucsc-ark+=b7291=d11592-mrt-datacite.xml +0 -0
- data/spec/data/{dash1-datacite-xml → dash1}/ucsc-ark+=b7291=d17p46-mrt-datacite.xml +0 -0
- data/spec/data/{dash1-datacite-xml → dash1}/ucsc-ark+=b7291=d1h59d-mrt-datacite.xml +0 -0
- data/spec/data/{dash1-datacite-xml → dash1}/ucsc-ark+=b7291=d1mw2x-mrt-datacite.xml +0 -0
- data/spec/data/{dash1-datacite-xml → dash1}/ucsc-ark+=b7291=d1wc74-mrt-datacite.xml +0 -0
- data/spec/data/{dash1-datacite-xml → dash1}/ucsf-ark+=b7272=q6057cv6-mrt-datacite.xml +0 -0
- data/spec/data/{dash1-datacite-xml → dash1}/ucsf-ark+=b7272=q6154f00-mrt-datacite.xml +0 -0
- data/spec/data/{dash1-datacite-xml → dash1}/ucsf-ark+=b7272=q61z429d-mrt-datacite.xml +0 -0
- data/spec/data/{dash1-datacite-xml → dash1}/ucsf-ark+=b7272=q62z13fs-mrt-datacite.xml +0 -0
- data/spec/data/{dash1-datacite-xml → dash1}/ucsf-ark+=b7272=q65q4t1r-mrt-datacite.xml +0 -0
- data/spec/data/{dash1-datacite-xml → dash1}/ucsf-ark+=b7272=q66q1v54-mrt-datacite.xml +0 -0
- data/spec/data/{dash1-datacite-xml → dash1}/ucsf-ark+=b7272=q67p8w9z-mrt-datacite.xml +0 -0
- data/spec/data/{dash1-datacite-xml → dash1}/ucsf-ark+=b7272=q68g8hmp-mrt-datacite.xml +0 -0
- data/spec/data/{dash1-datacite-xml → dash1}/ucsf-ark+=b7272=q6bg2kwf-mrt-datacite.xml +0 -0
- data/spec/data/{dash1-datacite-xml → dash1}/ucsf-ark+=b7272=q6c8276k-mrt-datacite.xml +0 -0
- data/spec/data/{dash1-datacite-xml → dash1}/ucsf-ark+=b7272=q6cc0xmh-mrt-datacite.xml +0 -0
- data/spec/data/{dash1-datacite-xml → dash1}/ucsf-ark+=b7272=q6d798bd-mrt-datacite.xml +0 -0
- data/spec/data/{dash1-datacite-xml → dash1}/ucsf-ark+=b7272=q6h12zxh-mrt-datacite.xml +0 -0
- data/spec/data/{dash1-datacite-xml → dash1}/ucsf-ark+=b7272=q6h41pb7-mrt-datacite.xml +0 -0
- data/spec/data/{dash1-datacite-xml → dash1}/ucsf-ark+=b7272=q6kw5cxv-mrt-datacite.xml +0 -0
- data/spec/data/{dash1-datacite-xml → dash1}/ucsf-ark+=b7272=q6ms3qnx-mrt-datacite.xml +0 -0
- data/spec/data/{dash1-datacite-xml → dash1}/ucsf-ark+=b7272=q6mw2f2n-mrt-datacite.xml +0 -0
- data/spec/data/{dash1-datacite-xml → dash1}/ucsf-ark+=b7272=q6pn93h6-mrt-datacite.xml +0 -0
- data/spec/data/{dash1-datacite-xml → dash1}/ucsf-ark+=b7272=q6qn64nk-mrt-datacite.xml +0 -0
- data/spec/data/{dash1-datacite-xml → dash1}/ucsf-ark+=b7272=q6rf5rzx-mrt-datacite.xml +0 -0
- data/spec/data/{dash1-datacite-xml → dash1}/ucsf-ark+=b7272=q6rn35sz-mrt-datacite.xml +0 -0
- data/spec/data/{dash1-datacite-xml → dash1}/ucsf-ark+=b7272=q6sf2t3q-mrt-datacite.xml +0 -0
- data/spec/data/{dash1-datacite-xml → dash1}/ucsf-ark+=b7272=q6td9v7j-mrt-datacite.xml +0 -0
- data/spec/data/{dash1-datacite-xml → dash1}/ucsf-ark+=b7272=q6w66hpn-mrt-datacite.xml +0 -0
- data/spec/data/{dash1-datacite-xml → dash1}/ucsf-ark+=b7272=q6x63jt1-mrt-datacite.xml +0 -0
- data/spec/data/{dash1-datacite-xml → dash1}/ucsf-ark+=b7272=q6z60kzd-mrt-datacite.xml +0 -0
- data/spec/data/datacite-4-synthetic.xml +110 -0
- data/spec/data/datacite3/datacite-example-Box_dateCollected_DataCollector-v3.0.xml +46 -0
- data/spec/data/datacite3/datacite-example-GeoLocation-v3.0.xml +50 -0
- data/spec/data/datacite3/datacite-example-HasMetadata-v3.0.xml +52 -0
- data/spec/data/datacite3/datacite-example-ResearchGroup_Methods-v3.0.xml +36 -0
- data/spec/data/datacite3/datacite-example-ResourceTypeGeneral_Collection-v3.0.xml +38 -0
- data/spec/data/datacite3/datacite-example-complicated-v3.0.xml +48 -0
- data/spec/data/datacite3/datacite-example-dataset-v3.0.xml +35 -0
- data/spec/data/datacite3/datacite-example-full-v3.1.xml +61 -0
- data/spec/data/datacite3/datacite-example-relationTypeIsIdenticalTo-v3.0.xml +48 -0
- data/spec/data/datacite3/datacite-example-video-v3.0.xml +26 -0
- data/spec/data/datacite3/datacite-example-workflow-v3.0.xml +43 -0
- data/spec/data/{metadata.xsd → datacite3/metadata.xsd} +0 -0
- data/spec/data/datacite4/datacite-example-Box_dateCollected_DataCollector-v4.0.xml +52 -0
- data/spec/data/datacite4/datacite-example-GeoLocation-v4.0.xml +66 -0
- data/spec/data/datacite4/datacite-example-HasMetadata-v4.0.xml +62 -0
- data/spec/data/datacite4/datacite-example-ResearchGroup_Methods-v4.0.xml +44 -0
- data/spec/data/datacite4/datacite-example-ResourceTypeGeneral_Collection-v4.0.xml +52 -0
- data/spec/data/datacite4/datacite-example-complicated-v4.0.xml +54 -0
- data/spec/data/datacite4/datacite-example-dataset-v4.0.xml +39 -0
- data/spec/data/{resource.xml → datacite4/datacite-example-full-v4.0.xml} +14 -4
- data/spec/data/{kernel-4.0 → datacite4}/datacite-example-fundingReference-v.4.0.xml +0 -0
- data/spec/data/datacite4/datacite-example-relationTypeIsIdenticalTo-v4.0.xml +65 -0
- data/spec/data/datacite4/datacite-example-video-v4.0.xml +31 -0
- data/spec/data/datacite4/datacite-example-workflow-v4.0.xml +55 -0
- data/spec/data/{kernel-4.0 → datacite4}/metadata.xsd +0 -0
- data/spec/rspec_custom_matchers.rb +5 -1
- data/spec/spec_helper.rb +1 -1
- data/spec/unit/datacite/mapping/contributor_spec.rb +7 -0
- data/spec/unit/datacite/mapping/creator_spec.rb +92 -0
- data/spec/unit/datacite/mapping/date_spec.rb +25 -214
- data/spec/unit/datacite/mapping/date_value_spec.rb +143 -0
- data/spec/unit/datacite/mapping/description_spec.rb +4 -3
- data/spec/unit/datacite/mapping/funding_reference_spec.rb +5 -5
- data/spec/unit/datacite/mapping/geo_location_box_spec.rb +0 -36
- data/spec/unit/datacite/mapping/geo_location_point_spec.rb +0 -25
- data/spec/unit/datacite/mapping/geo_location_polygon_spec.rb +47 -0
- data/spec/unit/datacite/mapping/geo_location_spec.rb +153 -6
- data/spec/unit/datacite/mapping/identifier_spec.rb +9 -0
- data/spec/unit/datacite/mapping/related_identifier_spec.rb +23 -0
- data/spec/unit/datacite/mapping/resource_spec.rb +994 -874
- data/spec/unit/datacite/mapping/subject_spec.rb +12 -6
- data/spec/unit/datacite/mapping/title_spec.rb +20 -6
- metadata +320 -278
- data/lib/datacite/mapping/nonvalidating.rb +0 -10
- data/lib/datacite/mapping/nonvalidating/identifier.rb +0 -40
- data/lib/datacite/mapping/nonvalidating/subject.rb +0 -43
- data/spec/data/mrt-datacite.xml +0 -61
- data/spec/unit/datacite/mapping/log_spec.rb +0 -23
- data/spec/unit/datacite/mapping/nonvalidating/identifier_spec.rb +0 -52
- data/spec/unit/datacite/mapping/resource_type_spec.rb +0 -68
|
@@ -0,0 +1,68 @@
|
|
|
1
|
+
require 'xml/mapping_extensions'
|
|
2
|
+
|
|
3
|
+
module Datacite
|
|
4
|
+
module Mapping
|
|
5
|
+
# Abstract superclass of GeoLocation parsing nodes
|
|
6
|
+
class GeoLocationNode < XML::Mapping::SingleAttributeNode
|
|
7
|
+
|
|
8
|
+
attr_reader :geom_class
|
|
9
|
+
attr_reader :coord_elements
|
|
10
|
+
|
|
11
|
+
def initialize(*args)
|
|
12
|
+
fail 'No geometry class provided' unless @geom_class
|
|
13
|
+
fail 'No coordinate elements provided' unless @coord_elements
|
|
14
|
+
path, *args = super(*args)
|
|
15
|
+
@path = ::XML::XXPath.new(path)
|
|
16
|
+
args
|
|
17
|
+
end
|
|
18
|
+
|
|
19
|
+
def datacite_3?
|
|
20
|
+
mapping == :datacite_3
|
|
21
|
+
end
|
|
22
|
+
|
|
23
|
+
def extract_attr_value(xml)
|
|
24
|
+
return from_text(xml) || from_children(xml)
|
|
25
|
+
rescue => e
|
|
26
|
+
raise e, "#{@owner}.#{@attrname}: Can't extract #{self.class} from #{xml}: #{e.message}"
|
|
27
|
+
end
|
|
28
|
+
|
|
29
|
+
def set_attr_value(xml, value) # rubocop:disable Metrics/AbcSize
|
|
30
|
+
fail "Invalid value: expected #{geom_class} instance, was #{value || 'nil'}" unless value && value.is_a?(geom_class)
|
|
31
|
+
element = @path.first(xml, ensure_created: true)
|
|
32
|
+
|
|
33
|
+
if datacite_3?
|
|
34
|
+
element.text = value.to_s
|
|
35
|
+
else
|
|
36
|
+
coord_elements.each do |getter, element_name|
|
|
37
|
+
child = element.elements << REXML::Element.new(element_name)
|
|
38
|
+
child.text = value.send(getter)
|
|
39
|
+
end
|
|
40
|
+
end
|
|
41
|
+
end
|
|
42
|
+
|
|
43
|
+
private
|
|
44
|
+
|
|
45
|
+
# Parses Datacite 3.x text coordinates
|
|
46
|
+
def from_text(xml)
|
|
47
|
+
xml_text = default_when_xpath_err { @path.first(xml).text }
|
|
48
|
+
return unless xml_text
|
|
49
|
+
|
|
50
|
+
stripped = xml_text.strip
|
|
51
|
+
return if stripped.empty?
|
|
52
|
+
|
|
53
|
+
coords = stripped.split(/\s+/).map(&:to_f)
|
|
54
|
+
geom_class.new(*coords)
|
|
55
|
+
end
|
|
56
|
+
|
|
57
|
+
# Parses Datacite 4.x child-element coordinates
|
|
58
|
+
def from_children(xml)
|
|
59
|
+
elem = @path.first(xml)
|
|
60
|
+
coords_hash = coord_elements.map do |key, element_name|
|
|
61
|
+
value = elem.elements[element_name].text
|
|
62
|
+
[key, value && value.to_f]
|
|
63
|
+
end.to_h
|
|
64
|
+
geom_class.new(coords_hash)
|
|
65
|
+
end
|
|
66
|
+
end
|
|
67
|
+
end
|
|
68
|
+
end
|
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
require 'xml/mapping'
|
|
2
|
+
require 'datacite/mapping/geo_location_node'
|
|
2
3
|
|
|
3
4
|
module Datacite
|
|
4
5
|
module Mapping
|
|
@@ -63,7 +64,7 @@ module Datacite
|
|
|
63
64
|
return nil unless other.class == self.class
|
|
64
65
|
[:latitude, :longitude].each do |c|
|
|
65
66
|
order = send(c) <=> other.send(c)
|
|
66
|
-
return order if order
|
|
67
|
+
return order if order.nonzero?
|
|
67
68
|
end
|
|
68
69
|
0
|
|
69
70
|
end
|
|
@@ -87,13 +88,12 @@ module Datacite
|
|
|
87
88
|
end
|
|
88
89
|
|
|
89
90
|
# XML mapping node for `<geoLocationPoint/>`
|
|
90
|
-
class GeoLocationPointNode <
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
GeoLocationPoint.new(*coords)
|
|
91
|
+
class GeoLocationPointNode < GeoLocationNode
|
|
92
|
+
def initialize(*args)
|
|
93
|
+
@geom_class = GeoLocationPoint
|
|
94
|
+
@coord_elements = { latitude: 'pointLatitude',
|
|
95
|
+
longitude: 'pointLongitude' }.freeze
|
|
96
|
+
super
|
|
97
97
|
end
|
|
98
98
|
end
|
|
99
99
|
XML::Mapping.add_node_class GeoLocationPointNode
|
|
@@ -0,0 +1,76 @@
|
|
|
1
|
+
require 'xml/mapping'
|
|
2
|
+
|
|
3
|
+
module Datacite
|
|
4
|
+
module Mapping
|
|
5
|
+
class GeoLocationPolygon
|
|
6
|
+
include Comparable
|
|
7
|
+
include XML::Mapping
|
|
8
|
+
|
|
9
|
+
# Creates a new `GeoLocationPolygon`.
|
|
10
|
+
#
|
|
11
|
+
# @param points [Array<GeoLocationPoint>] an array of points defining the polygon area.
|
|
12
|
+
# Per the spec, the array should contain at least four points, the first and last being
|
|
13
|
+
# identical to close the polygon.
|
|
14
|
+
def initialize(points:) # TODO: allow simple array of point args, array of hashes
|
|
15
|
+
self.points = points
|
|
16
|
+
warn "Polygon should contain at least 4 points, but has #{points.size}" if points.size < 4
|
|
17
|
+
warn "Polygon is not closed; last and first point should be identical, but were: [#{points[0]}], [#{points[-1]}]" if points.size > 1 unless points[0] == points[-1]
|
|
18
|
+
end
|
|
19
|
+
|
|
20
|
+
def points=(value)
|
|
21
|
+
@points = value || []
|
|
22
|
+
end
|
|
23
|
+
|
|
24
|
+
def <=>(other)
|
|
25
|
+
return nil unless other.class == self.class
|
|
26
|
+
points <=> other.points
|
|
27
|
+
end
|
|
28
|
+
|
|
29
|
+
def hash
|
|
30
|
+
points.hash
|
|
31
|
+
end
|
|
32
|
+
|
|
33
|
+
def to_s
|
|
34
|
+
point_hashes = points.map { |p| "{ latitude: #{p.latitude}, longitude: #{p.longitude} }" }.join(', ')
|
|
35
|
+
"[ #{point_hashes} ]"
|
|
36
|
+
end
|
|
37
|
+
|
|
38
|
+
# # @!attribute [rw] polygon
|
|
39
|
+
# # @return [Array<GeoLocationPoint>] an array of points defining the polygon area.
|
|
40
|
+
array_node :points, 'polygonPoint',
|
|
41
|
+
default_value: [],
|
|
42
|
+
marshaller: (proc { |xml, value| marshal_point(xml, value) }),
|
|
43
|
+
unmarshaller: (proc { |xml| unmarshal_point(xml) })
|
|
44
|
+
|
|
45
|
+
use_mapping :datacite_3
|
|
46
|
+
|
|
47
|
+
# TODO: does this ever get called?
|
|
48
|
+
read_only_array_node :points, 'polygonPoint', class: GeoLocationPoint, default_value: [], warn_reason: 'not available in Datacite 3'
|
|
49
|
+
|
|
50
|
+
fallback_mapping :datacite_3, :_default
|
|
51
|
+
|
|
52
|
+
# TODO: Figure out how to DRY this with GeoLocationPointNode
|
|
53
|
+
|
|
54
|
+
COORD_ELEMENTS = { longitude: 'pointLongitude',
|
|
55
|
+
latitude: 'pointLatitude' }.freeze
|
|
56
|
+
|
|
57
|
+
def self.marshal_point(element, value)
|
|
58
|
+
COORD_ELEMENTS.each do |getter, element_name|
|
|
59
|
+
v = value.send(getter)
|
|
60
|
+
puts "adding #{element_name}: #{v}"
|
|
61
|
+
child = element.elements << REXML::Element.new(element_name)
|
|
62
|
+
child.text = v
|
|
63
|
+
end
|
|
64
|
+
end
|
|
65
|
+
|
|
66
|
+
def self.unmarshal_point(elem)
|
|
67
|
+
coords_hash = COORD_ELEMENTS.map do |key, element_name|
|
|
68
|
+
value = elem.elements[element_name].text
|
|
69
|
+
[key, value && value.to_f]
|
|
70
|
+
end.to_h
|
|
71
|
+
GeoLocationPoint.new(coords_hash)
|
|
72
|
+
end
|
|
73
|
+
|
|
74
|
+
end
|
|
75
|
+
end
|
|
76
|
+
end
|
|
@@ -2,7 +2,7 @@ require 'xml/mapping'
|
|
|
2
2
|
|
|
3
3
|
module Datacite
|
|
4
4
|
module Mapping
|
|
5
|
-
DOI_PATTERN = %r{10
|
|
5
|
+
DOI_PATTERN = %r{10\.\S+/\S+}
|
|
6
6
|
|
|
7
7
|
# The persistent identifier that identifies the resource.
|
|
8
8
|
#
|
|
@@ -24,9 +24,10 @@ module Datacite
|
|
|
24
24
|
end
|
|
25
25
|
|
|
26
26
|
def value=(v)
|
|
27
|
-
|
|
28
|
-
fail ArgumentError,
|
|
29
|
-
|
|
27
|
+
new_value = v && v.strip
|
|
28
|
+
fail ArgumentError, 'Identifier must have a non-nil value' unless new_value
|
|
29
|
+
fail ArgumentError, "Identifier value '#{new_value}' is not a valid DOI" unless new_value.match(DOI_PATTERN)
|
|
30
|
+
@value = new_value
|
|
30
31
|
end
|
|
31
32
|
|
|
32
33
|
# Sets the identifier type. Should only be called by the XML mapping engine.
|
|
@@ -50,16 +51,27 @@ module Datacite
|
|
|
50
51
|
Identifier.new(value: match[0])
|
|
51
52
|
end
|
|
52
53
|
|
|
53
|
-
|
|
54
|
-
|
|
54
|
+
text_node :value, 'text()'
|
|
55
|
+
text_node :identifier_type, '@identifierType'
|
|
56
|
+
|
|
57
|
+
fallback_mapping :datacite_3, :_default
|
|
58
|
+
end
|
|
59
|
+
|
|
60
|
+
# Custom node to warn (but not blow up) if we read an XML `<resource/>` that's
|
|
61
|
+
# missing its `<identifier/>`.
|
|
62
|
+
class IdentifierNode < XML::Mapping::ObjectNode
|
|
63
|
+
def xml_to_obj(_obj, xml)
|
|
64
|
+
super if has_element?(xml)
|
|
55
65
|
end
|
|
56
|
-
private_class_method :extract_and_set_value
|
|
57
66
|
|
|
58
|
-
|
|
67
|
+
private
|
|
59
68
|
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
69
|
+
def has_element?(xml) # rubocop:disable Style/PredicateName
|
|
70
|
+
@path.first(xml)
|
|
71
|
+
rescue XML::XXPathError
|
|
72
|
+
warn '<identifier/> not found; add a valid Identifier to the Resource before saving'
|
|
73
|
+
end
|
|
63
74
|
end
|
|
75
|
+
XML::Mapping.add_node_class IdentifierNode
|
|
64
76
|
end
|
|
65
77
|
end
|
|
@@ -1,12 +1,12 @@
|
|
|
1
1
|
module Datacite
|
|
2
2
|
module Mapping
|
|
3
3
|
# The name of this gem
|
|
4
|
-
NAME = 'datacite-mapping'
|
|
4
|
+
NAME = 'datacite-mapping'.freeze
|
|
5
5
|
|
|
6
6
|
# The version of this gem
|
|
7
|
-
VERSION = '0.
|
|
7
|
+
VERSION = '0.2.0'.freeze
|
|
8
8
|
|
|
9
9
|
# The copyright notice for this gem
|
|
10
|
-
COPYRIGHT = 'Copyright (c) 2016 The Regents of the University of California'
|
|
10
|
+
COPYRIGHT = 'Copyright (c) 2016 The Regents of the University of California'.freeze
|
|
11
11
|
end
|
|
12
12
|
end
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
require 'xml/mapping_extensions'
|
|
2
|
+
|
|
3
|
+
# TODO: port this to xml-mapping_extensions
|
|
4
|
+
module XML
|
|
5
|
+
module MappingExtensions
|
|
6
|
+
class Namespace
|
|
7
|
+
def with_prefix(new_prefix)
|
|
8
|
+
Namespace.new(uri: uri, prefix: new_prefix, schema_location: schema_location)
|
|
9
|
+
end
|
|
10
|
+
end
|
|
11
|
+
end
|
|
12
|
+
end
|
|
@@ -0,0 +1,65 @@
|
|
|
1
|
+
require 'xml/mapping'
|
|
2
|
+
|
|
3
|
+
module XML
|
|
4
|
+
class XXPath
|
|
5
|
+
attr_reader :xpathstr
|
|
6
|
+
end
|
|
7
|
+
end
|
|
8
|
+
|
|
9
|
+
module Datacite
|
|
10
|
+
module Mapping
|
|
11
|
+
|
|
12
|
+
module ReadOnlyNodes
|
|
13
|
+
def warn_reason
|
|
14
|
+
@warn_reason ||= @options[:warn_reason]
|
|
15
|
+
end
|
|
16
|
+
|
|
17
|
+
def value_from(obj)
|
|
18
|
+
obj.send(@attrname)
|
|
19
|
+
end
|
|
20
|
+
|
|
21
|
+
def value_str(val)
|
|
22
|
+
return "[ #{val.map(&:to_s).join(', ')} ]" if val.is_a?(Array)
|
|
23
|
+
"'#{val}'"
|
|
24
|
+
end
|
|
25
|
+
|
|
26
|
+
def obj_to_xml(obj, _xml)
|
|
27
|
+
val = value_from(obj)
|
|
28
|
+
return unless val
|
|
29
|
+
warn_ignored(val)
|
|
30
|
+
end
|
|
31
|
+
|
|
32
|
+
def warn_ignored(val)
|
|
33
|
+
warning = "ignoring #{@attrname} #{value_str(val)}"
|
|
34
|
+
warning.prepend("#{warn_reason}; ") if warn_reason
|
|
35
|
+
ReadOnlyNodes.warn(warning)
|
|
36
|
+
end
|
|
37
|
+
|
|
38
|
+
# public to allow testing
|
|
39
|
+
def self.warn(warning)
|
|
40
|
+
super
|
|
41
|
+
end
|
|
42
|
+
end
|
|
43
|
+
|
|
44
|
+
class ReadOnlyTextNode < XML::Mapping::TextNode
|
|
45
|
+
def warn_ignored(val)
|
|
46
|
+
fail ArgumentError, "Expected string, got #{val}" unless val.respond_to?(:strip)
|
|
47
|
+
return if val.strip.empty?
|
|
48
|
+
super
|
|
49
|
+
end
|
|
50
|
+
include ReadOnlyNodes
|
|
51
|
+
end
|
|
52
|
+
XML::Mapping.add_node_class ReadOnlyTextNode
|
|
53
|
+
|
|
54
|
+
class ReadOnlyArrayNode < XML::Mapping::ArrayNode
|
|
55
|
+
def warn_ignored(val)
|
|
56
|
+
fail ArgumentError, "Expected array, got #{val}" unless val.respond_to?(:empty?)
|
|
57
|
+
return if val.empty?
|
|
58
|
+
super
|
|
59
|
+
end
|
|
60
|
+
include ReadOnlyNodes
|
|
61
|
+
end
|
|
62
|
+
XML::Mapping.add_node_class ReadOnlyArrayNode
|
|
63
|
+
|
|
64
|
+
end
|
|
65
|
+
end
|
|
@@ -135,8 +135,31 @@ module Datacite
|
|
|
135
135
|
# @!parse URN = URN
|
|
136
136
|
new :URN, 'URN'
|
|
137
137
|
|
|
138
|
+
# @!parse IGSN = IGSN
|
|
139
|
+
new :IGSN, 'IGSN'
|
|
138
140
|
end
|
|
139
141
|
|
|
142
|
+
class Datacite3RidTypeNode < XML::MappingExtensions::TypesafeEnumNode
|
|
143
|
+
def to_xml_text(enum_instance)
|
|
144
|
+
return super unless enum_instance == RelatedIdentifierType::IGSN
|
|
145
|
+
super(RelatedIdentifierType::HANDLE)
|
|
146
|
+
end
|
|
147
|
+
end
|
|
148
|
+
XML::Mapping.add_node_class(Datacite3RidTypeNode)
|
|
149
|
+
|
|
150
|
+
class Datacite3RidValueNode < XML::Mapping::TextNode
|
|
151
|
+
def obj_to_xml(obj, xml)
|
|
152
|
+
return super unless obj.identifier_type == RelatedIdentifierType::IGSN
|
|
153
|
+
igsn_value = obj.value
|
|
154
|
+
handle_value = "10273/#{igsn_value}"
|
|
155
|
+
# TODO: move this somewhere more general
|
|
156
|
+
ReadOnlyNodes.warn("IGSN identifiers not directly supported in Datacite 3; converting IGSN #{igsn_value} to Handle #{handle_value}")
|
|
157
|
+
set_attr_value(xml, handle_value)
|
|
158
|
+
true
|
|
159
|
+
end
|
|
160
|
+
end
|
|
161
|
+
XML::Mapping.add_node_class(Datacite3RidValueNode)
|
|
162
|
+
|
|
140
163
|
# Globally unique identifier of a related resource.
|
|
141
164
|
class RelatedIdentifier
|
|
142
165
|
include XML::Mapping
|
|
@@ -198,6 +221,11 @@ module Datacite
|
|
|
198
221
|
# @return [String, nil] the type of the metadata scheme. Used only with `HasMetadata`/`IsMetadataFor`. Optional.
|
|
199
222
|
text_node :scheme_type, '@schemeType', default_value: nil
|
|
200
223
|
|
|
224
|
+
use_mapping :datacite_3
|
|
225
|
+
datacite3_rid_type_node :identifier_type, '@relatedIdentifierType', class: RelatedIdentifierType
|
|
226
|
+
datacite3_rid_value_node :value, 'text()'
|
|
227
|
+
|
|
228
|
+
fallback_mapping :datacite_3, :_default
|
|
201
229
|
end
|
|
202
230
|
end
|
|
203
231
|
end
|
|
@@ -1,29 +1,40 @@
|
|
|
1
1
|
require 'xml/mapping_extensions'
|
|
2
|
-
|
|
3
|
-
require 'datacite/mapping/creator'
|
|
2
|
+
|
|
4
3
|
require 'datacite/mapping/identifier'
|
|
5
|
-
require 'datacite/mapping/
|
|
6
|
-
require 'datacite/mapping/
|
|
4
|
+
require 'datacite/mapping/creator'
|
|
5
|
+
require 'datacite/mapping/title'
|
|
6
|
+
require 'datacite/mapping/subject'
|
|
7
|
+
require 'datacite/mapping/contributor'
|
|
8
|
+
require 'datacite/mapping/date'
|
|
7
9
|
require 'datacite/mapping/resource_type'
|
|
10
|
+
require 'datacite/mapping/alternate_identifier'
|
|
8
11
|
require 'datacite/mapping/rights'
|
|
9
|
-
require 'datacite/mapping/
|
|
10
|
-
require 'datacite/mapping/
|
|
12
|
+
require 'datacite/mapping/geo_location'
|
|
13
|
+
require 'datacite/mapping/read_only_nodes'
|
|
11
14
|
|
|
12
15
|
module Datacite
|
|
13
16
|
module Mapping
|
|
14
17
|
|
|
15
|
-
DATACITE_3_NAMESPACE = XML::MappingExtensions::Namespace.new(
|
|
16
|
-
uri: 'http://datacite.org/schema/kernel-3',
|
|
17
|
-
schema_location: 'http://schema.datacite.org/meta/kernel-3/metadata.xsd'
|
|
18
|
-
)
|
|
19
|
-
|
|
20
18
|
# A collection of metadata properties chosen for the accurate and consistent identification
|
|
21
19
|
# of a resource for citation and retrieval purposes, along with recommended use instructions.
|
|
22
20
|
# The resource that is being identified can be of any kind, but it is typically a dataset.
|
|
23
21
|
class Resource # rubocop:disable Metrics/ClassLength
|
|
24
22
|
include XML::MappingExtensions::Namespaced
|
|
25
23
|
|
|
26
|
-
namespace
|
|
24
|
+
# Shadows Namespaced::ClassMethods.namespace
|
|
25
|
+
def namespace
|
|
26
|
+
@namespace ||= DATACITE_4_NAMESPACE
|
|
27
|
+
end
|
|
28
|
+
|
|
29
|
+
# Overrides Namespaced::InstanceMethods.fill_into_xml to check mapping
|
|
30
|
+
def fill_into_xml(xml, options = { mapping: :_default })
|
|
31
|
+
if options[:mapping] == :datacite_3
|
|
32
|
+
unless namespace.uri == DATACITE_3_NAMESPACE.uri
|
|
33
|
+
@namespace = DATACITE_3_NAMESPACE.with_prefix(namespace.prefix)
|
|
34
|
+
end
|
|
35
|
+
end
|
|
36
|
+
super
|
|
37
|
+
end
|
|
27
38
|
|
|
28
39
|
# Initialies a new {Resource}
|
|
29
40
|
#
|
|
@@ -36,8 +47,7 @@ module Datacite
|
|
|
36
47
|
# @param funding_references [Array<FundingReference>] information about financial support (funding) for the resource being registered.
|
|
37
48
|
# @param contributors [Array<Contributor>] institutions or persons responsible for collecting, creating, or otherwise contributing to the developement of the dataset.
|
|
38
49
|
# @param dates [Array<Date>] different dates relevant to the work.
|
|
39
|
-
# @param language [String] Primary language of the resource: an IETF BCP 47, ISO 639-1 language code.
|
|
40
|
-
# It's unclear from the spec whether language is required; to play it safe, if it's missing, we default to 'en'.
|
|
50
|
+
# @param language [String, nil] Primary language of the resource: an IETF BCP 47, ISO 639-1 language code.
|
|
41
51
|
# @param resource_type [ResourceType, nil] the type of the resource
|
|
42
52
|
# @param alternate_identifiers [Array<AlternateIdentifier>] an identifier or identifiers other than the primary {Identifier} applied to the resource being registered.
|
|
43
53
|
# @param related_identifiers [Array<RelatedIdentifier>] identifiers of related resources.
|
|
@@ -47,7 +57,7 @@ module Datacite
|
|
|
47
57
|
# @param rights_list [Array<Rights>] rights information for this resource.
|
|
48
58
|
# @param descriptions [Array<Description>] all additional information that does not fit in any of the other categories.
|
|
49
59
|
# @param geo_locations [Array<GeoLocations>] spatial region or named place where the data was gathered or about which the data is focused.
|
|
50
|
-
def initialize(identifier:, creators:, titles:, publisher:, publication_year:, subjects: [],
|
|
60
|
+
def initialize(identifier:, creators:, titles:, publisher:, publication_year:, subjects: [], contributors: [], dates: [], language: nil, funding_references: [], resource_type: nil, alternate_identifiers: [], related_identifiers: [], sizes: [], formats: [], version: nil, rights_list: [], descriptions: [], geo_locations: []) # rubocop:disable Metrics/MethodLength, Metrics/ParameterLists, Metrics/AbcSize
|
|
51
61
|
self.identifier = identifier
|
|
52
62
|
self.creators = creators
|
|
53
63
|
self.titles = titles
|
|
@@ -72,17 +82,9 @@ module Datacite
|
|
|
72
82
|
# Sets the namespace prefix to be used when writing out XML (defaults to nil)
|
|
73
83
|
# @param prefix [String, nil] The new prefix, or nil to use the default,
|
|
74
84
|
# unprefixed namespace
|
|
75
|
-
def
|
|
85
|
+
def namespace_prefix=(prefix)
|
|
76
86
|
old_namespace = namespace
|
|
77
|
-
namespace ::XML::MappingExtensions::Namespace.new(uri: old_namespace.uri, schema_location: old_namespace.schema_location, prefix: prefix)
|
|
78
|
-
end
|
|
79
|
-
|
|
80
|
-
def language
|
|
81
|
-
@language || 'en'
|
|
82
|
-
end
|
|
83
|
-
|
|
84
|
-
def language=(value)
|
|
85
|
-
@language = value.strip if value
|
|
87
|
+
@namespace = ::XML::MappingExtensions::Namespace.new(uri: old_namespace.uri, schema_location: old_namespace.schema_location, prefix: prefix)
|
|
86
88
|
end
|
|
87
89
|
|
|
88
90
|
def identifier=(value)
|
|
@@ -91,18 +93,19 @@ module Datacite
|
|
|
91
93
|
end
|
|
92
94
|
|
|
93
95
|
def creators=(value)
|
|
94
|
-
fail ArgumentError, 'Resource must have at least one creator' unless value && value.
|
|
96
|
+
fail ArgumentError, 'Resource must have at least one creator' unless value && !value.empty?
|
|
95
97
|
@creators = value
|
|
96
98
|
end
|
|
97
99
|
|
|
98
100
|
def titles=(value)
|
|
99
|
-
fail ArgumentError, 'Resource must have at least one title' unless value && value.
|
|
101
|
+
fail ArgumentError, 'Resource must have at least one title' unless value && !value.empty?
|
|
100
102
|
@titles = value
|
|
101
103
|
end
|
|
102
104
|
|
|
103
105
|
def publisher=(value)
|
|
104
|
-
|
|
105
|
-
|
|
106
|
+
new_value = value && value.strip
|
|
107
|
+
fail ArgumentError, 'Resource must have a publisher' unless new_value && !new_value.empty?
|
|
108
|
+
@publisher = new_value.strip
|
|
106
109
|
end
|
|
107
110
|
|
|
108
111
|
def publication_year=(value)
|
|
@@ -110,17 +113,57 @@ module Datacite
|
|
|
110
113
|
@publication_year = value.to_i
|
|
111
114
|
end
|
|
112
115
|
|
|
113
|
-
def subjects
|
|
114
|
-
|
|
116
|
+
def subjects=(value)
|
|
117
|
+
@subjects = (value && value.select(&:value)) || []
|
|
115
118
|
end
|
|
116
119
|
|
|
117
|
-
def
|
|
118
|
-
@
|
|
120
|
+
def contributors=(value)
|
|
121
|
+
@contributors = value || []
|
|
122
|
+
end
|
|
123
|
+
|
|
124
|
+
def dates=(value)
|
|
125
|
+
@dates = value || []
|
|
126
|
+
end
|
|
127
|
+
|
|
128
|
+
def funding_references=(value)
|
|
129
|
+
@funding_references = value || []
|
|
130
|
+
end
|
|
131
|
+
|
|
132
|
+
def alternate_identifiers=(value)
|
|
133
|
+
@alternate_identifiers = value || []
|
|
134
|
+
end
|
|
135
|
+
|
|
136
|
+
def related_identifiers=(value)
|
|
137
|
+
@related_identifiers = value || []
|
|
138
|
+
end
|
|
139
|
+
|
|
140
|
+
def sizes=(value)
|
|
141
|
+
@sizes = value || []
|
|
142
|
+
end
|
|
143
|
+
|
|
144
|
+
def formats=(value)
|
|
145
|
+
@formats = value || []
|
|
146
|
+
end
|
|
147
|
+
|
|
148
|
+
def version=(value)
|
|
149
|
+
@version = value && value.strip
|
|
150
|
+
end
|
|
151
|
+
|
|
152
|
+
def rights_list=(value)
|
|
153
|
+
@rights_list = value || []
|
|
154
|
+
end
|
|
155
|
+
|
|
156
|
+
def descriptions=(value)
|
|
157
|
+
@descriptions = (value && value.select(&:value)) || []
|
|
158
|
+
end
|
|
159
|
+
|
|
160
|
+
def geo_locations=(value)
|
|
161
|
+
@geo_locations = (value && value.select(&:location?)) || []
|
|
119
162
|
end
|
|
120
163
|
|
|
121
164
|
# @!attribute [rw] identifier
|
|
122
165
|
# @return [Identifier] a persistent identifier that identifies a resource.
|
|
123
|
-
|
|
166
|
+
identifier_node :identifier, 'identifier', class: Identifier
|
|
124
167
|
|
|
125
168
|
# @!attribute [rw] creators
|
|
126
169
|
# @return [Array<Creator>] the main researchers involved working on the data, or the authors of the publication in priority order.
|
|
@@ -156,7 +199,6 @@ module Datacite
|
|
|
156
199
|
|
|
157
200
|
# @!attribute [rw] language
|
|
158
201
|
# @return [String] Primary language of the resource: an IETF BCP 47, ISO 639-1 language code.
|
|
159
|
-
# It's unclear from the spec whether language is required; to play it safe, if it's missing, we default to 'en'.
|
|
160
202
|
text_node :language, 'language', default_value: nil
|
|
161
203
|
|
|
162
204
|
# @!attribute [rw] resource_type
|
|
@@ -211,10 +253,11 @@ module Datacite
|
|
|
211
253
|
# Convenience method to get the funding contributor.
|
|
212
254
|
# @return [Contributor, nil] the contributor of type FUNDER, if any.
|
|
213
255
|
def funder_contrib
|
|
214
|
-
|
|
256
|
+
contributors.find { |c| c.type == ContributorType::FUNDER }
|
|
215
257
|
end
|
|
216
258
|
|
|
217
259
|
# Convenience method to get the name of the funding contributor.
|
|
260
|
+
# @deprecated contributor type 'funder' is deprecated. Use {FundingReference} instead.
|
|
218
261
|
# @return [String, nil] the name of the funding contributor, if any.
|
|
219
262
|
def funder_name
|
|
220
263
|
funder_contrib.name if funder_contrib
|
|
@@ -232,16 +275,18 @@ module Datacite
|
|
|
232
275
|
funder_id.value if funder_id
|
|
233
276
|
end
|
|
234
277
|
|
|
235
|
-
|
|
278
|
+
extend Gem::Deprecate
|
|
279
|
+
deprecate(:funder_contrib, FundingReference, 2016, 9)
|
|
280
|
+
deprecate(:funder_name, FundingReference, 2016, 9)
|
|
281
|
+
deprecate(:funder_id, FundingReference, 2016, 9)
|
|
282
|
+
deprecate(:funder_id_value, FundingReference, 2016, 9)
|
|
236
283
|
|
|
237
|
-
|
|
238
|
-
object_node :identifier, 'identifier', class: Nonvalidating::Identifier
|
|
239
|
-
array_node :subjects, 'subjects', 'subject', class: Nonvalidating::Subject, default_value: []
|
|
240
|
-
text_node :language, 'language', default_value: nil
|
|
284
|
+
use_mapping :datacite_3
|
|
241
285
|
|
|
242
|
-
|
|
286
|
+
read_only_array_node :funding_references, 'fundingReferences', 'fundingReference', class: FundingReference, default_value: [], warn_reason: '<fundingReferences/> not supported in Datacite 3'
|
|
243
287
|
|
|
244
|
-
fallback_mapping :
|
|
288
|
+
fallback_mapping :datacite_3, :_default
|
|
245
289
|
end
|
|
290
|
+
|
|
246
291
|
end
|
|
247
292
|
end
|