cocina-models 0.30.0 → 0.31.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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: ae254699614b4355dea34dab3e0ef324123b21d30d592c24ceffbad5fed3515e
4
- data.tar.gz: da8eecbff7bec360ed56445d61fc558b4a18684df9f0f92bc4a98668e2d16dac
3
+ metadata.gz: 10987f18b2d6489790ca3edbcead8ff6aa2fedfbca1bcb18d5606b8112c88f7e
4
+ data.tar.gz: 1431af2debd70299b4574997d842f0107ce356b44b67123deedf237b08f669b9
5
5
  SHA512:
6
- metadata.gz: 4c6c2e1beb7cd1b28d73bee2641be223497e18764bbffae9953fde54995336ae970be70e8d1ac31fa96f131ad9c17a02b2a5ef7b9e9beb098ecf9925899333ad
7
- data.tar.gz: 53246fecec8a7e4516aa3fef318dddfa644158678f4894d1eeb1285d0c247b6a2bdafd68a491ae18b19e41fa5a195bc2f078ba303adb9f83f37b26c4121585cf
6
+ metadata.gz: ff3ba29a4e6ca6a23bb55bdb12a2a4ef26852468155d812e9572a07b0711e6e22e549fbd186985e62b3b6e90deb501d938db62cf73c61823c80759a5d2b40fcc
7
+ data.tar.gz: a480849d853c21828d5830f6227d9e169a1f9cefac484038ebd6d0f0d661d9c40e44e217e15cd62f80a9efcfad2a51ad8c009fbe6048040475c21a5f4485228e
@@ -22,6 +22,10 @@ RSpec/MultipleExpectations:
22
22
 
23
23
  RSpec/ExampleLength:
24
24
  Max: 18
25
+ Exclude:
26
+ - spec/cocina/models/description_spec.rb
27
+ - spec/cocina/models/dro_shared_examples.rb
28
+
25
29
 
26
30
  Style/Documentation:
27
31
  Exclude:
data/README.md CHANGED
@@ -7,12 +7,14 @@
7
7
 
8
8
  This is a Ruby implementation of the SDR data model (named "COCINA"). The data being modeled includes digital repository objects.
9
9
 
10
- It provides a way for consumers to validate objects against models using dry-struct and dry-types gems.
10
+ Validation is performed by openapi (using OpenAPIParser). Modeling is provided by dry-struct and dry-types. Together, these provide a way for consumers to validate objects against models and to manipulate thos objects.
11
11
 
