cocina-models 0.19.0 → 0.20.0

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: eaac4eacd465708a36f6f62f975cf1af58eb17015ada6ce45785564547ab4e0e
4
- data.tar.gz: 521e3b949290b6f61fd8a2b83ed984ae2fc4a5e5598ea3eab3a42765cf311218
3
+ metadata.gz: db9943bd397ca96d689ba22f2d9b5f47167d24c1a00ebe140129189bc2ac870c
4
+ data.tar.gz: cb1842b31d65dab3f9bf49f7ea9c228e1af92e50cbb3b4e9143d444210f26509
5
5
  SHA512:
6
- metadata.gz: 51b3220584a9ac5ddfb75522b1def45b1f6f661f4fdb6259582f162b91db7d6b558f4dc9e6a752d9d85b49d4e6b622827397ff5612a97de4e0bee6cc6408c2e6
7
- data.tar.gz: 2c0b9891af645153ddeb6c4ad4dec22c1af8fb413c6a47f546baf641c4b7a2e404fcdc31fd0fcec0ed219d2e23bde03f54366ec35248f8c1af81c6280cc67baa
6
+ metadata.gz: e104cabd5dc7d865028e13b90bc4646cc25d9a5b2a297156f4452f28c245bf66a9b864fe39fa8a00455f1d00063c3a780b6d5c7ff9ed40d95462a819a7c22171
7
+ data.tar.gz: a9d176f0df5c1f80a0532c0877973539e4550967eda88d7b0a0fab4d74db413692f58822d8a15037bb672dd3c53b8808707d2349aedf908d108a14de574ca11c
data/lib/cocina/models.rb CHANGED
@@ -36,6 +36,11 @@ module Cocina
36
36
  # Raised when the type attribute is not valid.
37
37
  class UnknownTypeError < Error; end
38
38
 
39
+ # Base class for Cocina Structs
40
+ class Struct < Dry::Struct
41
+ transform_keys(&:to_sym)
42
+ end
43
+
39
44
  # @param [Hash] dyn a ruby hash representation of the JSON serialization of a collection or DRO
40
45
  # @return [DRO,Collection]
41
46
  # @raises [UnknownTypeError] if a valid type is not found in the data
@@ -3,7 +3,7 @@
3
3
  module Cocina
4
4
  module Models
5
5
  # An admin policy object.
6
- class AdminPolicy < Dry::Struct
6
+ class AdminPolicy < Struct
7
7
  include Checkable
8
8
 
9
9
  TYPES = [
@@ -11,15 +11,11 @@ module Cocina
11
11
  ].freeze
12
12
 
13
13
  # Subschema for access concerns
14
- class Access < Dry::Struct
15
- def self.from_dynamic(_dyn)
16
- params = {}
17
- Access.new(params)
18
- end
14
+ class Access < Struct
19
15
  end
20
16
 
21
17
  # Subschema for administrative concerns
22
- class Administrative < Dry::Struct
18
+ class Administrative < Struct
23
19
  # This was copied from the ActiveFedora defaults: Dor::AdminPolicyObject.new.defaultObjectRights.content
24
20
  DEFAULT_OBJECT_RIGHTS = <<~XML
25
21
  <?xml version="1.0" encoding="UTF-8"?>
@@ -57,21 +53,12 @@ module Cocina
57
53
  # Allowing hasAdminPolicy to be omittable for now (until rolled out to consumers),
58
54
  # but I think it's actually required for every Admin Policy
59
55
  attribute :hasAdminPolicy, Types::Coercible::String.optional.default(nil)
60
-
61
- def self.from_dynamic(dyn)
62
- params = {
63
- default_object_rights: dyn['default_object_rights'],
64
- registration_workflow: dyn['registration_workflow']
65
- }
66
- params[:hasAdminPolicy] = dyn['hasAdminPolicy']
67
- Administrative.new(params)
68
- end
69
56
  end
70
57
 
71
- class Identification < Dry::Struct
58
+ class Identification < Struct
72
59
  end
73
60
 
74
- class Structural < Dry::Struct
61
+ class Structural < Struct
75
62
  end
76
63
 
77
64
  attribute :externalIdentifier, Types::Strict::String
@@ -87,7 +74,7 @@ module Cocina
87
74
  attribute(:structural, Structural.default { Structural.new })
88
75
 
89
76
  def self.from_dynamic(dyn)
90
- AdminPolicyBuilder.build(self, dyn)
77
+ AdminPolicy.new(dyn)
91
78
  end
