lib/cocina/models/dro.rb in cocina-models-0.4.1 vs lib/cocina/models/dro.rb in cocina-models-0.5.0

- old
+ new

@@ -2,40 +2,77 @@ require 'json' module Cocina module Models - # A digital repository object. See https://github.com/sul-dlss-labs/taco/blob/master/maps/DRO.json + # A digital repository object. See http://sul-dlss.github.io/cocina-models/maps/DRO.json class DRO < Dry::Struct + TYPES = %w[ + http://cocina.sul.stanford.edu/models/object.jsonld + http://cocina.sul.stanford.edu/models/3d.jsonld + http://cocina.sul.stanford.edu/models/agreement.jsonl + http://cocina.sul.stanford.edu/models/book.jsonld + http://cocina.sul.stanford.edu/models/document.jsonld + http://cocina.sul.stanford.edu/models/geo.jsonld + http://cocina.sul.stanford.edu/models/image.jsonld + http://cocina.sul.stanford.edu/models/page.jsonld + http://cocina.sul.stanford.edu/models/photograph.jsonld + http://cocina.sul.stanford.edu/models/manuscript.jsonld + http://cocina.sul.stanford.edu/models/map.jsonld + http://cocina.sul.stanford.edu/models/media.jsonld + http://cocina.sul.stanford.edu/models/track.jsonld + http://cocina.sul.stanford.edu/models/webarchive-binary.jsonld + http://cocina.sul.stanford.edu/models/webarchive-seed.jsonld + ].freeze # Subschema for release tags class ReleaseTag < Dry::Struct attribute :to, Types::Strict::String attribute :what, Types::Strict::String.enum('self', 'collection') # we use 'when' other places, but that's reserved word, so 'date' it is! attribute :date, Types::Params::DateTime attribute :who, Types::Strict::String attribute :release, Types::Params::Bool + + def self.from_dynamic(dyn) + ReleaseTag.new(to: dyn['to'], + what: dyn['what'], + date: dyn['date'], + who: dyn['who'], + release: dyn['release']) + end end # Subschema for access concerns class Access < Dry::Struct attribute :embargoReleaseDate, Types::Params::DateTime.meta(omittable: true) + + def self.from_dynamic(dyn) + params = {} + params[:embargoReleaseDate] = dyn['embargoReleaseDate'] if dyn['embargoReleaseDate'] + Access.new(params) + end end # Subschema for administrative concerns class Administrative < Dry::Struct attribute :releaseTags, Types::Strict::Array.of(ReleaseTag).meta(omittable: true) + + def self.from_dynamic(dyn) + params = {} + params[:releaseTags] = dyn['releaseTags'].map { |rt| ReleaseTag.from_dynamic(rt) } if dyn['releaseTags'] + Administrative.new(params) + end end class Identification < Dry::Struct end class Structural < Dry::Struct end attribute :externalIdentifier, Types::Strict::String - attribute :type, Types::Strict::String + attribute :type, Types::String.enum(*TYPES) attribute :label, Types::Strict::String attribute :version, Types::Coercible::Integer attribute(:access, Access.default { Access.new }) attribute(:administrative, Administrative.default { Administrative.new }) attribute(:identification, Identification.default { Identification.new }) @@ -46,14 +83,12 @@ externalIdentifier: dyn['externalIdentifier'], type: dyn['type'], label: dyn['label'], version: dyn['version'] } - if (access_params = dyn['access']) - access = {} - access[:embargoReleaseDate] = access_params['embargoReleaseDate'] if access_params['embargoReleaseDate'] - params[:access] = access - end + + params[:access] = Access.from_dynamic(dyn['access']) if dyn['access'] + params[:administrative] = Administrative.from_dynamic(dyn['administrative']) if dyn['administrative'] DRO.new(params) end def self.from_json(json)