12
12
  This is a work in progress that will ultimately implement the full [COCINA data model](http://sul-dlss.github.io/cocina-models/). See also [architecture documentation](https://sul-dlss.github.io/taco-truck/COCINA.html#cocina-data-models--shapes).
13
13
 
14
14
  ## Generate models from openapi.yml
15
15
 
16
+ Note that only a small subset of openapi is supported. If you are using a new openapi feature or pattern, verify that the model will be generated as expected.
17
+
16
18
  ### All
17
19
  ```
18
20
  exe/generator generate
@@ -5,12 +5,7 @@ module Cocina
5
5
  # Class for generating from an openapi schema
6
6
  class Schema < SchemaBase
7
7
  def schema_properties
8
- @schema_properties ||= schema_doc.properties.map do |key, properties_doc|
9
- property_class_for(properties_doc).new(properties_doc,
10
- key: key,
11
- required: schema_doc.requires?(properties_doc),
12
- parent: self)
13
- end
8
+ @schema_properties ||= (properties + all_of_properties).uniq(&:key)
14
9
  end
15
10
 
16
11
  def generate
@@ -54,7 +49,7 @@ module Cocina
54
49
 
55
50
  def types
56
51
  type_properties_doc = schema_doc.properties['type']
57
- return '' if type_properties_doc.nil?
52
+ return '' if type_properties_doc.nil? || type_properties_doc.enum.nil?
58
53
 
59
54
  types_list = type_properties_doc.enum.map { |item| "'#{item}'" }.join(",\n ")
60
55
 
@@ -70,7 +65,7 @@ module Cocina
70
65
 
71
66
  <<~RUBY
72
67
  def self.new(attributes = default_attributes, safe = false, validate = true, &block)
73
- Validator.validate(self, attributes.with_indifferent_access) if validate
68
+ Validator.validate(self, attributes.with_indifferent_access) if validate && name
74
69
  super(attributes, safe, &block)
75
70
  end
76
71
  RUBY
@@ -79,6 +74,32 @@ module Cocina
79
74
  def validatable?
80
75
  !schema_doc.node_context.document.paths["/validate/#{schema_doc.name}"].nil?
81
76
  end
77
+
78
+ def properties
79
+ schema_properties_for(schema_doc)
80
+ end
81
+
82
+ def all_of_properties
83
+ all_of_properties_for(schema_doc)
84
+ end
85
+
86
+ def all_of_properties_for(doc)
87
+ return [] if doc.all_of.nil?
88
+
89
+ doc.all_of.map do |all_of_schema|
90
+ # All of for this + recurse
91
+ schema_properties_for(all_of_schema) + all_of_properties_for(all_of_schema)
92
+ end.flatten
93
+ end
94
+
95
+ def schema_properties_for(doc)
96
+ doc.properties.map do |key, properties_doc|
97
+ property_class_for(properties_doc).new(properties_doc,
98
+ key: key,
99
+ required: doc.requires?(properties_doc),
100
+ parent: self)
101
+ end
102
+ end
82
103
  end
83
104
  end
84
105
  end
@@ -5,7 +5,7 @@ module Cocina
5
5
  # Class for generating from an openapi array
6
6
  class SchemaArray < SchemaBase
7
7
  def generate
8
- "attribute :#{name.camelize(:lower)}, Types::Strict::Array.of(#{schema_doc.items.name})#{omittable}"
8
+ "attribute :#{name.camelize(:lower)}, Types::Strict::Array.of(#{array_of_type})#{omittable}"
9
9
  end
10
10
 
11
11
  def omittable
@@ -15,6 +15,10 @@ module Cocina
15
15
  '.meta(omittable: true)'
16
16
  end
17
17
  end
18
+
19
+ def array_of_type
20
+ schema_doc.items.name || "Types::#{dry_datatype(schema_doc.items)}"
21
+ end
18
22
  end
19
23
  end
20
24
  end
@@ -44,6 +44,28 @@ module Cocina
44
44
 
45
45
  "# example: #{schema_doc.example}\n"
46
46
  end
47
+
48
+ def dry_datatype(doc)
49
+ case doc.type
50
+ when 'integer'
51
+ 'Strict::Integer'
52
+ when 'string'
53
+ string_dry_datatype(doc)
54
+ when 'boolean'
55
+ 'Strict::Bool'
56
+ else
57
+ raise "#{schema_doc.type} not supported"
58
+ end
59
+ end
60
+
61
+ def string_dry_datatype(doc)
62
+ case doc.format
63
+ when 'date-time'
64
+ 'Params::DateTime'
65
+ else
66
+ 'Strict::String'
67
+ end
68
+ end
47
69
  end
48
70
  end
49
71
  end
@@ -6,34 +6,12 @@ module Cocina
6
6
  class SchemaValue < SchemaBase
7
7
  # rubocop:disable Metrics/LineLength
8
8
  def generate
9
- "#{description}#{example}attribute :#{name.camelize(:lower)}, Types::#{dry_datatype}#{default}#{enum}#{omittable}"
9
+ "#{description}#{example}attribute :#{name.camelize(:lower)}, Types::#{dry_datatype(schema_doc)}#{default}#{enum}#{omittable}"
10
10
  end
11
11
  # rubocop:enable Metrics/LineLength
12
12
 
13
13
  private
14
14
 
15
- def dry_datatype
16
- case schema_doc.type
17
- when 'integer'
18
- 'Strict::Integer'
19
- when 'string'
20
- string_dry_datatype
21
- when 'boolean'
22
- 'Strict::Bool'
23
- else
24
- raise "#{schema_doc.type} not supported"
25
- end
26
- end
27
-
28
- def string_dry_datatype
29
- case schema_doc.format
30
- when 'date-time'
31
- 'Params::DateTime'
32
- else
33
- 'Strict::String'
34
- end
35
- end
36
-
37
15
  def enum
38
16
  return '' unless schema_doc.enum
39
17
 
@@ -78,7 +78,7 @@ module Cocina
78
78
  else
79
79
  raise UnknownTypeError, "Unknown type: '#{dyn.fetch('type')}'"
80
80
  end
81
- clazz.new(dyn, validate: validate)
81
+ clazz.new(dyn, false, validate)
82
82
  end
83
83
 
84
84
  # @param [Hash] dyn a ruby hash representation of the JSON serialization of a request for a Collection or DRO
@@ -98,7 +98,7 @@ module Cocina
98
98
  else
99
99
  raise UnknownTypeError, "Unknown type: '#{dyn.fetch('type')}'"
100
100
  end
101
- clazz.new(dyn, validate: validate)
101
+ clazz.new(dyn, false, validate)
102
102
  end
103
103
  end
104
104
  end
@@ -17,7 +17,7 @@ module Cocina
17
17
  attribute :description, Description.optional.meta(omittable: true)
18
18
 
19
19
  def self.new(attributes = default_attributes, safe = false, validate = true, &block)
20
- Validator.validate(self, attributes.with_indifferent_access) if validate
20
+ Validator.validate(self, attributes.with_indifferent_access) if validate && name
21
21
  super(attributes, safe, &block)
22
22
  end
23
23
  end
@@ -0,0 +1,9 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Cocina
4
+ module Models
5
+ class AppliesTo < Struct
6
+ attribute :appliesTo, Types::Strict::Array.of(DescriptiveBasicValue).meta(omittable: true)
7
+ end
8
+ end
9
+ end
@@ -26,7 +26,7 @@ module Cocina
26
26
  attribute :identification, CollectionIdentification.optional.meta(omittable: true)
27
27
 
28
28
  def self.new(attributes = default_attributes, safe = false, validate = true, &block)
29
- Validator.validate(self, attributes.with_indifferent_access) if validate
29
+ Validator.validate(self, attributes.with_indifferent_access) if validate && name
30
30
  super(attributes, safe, &block)
31
31
  end
32
32
  end
@@ -0,0 +1,14 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Cocina
4
+ module Models
5
+ class Contributor < Struct
6
+ attribute :name, Types::Strict::Array.of(DescriptiveValue).meta(omittable: true)
7
+ # Entity type of the contributor (person, organization, etc.).
8
+ attribute :type, Types::Strict::String.meta(omittable: true)
9
+ # Status of the contributor relative to other parallel contributors.
10
+ attribute :status, Types::Strict::String.meta(omittable: true)
11
+ attribute :role, Types::Strict::Array.of(DescriptiveValue).meta(omittable: true)
12
+ end
13
+ end
14
+ end
@@ -3,7 +3,23 @@
3
3
  module Cocina
4
4
  module Models
5
5
  class Description < Struct
6
- attribute :title, Types::Strict::Array.of(Title).default([].freeze)
6
+ attribute :title, Types::Strict::Array.of(DescriptiveValueRequired).default([].freeze)
7
+ attribute :contributor, Types::Strict::Array.of(Contributor).meta(omittable: true)
8
+ attribute :event, Types::Strict::Array.of(Event).meta(omittable: true)
9
+ attribute :form, Types::Strict::Array.of(DescriptiveValue).meta(omittable: true)
10
+ attribute :language, Types::Strict::Array.of(DescriptiveValue).meta(omittable: true)
11
+ attribute :note, Types::Strict::Array.of(DescriptiveValue).meta(omittable: true)
12
+ attribute :identifier, Types::Strict::Array.of(DescriptiveValue).meta(omittable: true)
13
+ # Stanford persistent URL associated with the resource.
14
+ attribute :purl, Types::Strict::String.meta(omittable: true)
15
+ attribute :url, Types::Strict::Array.of(DescriptiveValue).meta(omittable: true)
16
+ attribute :marcEncodedData, Types::Strict::Array.of(DescriptiveValue).meta(omittable: true)
17
+ attribute :adminMetadata, DescriptiveAdminMetadata.optional.meta(omittable: true)
18
+
19
+ def self.new(attributes = default_attributes, safe = false, validate = true, &block)
20
+ Validator.validate(self, attributes.with_indifferent_access) if validate && name
21
+ super(attributes, safe, &block)
22
+ end
7
23
  end
8
24
  end
9
25
  end
@@ -0,0 +1,12 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Cocina
4
+ module Models
5
+ class DescriptiveAdminMetadata < Struct
6
+ attribute :contributor, Types::Strict::Array.of(Contributor).meta(omittable: true)
7
+ attribute :event, Types::Strict::Array.of(Event).meta(omittable: true)
8
+ attribute :language, Types::Strict::Array.of(DescriptiveValue).meta(omittable: true)
9
+ attribute :note, Types::Strict::Array.of(DescriptiveValue).meta(omittable: true)
10
+ end
11
+ end
12
+ end
@@ -0,0 +1,21 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Cocina
4
+ module Models
5
+ class DescriptiveBasicValue < Struct
6
+ # String value of the descriptive element.
7
+ attribute :value, Types::Strict::String.meta(omittable: true)
8
+ # Type of value provided by the descriptive element.
9
+ attribute :type, Types::Strict::String.meta(omittable: true)
10
+ # Status of the descriptive element relative to other instances of the element.
11
+ attribute :status, Types::Strict::String.meta(omittable: true)
12
+ # Code value of the descriptive element.
13
+ attribute :code, Types::Strict::String.meta(omittable: true)
14
+ # URI value of the descriptive element.
15
+ attribute :uri, Types::Strict::String.meta(omittable: true)
16
+ attribute :standard, Types::Strict::Array.of(Types::Strict::String).meta(omittable: true)
17
+ attribute :encoding, Types::Strict::Array.of(Types::Strict::String).meta(omittable: true)
18
+ attribute :source, Source.optional.meta(omittable: true)
19
+ end
20
+ end
21
+ end
@@ -0,0 +1,9 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Cocina
4
+ module Models
5
+ class DescriptiveStructuredValue < Struct
6
+ attribute :structuredValue, Types::Strict::Array.of(DescriptiveBasicValue).meta(omittable: true)
7
+ end
8
+ end
9
+ end
@@ -0,0 +1,23 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Cocina
4
+ module Models
5
+ class DescriptiveValue < Struct
6
+ # String value of the descriptive element.
7
+ attribute :value, Types::Strict::String.meta(omittable: true)
8
+ # Type of value provided by the descriptive element.
9
+ attribute :type, Types::Strict::String.meta(omittable: true)
10
+ # Status of the descriptive element relative to other instances of the element.
11
+ attribute :status, Types::Strict::String.meta(omittable: true)
12
+ # Code value of the descriptive element.
13
+ attribute :code, Types::Strict::String.meta(omittable: true)
14
+ # URI value of the descriptive element.
15
+ attribute :uri, Types::Strict::String.meta(omittable: true)
16
+ attribute :standard, Types::Strict::Array.of(Types::Strict::String).meta(omittable: true)
17
+ attribute :encoding, Types::Strict::Array.of(Types::Strict::String).meta(omittable: true)
18
+ attribute :source, Source.optional.meta(omittable: true)
19
+ attribute :structuredValue, Types::Strict::Array.of(DescriptiveBasicValue).meta(omittable: true)
20
+ attribute :appliesTo, Types::Strict::Array.of(DescriptiveBasicValue).meta(omittable: true)
21
+ end
22
+ end
23
+ end
@@ -0,0 +1,23 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Cocina
4
+ module Models
5
+ class DescriptiveValueRequired < Struct
6
+ # String value of the descriptive element.
7
+ attribute :value, Types::Strict::String.meta(omittable: true)
8
+ # Type of value provided by the descriptive element.
9
+ attribute :type, Types::Strict::String.meta(omittable: true)
10
+ # Status of the descriptive element relative to other instances of the element.
11
+ attribute :status, Types::Strict::String.meta(omittable: true)
12
+ # Code value of the descriptive element.
13
+ attribute :code, Types::Strict::String.meta(omittable: true)
14
+ # URI value of the descriptive element.
15
+ attribute :uri, Types::Strict::String.meta(omittable: true)
16
+ attribute :standard, Types::Strict::Array.of(Types::Strict::String).meta(omittable: true)
17
+ attribute :encoding, Types::Strict::Array.of(Types::Strict::String).meta(omittable: true)
18
+ attribute :source, Source.optional.meta(omittable: true)
19
+ attribute :structuredValue, Types::Strict::Array.of(DescriptiveBasicValue).meta(omittable: true)
20
+ attribute :appliesTo, Types::Strict::Array.of(DescriptiveBasicValue).meta(omittable: true)
21
+ end
22
+ end
23
+ end
@@ -38,7 +38,7 @@ module Cocina
38
38
  attribute :geographic, Geographic.optional.meta(omittable: true)
39
39
 
40
40
  def self.new(attributes = default_attributes, safe = false, validate = true, &block)
41
- Validator.validate(self, attributes.with_indifferent_access) if validate
41
+ Validator.validate(self, attributes.with_indifferent_access) if validate && name
42
42
  super(attributes, safe, &block)
43
43
  end
44
44
  end
@@ -0,0 +1,15 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Cocina
4
+ module Models
5
+ class Event < Struct
6
+ # Description of the event (creation, publication, etc.).
7
+ attribute :type, Types::Strict::String.meta(omittable: true)
8
+ attribute :date, Types::Strict::Array.of(DescriptiveValue).meta(omittable: true)
9
+ attribute :contributor, Types::Strict::Array.of(Contributor).meta(omittable: true)
10
+ attribute :location, Types::Strict::Array.of(DescriptiveValue).meta(omittable: true)
11
+ attribute :note, Types::Strict::Array.of(DescriptiveValue).meta(omittable: true)
12
+ attribute :structuredValue, Types::Strict::Array.of(DescriptiveBasicValue).meta(omittable: true)
13
+ end
14
+ end
15
+ end
@@ -15,7 +15,7 @@ module Cocina
15
15
  attribute :description, Description.optional.meta(omittable: true)
16
16
 
17
17
  def self.new(attributes = default_attributes, safe = false, validate = true, &block)
18
- Validator.validate(self, attributes.with_indifferent_access) if validate
18
+ Validator.validate(self, attributes.with_indifferent_access) if validate && name
19
19
  super(attributes, safe, &block)
20
20
  end
21
21
  end
@@ -21,7 +21,7 @@ module Cocina
21
21
  attribute :identification, CollectionIdentification.optional.meta(omittable: true)
22
22
 
23
23
  def self.new(attributes = default_attributes, safe = false, validate = true, &block)
24
- Validator.validate(self, attributes.with_indifferent_access) if validate
24
+ Validator.validate(self, attributes.with_indifferent_access) if validate && name
25
25
  super(attributes, safe, &block)
26
26
  end
27
27
  end
@@ -33,7 +33,7 @@ module Cocina
33
33
  attribute :geographic, Geographic.optional.meta(omittable: true)
34
34
 
35
35
  def self.new(attributes = default_attributes, safe = false, validate = true, &block)
36
- Validator.validate(self, attributes.with_indifferent_access) if validate
36
+ Validator.validate(self, attributes.with_indifferent_access) if validate && name
37
37
  super(attributes, safe, &block)
38
38
  end
39
39
  end
@@ -0,0 +1,14 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Cocina
4
+ module Models
5
+ class Source < Struct
6
+ # Code representing the value source.
7
+ attribute :code, Types::Strict::String.meta(omittable: true)
8
+ # URI for the value source.
9
+ attribute :uri, Types::Strict::String.meta(omittable: true)
10
+ # String describing the value source.
11
+ attribute :value, Types::Strict::String.meta(omittable: true)
12
+ end
13
+ end
14
+ end
@@ -4,12 +4,6 @@ module Cocina
4
4
  module Models
5
5
  # Perform validation against openapi
6
6
  class Validator
7
- # rubocop:disable Style/ClassVars
8
- def self.root
9
- @@root ||= OpenAPIParser.parse(YAML.load_file('openapi.yml'))
10
- end
11
- # rubocop:enable Style/ClassVars
12
-
13
7
  def self.validate(clazz, attributes)
14
8
  method_name = clazz.name.split('::').last
15
9
  request_operation = root.request_operation(:post, "/validate/#{method_name}")
@@ -17,6 +11,18 @@ module Cocina
17
11
  rescue OpenAPIParser::OpenAPIError => e
18
12
  raise ValidationError, e.message
19
13
  end
14
+
15
+ # rubocop:disable Style/ClassVars
16
+ def self.root
17
+ @@root ||= OpenAPIParser.parse(YAML.load_file(openapi_path))
18
+ end
19
+ # rubocop:enable Style/ClassVars
20
+ private_class_method :root
21
+
22
+ def self.openapi_path
23
+ ::File.expand_path('../../../openapi.yml', __dir__)
24
+ end
25
+ private_class_method :openapi_path
20
26
  end
21
27
  end
22
28
  end
@@ -2,6 +2,6 @@
2
2
 
3
3
  module Cocina
4
4
  module Models
5
- VERSION = '0.30.0'
5
+ VERSION = '0.31.0'
6
6
  end
7
7
  end
@@ -79,7 +79,18 @@ paths:
79
79
  responses:
80
80
  '200':
81
81
  description: noop
82
-
82
+ /validate/Description:
83
+ post:
84
+ summary: Validate a Description
85
+ requestBody:
86
+ required: true
87
+ content:
88
+ application/json:
89
+ schema:
90
+ $ref: '#/components/schemas/Description'
91
+ responses:
92
+ '200':
93
+ description: noop
83
94
  components:
84
95
  schemas:
85
96
  Access:
@@ -144,6 +155,15 @@ components:
144
155
  type: string
145
156
  hasAdminPolicy:
146
157
  type: string
158
+ AppliesTo:
159
+ description: Property model for indicating the parts, aspects, or versions of the resource to which a
160
+ descriptive element is applicable.
161
+ type: object
162
+ properties:
163
+ appliesTo:
164
+ type: array
165
+ items:
166
+ $ref: "#/components/schemas/DescriptiveBasicValue"
147
167
  CatalogLink:
148
168
  type: object
149
169
  required:
@@ -201,14 +221,164 @@ components:
201
221
  type: array
202
222
  items:
203
223
  $ref: '#/components/schemas/CatalogLink'
224
+ Contributor:
225
+ description: Property model for describing agents contributing in some way to
226
+ the creation and history of the resource
227
+ type: object
228
+ properties:
229
+ name:
230
+ description: Names associated with a contributor.
231
+ type: array
232
+ items:
233
+ $ref: "#/components/schemas/DescriptiveValue"
234
+ type:
235
+ description: Entity type of the contributor (person, organization, etc.).
236
+ type: string
237
+ status:
238
+ description: Status of the contributor relative to other parallel contributors.
239
+ type: string
240
+ role:
241
+ description: Relationships of the contributor to the resource or to an event
242
+ in its history.
243
+ type: array
244
+ items:
245
+ $ref: "#/components/schemas/DescriptiveValue"
246
+ DescriptiveAdminMetadata:
247
+ description: Information about this description of the resource.
248
+ type: object
249
+ properties:
250
+ contributor:
251
+ type: array
252
+ items:
253
+ $ref: "#/components/schemas/Contributor"
254
+ event:
255
+ type: array
256
+ items:
257
+ $ref: "#/components/schemas/Event"
258
+ language:
259
+ type: array
260
+ items:
261
+ $ref: "#/components/schemas/DescriptiveValue"
262
+ note:
263
+ type: array
264
+ items:
265
+ $ref: "#/components/schemas/DescriptiveValue"
266
+ DescriptiveBasicValue:
267
+ description: Value model for descriptive elements without recursive properties.
268
+ type: object
269
+ properties:
270
+ value:
271
+ description: String value of the descriptive element.
272
+ type: string
273
+ type:
274
+ description: Type of value provided by the descriptive element.
275
+ type: string
276
+ status:
277
+ description: Status of the descriptive element relative to other instances
278
+ of the element.
279
+ type: string
280
+ code:
281
+ description: Code value of the descriptive element.
282
+ type: string
283
+ uri:
284
+ description: URI value of the descriptive element.
285
+ type: string
286
+ format: uri
287
+ standard:
288
+ description: Descriptive or content standard to which the value conforms.
289
+ type: array
290
+ items:
291
+ type: string
292
+ encoding:
293
+ description: Encoding schema, standard, or syntax to which the value conforms.
294
+ type: array
295
+ items:
296
+ type: string
297
+ source:
298
+ $ref: "#/components/schemas/Source"
299
+ DescriptiveStructuredValue:
300
+ description: Value model for descriptive elements structured as typed values.
301
+ type: object
302
+ properties:
303
+ structuredValue:
304
+ type: array
305
+ items:
306
+ $ref: "#/components/schemas/DescriptiveBasicValue"
307
+ DescriptiveValue:
308
+ description: Default value model for descriptive elements.
309
+ type: object
310
+ allOf:
311
+ - $ref: "#/components/schemas/DescriptiveBasicValue"
312
+ - $ref: "#/components/schemas/DescriptiveStructuredValue"
313
+ - $ref: "#/components/schemas/AppliesTo"
314
+ DescriptiveValueRequired:
315
+ type: object
316
+ allOf:
317
+ - $ref: "#/components/schemas/DescriptiveValue"
318
+ - anyOf:
319
+ - type: object
320
+ required:
321
+ - value
322
+ - type: object
323
+ - required:
324
+ - structuredValue
204
325
  Description:
205
- description: Descriptive metadata
206
326
  type: object
207
327
  properties:
208
328
  title:
329
+ description: Titles of the resource.
330
+ type: array
331
+ minItems: 1
332
+ items:
333
+ $ref: "#/components/schemas/DescriptiveValueRequired"
334
+ contributor:
335
+ description: Agents contributing in some way to the creation and history of the
336
+ resource.
337
+ type: array
338
+ items:
339
+ $ref: "#/components/schemas/Contributor"
340
+ event:
341
+ description: Events in the history of the resource.
342
+ type: array
343
+ items:
344
+ $ref: "#/components/schemas/Event"
345
+ form:
346
+ description: Characteristics of the resource's physical, digital, and intellectual
347
+ form and genre.
348
+ type: array
349
+ items:
350
+ $ref: "#/components/schemas/DescriptiveValue"
351
+ language:
352
+ description: Languages, scripts, and notations used in all or part of a resource.
353
+ type: array
354
+ items:
355
+ $ref: "#/components/schemas/DescriptiveValue"
356
+ note:
357
+ description: Additional information relevant to a resource.
358
+ type: array
359
+ items:
360
+ $ref: "#/components/schemas/DescriptiveValue"
361
+ identifier:
362
+ description: Unique strings associated with the resource.
363
+ type: array
364
+ items:
365
+ $ref: "#/components/schemas/DescriptiveValue"
366
+ purl:
367
+ description: Stanford persistent URL associated with the resource.
368
+ type: string
369
+ format: uri
370
+ url:
371
+ description: URLs where the resource may be accessed in full or part.
372
+ type: array
373
+ items:
374
+ $ref: "#/components/schemas/DescriptiveValue"
375
+ marcEncodedData:
376
+ description: Data about the resource represented in MARC fixed fields and codes.
209
377
  type: array
210
378
  items:
211
- $ref: '#/components/schemas/Title'
379
+ $ref: "#/components/schemas/DescriptiveValue"
380
+ adminMetadata:
381
+ $ref: "#/components/schemas/DescriptiveAdminMetadata"
212
382
  required:
213
383
  - title
214
384
  DRO:
@@ -330,6 +500,35 @@ components:
330
500
  required:
331
501
  - releaseDate
332
502
  - access
503
+ Event:
504
+ description: Property model for describing events in the history of the resource.
505
+ type: object
506
+ properties:
507
+ type:
508
+ description: Description of the event (creation, publication, etc.).
509
+ type: string
510
+ date:
511
+ description: Dates associated with the event.
512
+ type: array
513
+ items:
514
+ $ref: "#/components/schemas/DescriptiveValue"
515
+ contributor:
516
+ description: Contributors associated with the event.
517
+ type: array
518
+ items:
519
+ $ref: "#/components/schemas/Contributor"
520
+ location:
521
+ description: Locations associated with the event.
522
+ type: array
523
+ items:
524
+ $ref: "#/components/schemas/DescriptiveValue"
525
+ note:
526
+ description: Other information about the event.
527
+ type: array
528
+ items:
529
+ $ref: "#/components/schemas/DescriptiveValue"
530
+ allOf:
531
+ - $ref: "#/components/schemas/DescriptiveStructuredValue"
333
532
  File:
334
533
  description: Binaries that are the basis of what our domain manages. Binaries here do not include metadata files generated for the domain's own management purposes.
335
534
  type: object
@@ -680,16 +879,18 @@ components:
680
879
  enum:
681
880
  - right-to-left
682
881
  - left-to-right
683
- Title:
684
- description: The title of the object.
882
+ Source:
883
+ description: Property model for indicating the vocabulary, authority, or other
884
+ origin for a term, code, or identifier.
685
885
  type: object
686
886
  properties:
687
- primary:
688
- description: Is this the primary title for the object
689
- type: boolean
690
- titleFull:
691
- description: The full title for the object
887
+ code:
888
+ description: Code representing the value source.
889
+ type: string
890
+ uri:
891
+ description: URI for the value source.
892
+ type: string
893
+ format: uri
894
+ value:
895
+ description: String describing the value source.
692
896
  type: string
693
- required:
694
- - primary
695
- - titleFull
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.30.0
4
+ version: 0.31.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-03-23 00:00:00.000000000 Z
11
+ date: 2020-03-24 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: activesupport
@@ -260,15 +260,23 @@ files:
260
260
  - lib/cocina/models/admin_policy.rb
261
261
  - lib/cocina/models/admin_policy_administrative.rb
262
262
  - lib/cocina/models/administrative.rb
263
+ - lib/cocina/models/applies_to.rb
263
264
  - lib/cocina/models/catalog_link.rb
264
265
  - lib/cocina/models/checkable.rb
265
266
  - lib/cocina/models/collection.rb
266
267
  - lib/cocina/models/collection_identification.rb
268
+ - lib/cocina/models/contributor.rb
267
269
  - lib/cocina/models/description.rb
270
+ - lib/cocina/models/descriptive_admin_metadata.rb
271
+ - lib/cocina/models/descriptive_basic_value.rb
272
+ - lib/cocina/models/descriptive_structured_value.rb
273
+ - lib/cocina/models/descriptive_value.rb
274
+ - lib/cocina/models/descriptive_value_required.rb
268
275
  - lib/cocina/models/dro.rb
269
276
  - lib/cocina/models/dro_access.rb
270
277
  - lib/cocina/models/dro_structural.rb
271
278
  - lib/cocina/models/embargo.rb
279
+ - lib/cocina/models/event.rb
272
280
  - lib/cocina/models/file.rb
273
281
  - lib/cocina/models/file_administrative.rb
274
282
  - lib/cocina/models/file_set.rb
@@ -286,7 +294,7 @@ files:
286
294
  - lib/cocina/models/request_file_set.rb
287
295
  - lib/cocina/models/request_file_set_structural.rb
288
296
  - lib/cocina/models/sequence.rb
289
- - lib/cocina/models/title.rb
297
+ - lib/cocina/models/source.rb
290
298
  - lib/cocina/models/validator.rb
291
299
  - lib/cocina/models/version.rb
292
300
  - lib/cocina/models/vocab.rb
@@ -1,12 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- module Cocina
4
- module Models
5
- class Title < Struct
6
- # Is this the primary title for the object
7
- attribute :primary, Types::Strict::Bool.default(false)
8
- # The full title for the object
9
- attribute :titleFull, Types::Strict::String
10
- end
11
- end
12
- end