92
79
 
93
80
  def self.from_json(json)
@@ -3,17 +3,9 @@
3
3
  module Cocina
4
4
  module Models
5
5
  # Metadata for a catalog link
6
- class CatalogLink < Dry::Struct
6
+ class CatalogLink < Struct
7
7
  attribute :catalog, Types::Strict::String
8
8
  attribute :catalogRecordId, Types::Strict::String
9
-
10
- def self.from_dynamic(dyn)
11
- params = {
12
- catalog: dyn['catalog'],
13
- catalogRecordId: dyn['catalogRecordId']
14
- }
15
- CatalogLink.new(params)
16
- end
17
9
  end
18
10
  end
19
11
  end
@@ -3,7 +3,7 @@
3
3
  module Cocina
4
4
  module Models
5
5
  # A digital repository collection. See http://sul-dlss.github.io/cocina-models/maps/Collection.json
6
- class Collection < Dry::Struct
6
+ class Collection < Struct
7
7
  include Checkable
8
8
 
9
9
  TYPES = [
@@ -15,43 +15,23 @@ module Cocina
15
15
  ].freeze
16
16
 
17
17
  # Subschema for access concerns
18
- class Access < Dry::Struct
19
- def self.from_dynamic(_dyn)
20
- params = {}
21
- Access.new(params)
22
- end
18
+ class Access < Struct
23
19
  end
24
20
 
25
21
  # Subschema for administrative concerns
26
- class Administrative < Dry::Struct
22
+ class Administrative < Struct
27
23
  attribute :releaseTags, Types::Strict::Array.of(ReleaseTag).default([].freeze)
28
24
  # Allowing hasAdminPolicy to be omittable for now (until rolled out to consumers),
29
25
  # but I think it's actually required for every DRO
30
26
  attribute :hasAdminPolicy, Types::Coercible::String.optional.default(nil)
31
-
32
- def self.from_dynamic(dyn)
33
- params = {}
34
- params[:releaseTags] = dyn['releaseTags'].map { |rt| ReleaseTag.from_dynamic(rt) } if dyn['releaseTags']
35
- params[:hasAdminPolicy] = dyn['hasAdminPolicy']
36
- Administrative.new(params)
37
- end
38
27
  end
39
28
 
40
29
  # Identification sub-schema for the Collection
41
- class Identification < Dry::Struct
30
+ class Identification < Struct
42
31
  attribute :catalogLinks, Types::Strict::Array.of(CatalogLink).meta(omittable: true)
43
-
44
- def self.from_dynamic(dyn)
45
- params = {}
46
- if dyn['catalogLinks']
47
- params[:catalogLinks] = dyn['catalogLinks']
48
- .map { |link| CatalogLink.from_dynamic(link) }
49
- end
50
- params
51
- end
52
32
  end
53
33
 
54
- class Structural < Dry::Struct
34
+ class Structural < Struct
55
35
  end
56
36
 
57
37
  attribute :externalIdentifier, Types::Strict::String
@@ -67,7 +47,7 @@ module Cocina
67
47
  attribute(:structural, Structural.default { Structural.new })
68
48
 
69
49
  def self.from_dynamic(dyn)
70
- CollectionBuilder.build(self, dyn)
50
+ Collection.new(dyn)
71
51
  end
72
52
 
73
53
  def self.from_json(json)
@@ -3,26 +3,14 @@
3
3
  module Cocina
4
4
  module Models
5
5
  # Descriptive metadata. See http://sul-dlss.github.io/cocina-models/maps/Description.json
6
- class Description < Dry::Struct
6
+ class Description < Struct
7
7
  # Title element. See http://sul-dlss.github.io/cocina-models/maps/Title.json
8
- class Title < Dry::Struct
8
+ class Title < Struct
9
9
  attribute :primary, Types::Strict::Bool
10
10
  attribute :titleFull, Types::Strict::String
11
-
12
- def self.from_dynamic(dyn)
13
- Title.new(primary: dyn['primary'],
14
- titleFull: dyn['titleFull'])
15
- end
16
11
  end
17
12
 
18
13
  attribute :title, Types::Strict::Array.of(Title)
19
-
20
- def self.from_dynamic(dyn)
21
- params = {
22
- title: dyn.fetch('title').map { |title| Title.from_dynamic(title) }
23
- }
24
- Description.new(params)
25
- end
26
14
  end
27
15
  end
28
16
  end
@@ -3,7 +3,7 @@
3
3
  module Cocina
4
4
  module Models
