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
|
@@ -1,5 +1,7 @@
|
|
|
1
1
|
require 'xml/mapping_extensions'
|
|
2
2
|
|
|
3
|
+
require 'datacite/mapping/date_value'
|
|
4
|
+
|
|
3
5
|
module Datacite
|
|
4
6
|
module Mapping
|
|
5
7
|
|
|
@@ -35,32 +37,23 @@ module Datacite
|
|
|
35
37
|
end
|
|
36
38
|
|
|
37
39
|
# Represents a DataCite `<date/>` field, which can be a year, date (year-month-day or just year-month),
|
|
38
|
-
# or ISO8601
|
|
40
|
+
# ISO8601 datetime, or [RKMS-ISO8601](http://www.ukoln.ac.uk/metadata/dcmi/collection-RKMS-ISO8601/) date range.
|
|
39
41
|
#
|
|
40
|
-
# @!attribute [r]
|
|
41
|
-
# @return [
|
|
42
|
-
#
|
|
43
|
-
#
|
|
44
|
-
#
|
|
45
|
-
#
|
|
46
|
-
# @!attribute [r]
|
|
47
|
-
# @return [
|
|
48
|
-
#
|
|
49
|
-
# @return [Integer, nil] The minutes. Can be `nil` if no minutes were specified.
|
|
50
|
-
# @!attribute [r] sec
|
|
51
|
-
# @return [Integer, nil] The seconds. Can be `nil` if no seconds were specified.
|
|
52
|
-
# @!attribute [r] nsec
|
|
53
|
-
# @return [Integer, nil] The nanoseconds. Can be `nil` if no nanoseconds were specified.
|
|
42
|
+
# @!attribute [r] date_value
|
|
43
|
+
# @return [DateValue, nil] the single date/time represented by this `<date/>` field,
|
|
44
|
+
# if it does not represent a ragne
|
|
45
|
+
# @!attribute [r] range_start
|
|
46
|
+
# @return [DateValue, nil] the start of the date range represented by this `<date/> field`,
|
|
47
|
+
# if it represents a range, and the range is not open on the lower end
|
|
48
|
+
# @!attribute [r] range_end
|
|
49
|
+
# @return [DateValue, nil] the end of the date range represented by this `<date/> field`,
|
|
50
|
+
# if it represents a range, and the range is not open on the upper end
|
|
54
51
|
class Date
|
|
55
52
|
include XML::Mapping
|
|
56
53
|
|
|
57
|
-
attr_reader :
|
|
58
|
-
attr_reader :
|
|
59
|
-
attr_reader :
|
|
60
|
-
attr_reader :hour
|
|
61
|
-
attr_reader :minute
|
|
62
|
-
attr_reader :sec
|
|
63
|
-
attr_reader :nsec
|
|
54
|
+
attr_reader :date_value
|
|
55
|
+
attr_reader :range_start
|
|
56
|
+
attr_reader :range_end
|
|
64
57
|
|
|
65
58
|
# Initializes a new `Date`
|
|
66
59
|
#
|
|
@@ -77,65 +70,22 @@ module Datacite
|
|
|
77
70
|
@type = val
|
|
78
71
|
end
|
|
79
72
|
|
|
80
|
-
#
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
new_value = val.respond_to?(:iso8601) ? val.iso8601 : val.to_s
|
|
91
|
-
if new_value.include?('T')
|
|
92
|
-
@hour = @date_time.hour if @date_time
|
|
93
|
-
@minute = @date_time.minute if @date_time
|
|
94
|
-
@sec = @date_time.sec if @date_time
|
|
95
|
-
@nsec = @date_time.to_time.nsec if @date_time
|
|
73
|
+
def value=(val) # rubocop:disable Metrics/AbcSize
|
|
74
|
+
parts = val.to_s.split('/', -1) # negative limit so we don't drop trailing empty string
|
|
75
|
+
@date_value, @range_start, @range_end = nil
|
|
76
|
+
if parts.size == 1
|
|
77
|
+
@date_value = DateValue.new(val)
|
|
78
|
+
elsif parts.size == 2
|
|
79
|
+
@range_start, @range_end = parts.map(&:strip).map { |part| DateValue.new(part) unless part == '' }
|
|
80
|
+
# puts "#{val} -> [#{range_start}, #{range_end}]"
|
|
81
|
+
else
|
|
82
|
+
fail ArgumentError, "Unable to parse date value #{val}"
|
|
96
83
|
end
|
|
97
|
-
|
|
98
|
-
@value = new_value
|
|
84
|
+
@value = val
|
|
99
85
|
end
|
|
100
86
|
|
|
101
87
|
private
|
|
102
88
|
|
|
103
|
-
def to_year(val)
|
|
104
|
-
return val if val.is_a?(Integer)
|
|
105
|
-
return val.year if val.respond_to?(:year)
|
|
106
|
-
matchdata = val.to_s.match(/^[0-9]+/)
|
|
107
|
-
matchdata[0].to_i if matchdata
|
|
108
|
-
end
|
|
109
|
-
|
|
110
|
-
def to_month(val)
|
|
111
|
-
return val.month if val.respond_to?(:month)
|
|
112
|
-
matchdata = val.to_s.match(/^[0-9]+-([0-9]{2})(?![0-9])/)
|
|
113
|
-
matchdata[1].to_i if matchdata
|
|
114
|
-
end
|
|
115
|
-
|
|
116
|
-
def to_day(val)
|
|
117
|
-
return val.day if val.respond_to?(:day)
|
|
118
|
-
matchdata = val.to_s.match(/^[0-9]+-[0-9]{2}-([0-9]{2})(?![0-9])/)
|
|
119
|
-
matchdata[1].to_i if matchdata
|
|
120
|
-
end
|
|
121
|
-
|
|
122
|
-
def to_datetime(val)
|
|
123
|
-
return val if val.is_a?(DateTime)
|
|
124
|
-
DateTime.parse(val.to_s)
|
|
125
|
-
rescue ArgumentError => e
|
|
126
|
-
Mapping.log.debug("Can't extract DateTime from date value '#{val}': #{e}")
|
|
127
|
-
nil
|
|
128
|
-
end
|
|
129
|
-
|
|
130
|
-
def to_date(val)
|
|
131
|
-
return val if val.is_a?(::Date)
|
|
132
|
-
return ::Date.parse(val.iso8601) if val.respond_to?(:iso8601)
|
|
133
|
-
::Date.parse(val.to_s)
|
|
134
|
-
rescue ArgumentError => e
|
|
135
|
-
Mapping.log.debug("Can't extract Date from date value '#{val}': #{e}")
|
|
136
|
-
nil
|
|
137
|
-
end
|
|
138
|
-
|
|
139
89
|
# @!attribute [rw] type
|
|
140
90
|
# @return [DateType] the type of date. Cannot be nil.
|
|
141
91
|
typesafe_enum_node :type, '@dateType', class: DateType
|
|
@@ -143,6 +93,8 @@ module Datacite
|
|
|
143
93
|
# @!method value
|
|
144
94
|
# @return [String] The value as a string. May be any [W3C DateTime format](http://www.w3.org/TR/NOTE-datetime).
|
|
145
95
|
text_node :value, 'text()'
|
|
96
|
+
|
|
97
|
+
fallback_mapping :datacite_3, :_default
|
|
146
98
|
end
|
|
147
99
|
end
|
|
148
100
|
end
|
|
@@ -0,0 +1,116 @@
|
|
|
1
|
+
require 'xml/mapping_extensions'
|
|
2
|
+
|
|
3
|
+
module Datacite
|
|
4
|
+
module Mapping
|
|
5
|
+
|
|
6
|
+
# Represents a DataCite "date" value, which can be a year, date (year-month-day or just year-month),
|
|
7
|
+
# or ISO8601 datetime.
|
|
8
|
+
#
|
|
9
|
+
# @!attribute [r] year
|
|
10
|
+
# @return [Integer] The year.
|
|
11
|
+
# @!attribute [r] month
|
|
12
|
+
# @return [Integer, nil] The month. Can be `nil` if no month was specified.
|
|
13
|
+
# @!attribute [r] day
|
|
14
|
+
# @return [Integer, nil] The day. Can be `nil` if no day was specified.
|
|
15
|
+
# @!attribute [r] hour
|
|
16
|
+
# @return [Integer, nil] The hour. Can be `nil` if no hour was specified.
|
|
17
|
+
# @!attribute [r] minute
|
|
18
|
+
# @return [Integer, nil] The minutes. Can be `nil` if no minutes were specified.
|
|
19
|
+
# @!attribute [r] sec
|
|
20
|
+
# @return [Integer, nil] The seconds. Can be `nil` if no seconds were specified.
|
|
21
|
+
# @!attribute [r] nsec
|
|
22
|
+
# @return [Integer, nil] The nanoseconds. Can be `nil` if no nanoseconds were specified.
|
|
23
|
+
class DateValue
|
|
24
|
+
include Comparable
|
|
25
|
+
|
|
26
|
+
attr_reader :year
|
|
27
|
+
attr_reader :month
|
|
28
|
+
attr_reader :day
|
|
29
|
+
attr_reader :hour
|
|
30
|
+
attr_reader :minute
|
|
31
|
+
attr_reader :sec
|
|
32
|
+
attr_reader :nsec
|
|
33
|
+
attr_reader :date
|
|
34
|
+
attr_reader :zone
|
|
35
|
+
|
|
36
|
+
# Creates a new {DateValue}.
|
|
37
|
+
#
|
|
38
|
+
# @param val [DateTime, Date, Integer, String] The value, as a `DateTime`, `Date`, or `Integer`,
|
|
39
|
+
# or as a `String` in any [W3C DateTime format](http://www.w3.org/TR/NOTE-datetime)
|
|
40
|
+
def initialize(val) # rubocop:disable Metrics/AbcSize, Metrics/MethodLength
|
|
41
|
+
datetime = to_datetime(val)
|
|
42
|
+
@date = datetime ? datetime.to_date : to_date(val)
|
|
43
|
+
@year = to_year(val)
|
|
44
|
+
@month = to_month(val)
|
|
45
|
+
@day = to_day(val)
|
|
46
|
+
iso_value = val.respond_to?(:iso8601) ? val.iso8601 : val.to_s
|
|
47
|
+
if datetime && iso_value.include?('T')
|
|
48
|
+
@hour = datetime.hour
|
|
49
|
+
@minute = datetime.minute
|
|
50
|
+
@sec = datetime.sec
|
|
51
|
+
@nsec = datetime.to_time.nsec
|
|
52
|
+
@zone = datetime.zone
|
|
53
|
+
end
|
|
54
|
+
fail ArgumentError, "Unable to parse date value '#{val}'" unless @year
|
|
55
|
+
end
|
|
56
|
+
|
|
57
|
+
def <=>(other)
|
|
58
|
+
return nil unless other.class == self.class
|
|
59
|
+
[:year, :month, :day, :hour, :minute, :sec, :nsec].each do |v|
|
|
60
|
+
order = send(v) <=> other.send(v)
|
|
61
|
+
return order if order.nonzero?
|
|
62
|
+
end
|
|
63
|
+
0
|
|
64
|
+
end
|
|
65
|
+
|
|
66
|
+
def hash
|
|
67
|
+
[year, month, day, hour, minute, sec, nsec, zone].hash
|
|
68
|
+
end
|
|
69
|
+
|
|
70
|
+
def to_s
|
|
71
|
+
'DateTime(' + [:year, :month, :day, :hour, :minute, :sec, :nsec, :zone].map do |field|
|
|
72
|
+
value = send(field)
|
|
73
|
+
value = format('%02d', value) if value && value.is_a?(Integer)
|
|
74
|
+
"#{field}: #{value}" if value
|
|
75
|
+
end.compact.join(', ') + ')'
|
|
76
|
+
end
|
|
77
|
+
|
|
78
|
+
private
|
|
79
|
+
|
|
80
|
+
def to_year(val)
|
|
81
|
+
return val if val.is_a?(Integer)
|
|
82
|
+
return val.year if val.respond_to?(:year)
|
|
83
|
+
matchdata = val.to_s.match(/^[0-9]+/)
|
|
84
|
+
matchdata[0].to_i if matchdata
|
|
85
|
+
end
|
|
86
|
+
|
|
87
|
+
def to_month(val)
|
|
88
|
+
return val.month if val.respond_to?(:month)
|
|
89
|
+
matchdata = val.to_s.match(/^[0-9]+-([0-9]{2})(?![0-9])/)
|
|
90
|
+
matchdata[1].to_i if matchdata
|
|
91
|
+
end
|
|
92
|
+
|
|
93
|
+
def to_day(val)
|
|
94
|
+
return val.day if val.respond_to?(:day)
|
|
95
|
+
matchdata = val.to_s.match(/^[0-9]+-[0-9]{2}-([0-9]{2})(?![0-9])/)
|
|
96
|
+
matchdata[1].to_i if matchdata
|
|
97
|
+
end
|
|
98
|
+
|
|
99
|
+
def to_datetime(val)
|
|
100
|
+
return val if val.is_a?(DateTime)
|
|
101
|
+
DateTime.parse(val.to_s)
|
|
102
|
+
rescue ArgumentError
|
|
103
|
+
nil
|
|
104
|
+
end
|
|
105
|
+
|
|
106
|
+
def to_date(val)
|
|
107
|
+
return val if val.is_a?(::Date)
|
|
108
|
+
return ::Date.parse(val.iso8601) if val.respond_to?(:iso8601)
|
|
109
|
+
::Date.parse(val.to_s)
|
|
110
|
+
rescue ArgumentError
|
|
111
|
+
nil
|
|
112
|
+
end
|
|
113
|
+
|
|
114
|
+
end
|
|
115
|
+
end
|
|
116
|
+
end
|
|
@@ -77,28 +77,28 @@ module Datacite
|
|
|
77
77
|
include XML::Mapping
|
|
78
78
|
|
|
79
79
|
# Initializes a new {Description}
|
|
80
|
-
# @param language [String] an IETF BCP 47, ISO 639-1 language code identifying the language.
|
|
81
|
-
# It's unclear from the spec whether language is required; to play it safe, if it's missing, we default to 'en'.
|
|
80
|
+
# @param language [String, nil] an IETF BCP 47, ISO 639-1 language code identifying the language.
|
|
82
81
|
# @param type [DescriptionType] the description type.
|
|
83
82
|
# @param value [String] the description itself. See {Description} for notes on special
|
|
84
83
|
# handling of `<br/>` tags.
|
|
85
|
-
def initialize(language:
|
|
84
|
+
def initialize(language: nil, type:, value:)
|
|
86
85
|
self.language = language
|
|
87
86
|
self.type = type
|
|
88
87
|
self.value = value
|
|
89
88
|
end
|
|
90
89
|
|
|
91
|
-
def language
|
|
92
|
-
@language
|
|
90
|
+
def language=(value)
|
|
91
|
+
@language = value && value.strip
|
|
93
92
|
end
|
|
94
93
|
|
|
95
|
-
def
|
|
96
|
-
|
|
94
|
+
def value=(v)
|
|
95
|
+
new_value = v && v.strip
|
|
96
|
+
fail ArgumentError, 'Value cannot be empty or nil' unless new_value && !new_value.empty?
|
|
97
|
+
@value = new_value
|
|
97
98
|
end
|
|
98
99
|
|
|
99
100
|
# @!attribute [rw] language
|
|
100
101
|
# @return [String] an IETF BCP 47, ISO 639-1 language code identifying the language.
|
|
101
|
-
# It's unclear from the spec whether language is required; to play it safe, if it's missing, we default to 'en'.
|
|
102
102
|
text_node :language, '@xml:lang', default_value: nil
|
|
103
103
|
|
|
104
104
|
# @!attribute [rw] type
|
|
@@ -110,6 +110,7 @@ module Datacite
|
|
|
110
110
|
# handling of `<br/>` tags.
|
|
111
111
|
break_preserving_value_node :value, 'node()'
|
|
112
112
|
|
|
113
|
+
fallback_mapping :datacite_3, :_default
|
|
113
114
|
end
|
|
114
115
|
end
|
|
115
116
|
end
|
|
@@ -37,6 +37,10 @@ module Datacite
|
|
|
37
37
|
@type = value
|
|
38
38
|
end
|
|
39
39
|
|
|
40
|
+
def to_s
|
|
41
|
+
"#{type.value}: #{value}"
|
|
42
|
+
end
|
|
43
|
+
|
|
40
44
|
# @!attribute [rw] type
|
|
41
45
|
# @return [FunderIdentifierType] the identifier type. Cannot be nil.
|
|
42
46
|
typesafe_enum_node :type, '@funderIdentifierType', class: FunderIdentifierType
|
|
@@ -59,6 +63,10 @@ module Datacite
|
|
|
59
63
|
@value = value
|
|
60
64
|
end
|
|
61
65
|
|
|
66
|
+
def to_s
|
|
67
|
+
"#{value} (#{uri})"
|
|
68
|
+
end
|
|
69
|
+
|
|
62
70
|
# @!attribute [rw] uri
|
|
63
71
|
# @return [URI, nil] The URI leading to a page provided by the funder for more information about the award
|
|
64
72
|
uri_node :uri, '@awardURI', default_value: nil
|
|
@@ -81,17 +89,24 @@ module Datacite
|
|
|
81
89
|
end
|
|
82
90
|
|
|
83
91
|
def award_number=(value)
|
|
84
|
-
if value.nil? || value.is_a?(AwardNumber)
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
92
|
+
@award_number = if value.nil? || value.is_a?(AwardNumber)
|
|
93
|
+
value
|
|
94
|
+
else
|
|
95
|
+
AwardNumber.new(value: value.to_s)
|
|
96
|
+
end
|
|
97
|
+
end
|
|
98
|
+
|
|
99
|
+
def to_s
|
|
100
|
+
fields = [:name, :identifier, :award_number, :award_title].map { |f| "#{f}: #{send(f)}" }
|
|
101
|
+
"FundingReference { #{fields.join(', ')} }"
|
|
89
102
|
end
|
|
90
103
|
|
|
91
104
|
text_node :name, 'funderName'
|
|
92
105
|
object_node :identifier, 'funderIdentifier', class: FunderIdentifier, default_value: nil
|
|
93
106
|
object_node :award_number, 'awardNumber', class: AwardNumber, default_value: nil
|
|
94
107
|
text_node :award_title, 'awardTitle', default_value: nil
|
|
108
|
+
|
|
109
|
+
fallback_mapping :datacite_3, :_default
|
|
95
110
|
end
|
|
96
111
|
end
|
|
97
112
|
end
|
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
require 'xml/mapping_extensions'
|
|
2
2
|
require 'datacite/mapping/geo_location_point'
|
|
3
3
|
require 'datacite/mapping/geo_location_box'
|
|
4
|
+
require 'datacite/mapping/geo_location_polygon'
|
|
4
5
|
|
|
5
6
|
module Datacite
|
|
6
7
|
module Mapping
|
|
@@ -17,18 +18,28 @@ module Datacite
|
|
|
17
18
|
# @param point [GeoLocationPoint, nil] the latitude and longitude at which the data was gathered or about which the data is focused.
|
|
18
19
|
# @param box [GeoLocationBox, nil] the latitude-longitude quadrangle containing the area where the data was gathered or about which the data is focused.
|
|
19
20
|
# @param place [String, nil] the spatial region or named place where the data was gathered or about which the data is focused.
|
|
20
|
-
|
|
21
|
+
# @param polygon [GeoLocationPolygon, nil] a drawn polygon area containing the area where the data was gathered or about which the data is focused.
|
|
22
|
+
def initialize(point: nil, box: nil, place: nil, polygon: nil)
|
|
21
23
|
self.point = point
|
|
22
24
|
self.box = box
|
|
23
25
|
self.place = place
|
|
26
|
+
self.polygon = polygon
|
|
24
27
|
end
|
|
25
28
|
|
|
26
29
|
def place=(value)
|
|
27
30
|
@place = value.respond_to?(:strip) ? value.strip : value
|
|
28
31
|
end
|
|
29
32
|
|
|
33
|
+
def location?
|
|
34
|
+
point || box || place || polygon
|
|
35
|
+
end
|
|
36
|
+
|
|
30
37
|
root_element_name 'geoLocation'
|
|
31
38
|
|
|
39
|
+
# @!attribute [rw] place
|
|
40
|
+
# @return [String, nil] the spatial region or named place where the data was gathered or about which the data is focused.
|
|
41
|
+
text_node :place, 'geoLocationPlace', default_value: nil
|
|
42
|
+
|
|
32
43
|
# @!attribute [rw] point
|
|
33
44
|
# @return [GeoLocationPoint, nil] the latitude and longitude at which the data was gathered or about which the data is focused.
|
|
34
45
|
geo_location_point_node :point, 'geoLocationPoint', default_value: nil
|
|
@@ -37,10 +48,20 @@ module Datacite
|
|
|
37
48
|
# @return [GeoLocationBox, nil] the latitude-longitude quadrangle containing the area where the data was gathered or about which the data is focused.
|
|
38
49
|
geo_location_box_node :box, 'geoLocationBox', default_value: nil
|
|
39
50
|
|
|
40
|
-
# @!attribute [rw]
|
|
41
|
-
# @return [
|
|
42
|
-
|
|
51
|
+
# # @!attribute [rw] polygon
|
|
52
|
+
# # @return [GeoLocationPolygon] a drawn polygon area containing the area where the data was gathered or about which the data is focused.
|
|
53
|
+
object_node :polygon, 'geoLocationPolygon', class: GeoLocationPolygon, default_value: nil
|
|
54
|
+
|
|
55
|
+
use_mapping :datacite_3
|
|
56
|
+
|
|
57
|
+
# Workaround for https://github.com/dmolesUC3/xml-mapping_extensions/issues/6
|
|
58
|
+
object_node :polygon, 'geoLocationPolygon', class: GeoLocationPolygon, default_value: nil, marshaller: (proc do |xml, value|
|
|
59
|
+
# TODO: Move ReadOnlyNodes.warn() somewhere more obvious
|
|
60
|
+
ReadOnlyNodes.warn "<geoLocationPolygon/> not supported in Datacite 3; ignoring polygon #{value}"
|
|
61
|
+
xml.parent.delete_element(xml)
|
|
62
|
+
end)
|
|
43
63
|
|
|
64
|
+
fallback_mapping :datacite_3, :_default
|
|
44
65
|
end
|
|
45
66
|
end
|
|
46
67
|
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
|
|
@@ -95,7 +96,7 @@ module Datacite
|
|
|
95
96
|
return nil unless other.class == self.class
|
|
96
97
|
[:south_latitude, :west_longitude, :north_latitude, :east_longitude].each do |c|
|
|
97
98
|
order = send(c) <=> other.send(c)
|
|
98
|
-
return order if order
|
|
99
|
+
return order if order.nonzero?
|
|
99
100
|
end
|
|
100
101
|
0
|
|
101
102
|
end
|
|
@@ -122,13 +123,14 @@ module Datacite
|
|
|
122
123
|
end
|
|
123
124
|
|
|
124
125
|
# XML mapping node for `<geoLocationBox/>`
|
|
125
|
-
class GeoLocationBoxNode <
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
126
|
+
class GeoLocationBoxNode < GeoLocationNode
|
|
127
|
+
def initialize(*args)
|
|
128
|
+
@geom_class = GeoLocationBox
|
|
129
|
+
@coord_elements = { west_longitude: 'westBoundLongitude',
|
|
130
|
+
east_longitude: 'eastBoundLongitude',
|
|
131
|
+
south_latitude: 'southBoundLatitude',
|
|
132
|
+
north_latitude: 'northBoundLatitude' }.freeze
|
|
133
|
+
super
|
|
132
134
|
end
|
|
133
135
|
end
|
|
134
136
|
XML::Mapping.add_node_class GeoLocationBoxNode
|