5
5
  # A digital repository object. See http://sul-dlss.github.io/cocina-models/maps/DRO.json
6
- class DRO < Dry::Struct
6
+ class DRO < Struct
7
7
  include Checkable
8
8
 
9
9
  TYPES = [
@@ -25,57 +25,28 @@ module Cocina
25
25
  ].freeze
26
26
 
27
27
  # Subschema for access concerns
28
- class Access < Dry::Struct
28
+ class Access < Struct
29
29
  attribute :embargoReleaseDate, Types::Params::DateTime.meta(omittable: true)
30
-
31
- def self.from_dynamic(dyn)
32
- params = {}
33
- params[:embargoReleaseDate] = dyn['embargoReleaseDate'] if dyn['embargoReleaseDate']
34
- Access.new(params)
35
- end
36
30
  end
37
31
 
38
32
  # Subschema for administrative concerns
39
- class Administrative < Dry::Struct
33
+ class Administrative < Struct
40
34
  attribute :releaseTags, Types::Strict::Array.of(ReleaseTag).meta(omittable: true).default([].freeze)
41
35
  # Allowing hasAdminPolicy to be omittable for now (until rolled out to consumers),
42
36
  # but I think it's actually required for every DRO
43
37
  attribute :hasAdminPolicy, Types::Coercible::String.optional.default(nil)
44
-
45
- def self.from_dynamic(dyn)
46
- params = {}
47
- params[:releaseTags] = dyn['releaseTags'].map { |rt| ReleaseTag.from_dynamic(rt) } if dyn['releaseTags']
48
- params[:hasAdminPolicy] = dyn['hasAdminPolicy']
49
- Administrative.new(params)
50
- end
51
38
  end
52
39
 
53
40
  # Identification sub-schema for the DRO
54
- class Identification < Dry::Struct
41
+ class Identification < Struct
55
42
  attribute :sourceId, Types::Strict::String.meta(omittable: true)
56
43
  attribute :catalogLinks, Types::Strict::Array.of(CatalogLink).meta(omittable: true)
57
- def self.from_dynamic(dyn)
58
- params = {}
59
- params[:sourceId] = dyn['sourceId'] if dyn['sourceId']
60
- if dyn['catalogLinks']
61
- params[:catalogLinks] = dyn['catalogLinks']
62
- .map { |link| CatalogLink.from_dynamic(link) }
63
- end
64
- params
65
- end
66
44
  end
67
45
 
68
46
  # Structural sub-schema for the DRO
69
- class Structural < Dry::Struct
47
+ class Structural < Struct
70
48
  attribute :contains, Types::Strict::Array.of(FileSet).meta(omittable: true)
71
49
  attribute :isMemberOf, Types::Strict::String.meta(omittable: true)
72
-
73
- def self.from_dynamic(dyn)
74
- params = {}
75
- params[:isMemberOf] = dyn['isMemberOf'] if dyn['isMemberOf']
76
- params[:contains] = dyn['contains'].map { |fs| FileSet.from_dynamic(fs) } if dyn['contains']
77
- Structural.new(params)
78
- end
79
50
  end
80
51
 
81
52
  attribute :externalIdentifier, Types::Strict::String
@@ -91,7 +62,7 @@ module Cocina
91
62
  attribute(:structural, Structural.default { Structural.new })
92
63
 
93
64
  def self.from_dynamic(dyn)
94
- DROBuilder.build(self, dyn)
65
+ DRO.new(dyn)
95
66
  end
96
67
 
97
68
  def self.from_json(json)
@@ -3,7 +3,7 @@
3
3
  module Cocina
4
4
  module Models
5
5
  # Metadata for a file. See http://sul-dlss.github.io/cocina-models/maps/File.json
6
- class File < Dry::Struct
6
+ class File < Struct
7
7
  include Checkable
8
8
 
9
9
  TYPES = [
@@ -11,72 +11,33 @@ module Cocina
11
11
  ].freeze
12
12
 
13
13
  # Represents access controls on the file
14
- class Access < Dry::Struct
14
+ class Access < Struct
15
15
  attribute :access, Types::String.default('dark')
16
16
  .enum('world', 'stanford', 'location-based', 'citation-only', 'dark')
17
-
18
- def self.from_dynamic(dyn)
19
- return unless dyn
20
-
21
- params = {}
22
- params[:access] = dyn['access'] if dyn['access']
23
-
24
- Access.new(params)
25
- end
26
17
  end
27
18
 
28
19
  # Represents the administration of the file
29
- class Administrative < Dry::Struct
20
+ class Administrative < Struct
30
21
  attribute :sdrPreserve, Types::Params::Bool.optional.default(false)
31
22
  attribute :shelve, Types::Params::Bool.optional.default(false)
32
-
33
- def self.from_dynamic(dyn)
34
- return unless dyn
35
-
36
- params = {
37
- sdrPreserve: dyn['sdrPreserve'],
38
- shelve: dyn['shelve']
39
- }
40
- Administrative.new(params)
41
- end
42
23
  end
43
24
 
44
- class Identification < Dry::Struct
25
+ class Identification < Struct
45
26
  end
46
27
 
47
- class Structural < Dry::Struct
28
+ class Structural < Struct
48
29
  end
49
30
 
50
31
  # Represents a digest value for a file
51
- class Fixity < Dry::Struct
32
+ class Fixity < Struct
52
33
  attribute :type, Types::String.enum('md5', 'sha1')
53
34
  attribute :digest, Types::Strict::String
54
-
55
- def self.from_dynamic(dyn)
56
- params = {
57
- type: dyn['type'],
58
- digest: dyn['digest']
59
- }
60
-
61
- Fixity.new(params)
62
- end
63
35
  end
64
36
 
65
37
  # Represents some technical aspect of the file
66
- class Presentation < Dry::Struct
38
+ class Presentation < Struct
67
39
  attribute :height, Types::Coercible::Integer.optional.default(nil)
68
40
  attribute :width, Types::Coercible::Integer.optional.default(nil)
69
-
70
- def self.from_dynamic(dyn)
71
- return unless dyn
72
-
73
- params = {
74
- height: dyn['height'],
75
- width: dyn['width']
76
- }
77
-
78
- Presentation.new(params)
79
- end
80
41
  end
81
42
 
82
43
  attribute(:access, Access.optional.default { Access.new })
@@ -94,19 +55,7 @@ module Cocina
94
55
  attribute(:structural, Structural.default { Structural.new })
95
56
 
96
57
  def self.from_dynamic(dyn)
97
- params = {
98
- externalIdentifier: dyn['externalIdentifier'],
99
- type: dyn['type'],
100
- label: dyn['label'],
101
- version: dyn['version'],
102
- size: dyn['size'],
103
- use: dyn['use']
104
- }
105
- params[:administrative] = Administrative.from_dynamic(dyn['administrative'])
106
- params[:presentation] = Presentation.from_dynamic(dyn['presentation'])
107
- params[:access] = Access.from_dynamic(dyn['access'])
108
- params[:hasMessageDigests] = Array(dyn['hasMessageDigests']).map { |p| Fixity.from_dynamic(p) }
109
- File.new(params)
58
+ File.new(dyn)
110
59
  end
111
60
 
112
61
  def self.from_json(json)
@@ -3,25 +3,19 @@
3
3
  module Cocina
4
4
  module Models
5
5
  # Metadata for a File Set. See http://sul-dlss.github.io/cocina-models/maps/Fileset.json
6
- class FileSet < Dry::Struct
6
+ class FileSet < Struct
7
7
  include Checkable
8
8
 
9
9
  TYPES = [
10
10
  Vocab.fileset
11
11
  ].freeze
12
12
 
13
- class Identification < Dry::Struct
13
+ class Identification < Struct
14
14
  end
15
15
 
16
16
  # Structural sub-schema for the FileSet
17
- class Structural < Dry::Struct
17
+ class Structural < Struct
18
18
  attribute :contains, Types::Strict::Array.of(Cocina::Models::File).meta(omittable: true)
19
-
20
- def self.from_dynamic(dyn)
21
- params = {}
22
- params[:contains] = dyn['contains'].map { |f| Cocina::Models::File.from_dynamic(f) } if dyn['contains']
23
- Structural.new(params)
24
- end
25
19
  end
26
20
 
27
21
  attribute :externalIdentifier, Types::Strict::String
@@ -32,21 +26,7 @@ module Cocina
32
26
  attribute(:structural, Structural.default { Structural.new })
33
27
 
34
28
  def self.from_dynamic(dyn)
35
- params = {
36
- externalIdentifier: dyn['externalIdentifier'],
37
- type: dyn['type'],
38
- label: dyn['label'],
39
- version: dyn['version'],
40
- size: dyn['size'],
41
- use: dyn['use']
42
- }
43
- params[:presentation] = Presentation.from_dynamic(dyn['presentation']) if dyn['presentation']
44
- if dyn['hasMessageDigests']
45
- params[:hasMessageDigests] = dyn['hasMessageDigests'].map { |p| Fixity.from_dynamic(p) }
46
- end
47
- params[:structural] = Structural.from_dynamic(dyn['structural']) if dyn['structural']
48
-
49
- FileSet.new(params)
29
+ FileSet.new(dyn)
50
30
  end
51
31
 
52
32
  def self.from_json(json)
@@ -3,7 +3,7 @@
3
3
  module Cocina
4
4
  module Models
5
5
  # Subschema for release tags
6
- class ReleaseTag < Dry::Struct
6
+ class ReleaseTag < Struct
7
7
  attribute :to, Types::Strict::String.enum('Searchworks', 'Earthworks')
8
8
  attribute :what, Types::Strict::String.enum('self', 'collection')
9
9
  # we use 'when' other places, but that's reserved word, so 'date' it is!
@@ -12,11 +12,7 @@ module Cocina
12
12
  attribute :release, Types::Params::Bool
13
13
 
14
14
  def self.from_dynamic(dyn)
15
- ReleaseTag.new(to: dyn['to'],
16
- what: dyn['what'],
17
- date: dyn['date'],
18
- who: dyn['who'],
19
- release: dyn['release'])
15
+ ReleaseTag.new(dyn)
20
16
  end
21
17
  end
22
18
  end
@@ -4,7 +4,7 @@ module Cocina
4
4
  module Models
5
5
  # An request to create an AdminPolicy object.
6
6
  # This is the same as AdminPolicy, except it doesn't have externalIdentifier.
7
- class RequestAdminPolicy < Dry::Struct
7
+ class RequestAdminPolicy < Struct
8
8
  attribute :type, Types::String.enum(*AdminPolicy::TYPES)
9
9
  attribute :label, Types::Strict::String
10
10
  attribute :version, Types::Coercible::Integer
@@ -17,7 +17,7 @@ module Cocina
17
17
  attribute(:structural, AdminPolicy::Structural.default { AdminPolicy::Structural.new })
18
18
 
19
19
  def self.from_dynamic(dyn)
20
- AdminPolicyBuilder.build(self, dyn)
20
+ RequestAdminPolicy.new(dyn)
21
21
  end
22
22
 
23
23
  def self.from_json(json)
@@ -5,7 +5,7 @@ module Cocina
5
5
  # A request to create a digital repository collection.
6
6
  # This is the same as Collection, except it doesn't have externalIdentifier.
7
7
  # See http://sul-dlss.github.io/cocina-models/maps/Collection.json
8
- class RequestCollection < Dry::Struct
8
+ class RequestCollection < Struct
9
9
  attribute :type, Types::String.enum(*Collection::TYPES)
10
10
  attribute :label, Types::Strict::String
11
11
  attribute :version, Types::Coercible::Integer
@@ -18,7 +18,7 @@ module Cocina
18
18
  attribute(:structural, Collection::Structural.default { Collection::Structural.new })
19
19
 
20
20
  def self.from_dynamic(dyn)
21
- CollectionBuilder.build(self, dyn)
21
+ RequestCollection.new(dyn)
22
22
  end
23
23
 
24
24
  def self.from_json(json)
@@ -5,7 +5,7 @@ module Cocina
5
5
  # A Request to create a digital repository object. (to create) object.
6
6
  # This is same as a DRO, but without externalIdentifier (as that wouldn't have been created yet)
7
7
  # See http://sul-dlss.github.io/cocina-models/maps/DRO.json
8
- class RequestDRO < Dry::Struct
8
+ class RequestDRO < Struct
9
9
  attribute :type, Types::String.enum(*DRO::TYPES)
10
10
  attribute :label, Types::Strict::String
11
11
  attribute :version, Types::Coercible::Integer
@@ -18,7 +18,7 @@ module Cocina
18
18
  attribute(:structural, DRO::Structural.default { DRO::Structural.new })
19
19
 
20
20
  def self.from_dynamic(dyn)
21
- DROBuilder.build(self, dyn)
21
+ RequestDRO.new(dyn)
22
22
  end
23
23
 
24
24
  def self.from_json(json)
@@ -2,6 +2,6 @@
2
2
 
3
3
  module Cocina
4
4
  module Models
5
- VERSION = '0.19.0'
5
+ VERSION = '0.20.0'
6
6
  end
7
7
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: cocina-models
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.19.0
4
+ version: 0.20.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Justin Coyne
8
8
  autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2020-02-12 00:00:00.000000000 Z
11
+ date: 2020-02-13 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: dry-struct
@@ -177,14 +177,11 @@ files:
177
177
  - docs/schema.md
178
178
  - lib/cocina/models.rb
179
179
  - lib/cocina/models/admin_policy.rb
180
- - lib/cocina/models/admin_policy_builder.rb
181
180
  - lib/cocina/models/catalog_link.rb
182
181
  - lib/cocina/models/checkable.rb
183
182
  - lib/cocina/models/collection.rb
184
- - lib/cocina/models/collection_builder.rb
185
183
  - lib/cocina/models/description.rb
186
184
  - lib/cocina/models/dro.rb
187
- - lib/cocina/models/dro_builder.rb
188
185
  - lib/cocina/models/file.rb
189
186
  - lib/cocina/models/file_set.rb
190
187
  - lib/cocina/models/release_tag.rb
@@ -1,30 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- module Cocina
4
- module Models
5
- # This creates an AdminPolicy or a RequestAdminPolicy from dynamic attributes
6
- class AdminPolicyBuilder
7
- # @return [AdminPolicy,RequestAdminPolicy]
8
- def self.build(klass, dyn)
9
- params = {
10
- type: dyn['type'],
11
- label: dyn['label'],
12
- version: dyn['version']
13
- }
14
- params[:externalIdentifier] = dyn['externalIdentifier'] if needs_id?(klass)
15
-
16
- # params[:access] = Access.from_dynamic(dyn['access']) if dyn['access']
17
- if dyn['administrative']
18
- params[:administrative] = AdminPolicy::Administrative
19
- .from_dynamic(dyn['administrative'])
20
- end
21
- params[:description] = Description.from_dynamic(dyn.fetch('description'))
22
- klass.new(params)
23
- end
24
-
25
- def self.needs_id?(klass)
26
- klass.attribute_names.include?(:externalIdentifier)
27
- end
28
- end
29
- end
30
- end
@@ -1,35 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- module Cocina
4
- module Models
5
- # This creates a Collection or a RequestCollection from dynamic attributes
6
- class CollectionBuilder
7
- # @return [Collection,RequestCollection]
8
- # rubocop:disable Metrics/MethodLength
9
- def self.build(klass, dyn)
10
- params = {
11
- type: dyn['type'],
12
- label: dyn['label'],
13
- version: dyn['version'],
14
- description: Description.from_dynamic(dyn.fetch('description'))
15
- }
16
- params[:externalIdentifier] = dyn['externalIdentifier'] if needs_id?(klass)
17
- # params[:access] = Access.from_dynamic(dyn['access']) if dyn['access']
18
- if dyn['administrative']
19
- params[:administrative] = Collection::Administrative
20
- .from_dynamic(dyn['administrative'])
21
- end
22
- if dyn['identification']
23
- params[:identification] = Collection::Identification
24
- .from_dynamic(dyn['identification'])
25
- end
26
- klass.new(params)
27
- end
28
- # rubocop:enable Metrics/MethodLength
29
-
30
- def self.needs_id?(klass)
31
- klass.attribute_names.include?(:externalIdentifier)
32
- end
33
- end
34
- end
35
- end
@@ -1,31 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- module Cocina
4
- module Models
5
- # This creates a DRO or a RequestDRO from dynamic attributes
6
- class DROBuilder
7
- # @return [DRO,RequestDRO]
8
- # rubocop:disable Metrics/AbcSize
9
- def self.build(klass, dyn)
10
- params = {
11
- type: dyn['type'],
12
- label: dyn['label'],
13
- version: dyn['version'],
14
- description: Description.from_dynamic(dyn.fetch('description'))
15
- }
16
- params[:externalIdentifier] = dyn['externalIdentifier'] if needs_id?(klass)
17
-
18
- params[:access] = DRO::Access.from_dynamic(dyn['access']) if dyn['access']
19
- params[:administrative] = DRO::Administrative.from_dynamic(dyn['administrative']) if dyn['administrative']
20
- params[:identification] = DRO::Identification.from_dynamic(dyn['identification']) if dyn['identification']
21
- params[:structural] = DRO::Structural.from_dynamic(dyn['structural']) if dyn['structural']
22
- klass.new(params)
23
- end
24
- # rubocop:enable Metrics/AbcSize
25
-
26
- def self.needs_id?(klass)
27
- klass.attribute_names.include?(:externalIdentifier)
28
- end
29
- end
30
- end
31
- end