cocina-models 0.79.0 → 0.80.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/docs/description_types.md +1 -0
- data/lib/cocina/generator/schema.rb +2 -2
- data/lib/cocina/generator/schema_base.rb +10 -0
- data/lib/cocina/generator/schema_value.rb +0 -4
- data/lib/cocina/models/access_role.rb +1 -0
- data/lib/cocina/models/access_role_member.rb +1 -0
- data/lib/cocina/models/admin_policy_access_template.rb +1 -0
- data/lib/cocina/models/admin_policy_administrative.rb +1 -0
- data/lib/cocina/models/admin_policy_with_metadata.rb +1 -0
- data/lib/cocina/models/applies_to.rb +1 -0
- data/lib/cocina/models/collection.rb +1 -0
- data/lib/cocina/models/collection_access.rb +1 -0
- data/lib/cocina/models/collection_with_metadata.rb +1 -0
- data/lib/cocina/models/contributor.rb +1 -0
- data/lib/cocina/models/descriptive_access_metadata.rb +1 -0
- data/lib/cocina/models/descriptive_admin_metadata.rb +1 -0
- data/lib/cocina/models/descriptive_basic_value.rb +1 -0
- data/lib/cocina/models/descriptive_geographic_metadata.rb +1 -0
- data/lib/cocina/models/descriptive_grouped_value.rb +1 -0
- data/lib/cocina/models/descriptive_parallel_contributor.rb +2 -0
- data/lib/cocina/models/descriptive_parallel_event.rb +1 -0
- data/lib/cocina/models/descriptive_parallel_value.rb +1 -0
- data/lib/cocina/models/descriptive_structured_value.rb +1 -0
- data/lib/cocina/models/descriptive_value.rb +1 -0
- data/lib/cocina/models/descriptive_value_language.rb +1 -0
- data/lib/cocina/models/dro.rb +1 -0
- data/lib/cocina/models/dro_structural.rb +1 -0
- data/lib/cocina/models/dro_with_metadata.rb +1 -0
- data/lib/cocina/models/event.rb +1 -0
- data/lib/cocina/models/file.rb +1 -0
- data/lib/cocina/models/file_access.rb +1 -0
- data/lib/cocina/models/file_set.rb +1 -0
- data/lib/cocina/models/file_set_structural.rb +1 -0
- data/lib/cocina/models/geographic.rb +1 -0
- data/lib/cocina/models/language.rb +1 -0
- data/lib/cocina/models/mapping/from_mods/name_builder.rb +15 -10
- data/lib/cocina/models/mapping/normalizers/mods/name_normalizer.rb +27 -2
- data/lib/cocina/models/mapping/to_mods/subject.rb +2 -2
- data/lib/cocina/models/message_digest.rb +1 -0
- data/lib/cocina/models/object_metadata.rb +1 -0
- data/lib/cocina/models/presentation.rb +1 -0
- data/lib/cocina/models/related_resource.rb +1 -0
- data/lib/cocina/models/release_tag.rb +1 -0
- data/lib/cocina/models/request_admin_policy.rb +1 -0
- data/lib/cocina/models/request_collection.rb +1 -0
- data/lib/cocina/models/request_description.rb +1 -0
- data/lib/cocina/models/request_dro.rb +1 -0
- data/lib/cocina/models/request_dro_structural.rb +1 -0
- data/lib/cocina/models/request_file_set_structural.rb +1 -0
- data/lib/cocina/models/request_identification.rb +1 -0
- data/lib/cocina/models/sequence.rb +1 -0
- data/lib/cocina/models/source.rb +1 -0
- data/lib/cocina/models/standard.rb +1 -0
- data/lib/cocina/models/version.rb +1 -1
- data/openapi.yml +1 -0
- metadata +2 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 5c78843bdc4b3ba3ec0ea9e2e8fa569fe7979de0e5d1a52fc4923103ed20de36
|
4
|
+
data.tar.gz: b3e317a0154e15973e9a0e57aab07d0d91702a97a31889963d4df2c26339a6d4
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 2fa6986b659b6474ed9ac476237c6da8ff75487bb5c7ab61b33a0226af95c44b22f14210524f258bd75bf826ea141dcc3bb88ce31e2a85b6f4590ec1ea353eec
|
7
|
+
data.tar.gz: e41c8c60d4eafe62b0f4025213f73aa7629284a0e5f73e93d7b356204d075635a3ea7da3af1aaf9557de487e1eee5236c3eec23a92a04d17fc71ecec14e50c48
|
data/docs/description_types.md
CHANGED
@@ -41,6 +41,12 @@ module Cocina
|
|
41
41
|
"# #{schema_doc.description}\n"
|
42
42
|
end
|
43
43
|
|
44
|
+
def deprecation
|
45
|
+
return '' unless schema_doc.deprecated?
|
46
|
+
|
47
|
+
"# DEPRECATED\n"
|
48
|
+
end
|
49
|
+
|
44
50
|
def example
|
45
51
|
return '' unless schema_doc.example
|
46
52
|
|
@@ -82,6 +88,10 @@ module Cocina
|
|
82
88
|
'Strict::String'
|
83
89
|
end
|
84
90
|
end
|
91
|
+
|
92
|
+
def preamble
|
93
|
+
"#{deprecation}#{description}#{example}#{relaxed_comment}"
|
94
|
+
end
|
85
95
|
end
|
86
96
|
end
|
87
97
|
end
|
@@ -2,6 +2,7 @@
|
|
2
2
|
|
3
3
|
module Cocina
|
4
4
|
module Models
|
5
|
+
# Access role conferred by an AdminPolicy to objects within it. (used by Argo)
|
5
6
|
class AccessRole < Struct
|
6
7
|
# Name of role
|
7
8
|
attribute :name, Types::Strict::String.enum('dor-apo-depositor', 'dor-apo-manager', 'dor-apo-viewer', 'sdr-administrator', 'sdr-viewer', 'hydrus-collection-creator', 'hydrus-collection-manager', 'hydrus-collection-depositor', 'hydrus-collection-item-depositor', 'hydrus-collection-reviewer', 'hydrus-collection-viewer')
|
@@ -2,6 +2,7 @@
|
|
2
2
|
|
3
3
|
module Cocina
|
4
4
|
module Models
|
5
|
+
# Provides the template of access settings that is copied to the items goverend by an AdminPolicy. This is almost the same as DROAccess, but it provides no defaults and has no embargo.
|
5
6
|
class AdminPolicyAccessTemplate < Struct
|
6
7
|
attribute? :view, Types::Strict::String.enum('world', 'stanford', 'location-based', 'citation-only', 'dark')
|
7
8
|
# Available for controlled digital lending.
|
@@ -2,6 +2,7 @@
|
|
2
2
|
|
3
3
|
module Cocina
|
4
4
|
module Models
|
5
|
+
# Administrative properties for an AdminPolicy
|
5
6
|
class AdminPolicyAdministrative < Struct
|
6
7
|
attribute(:accessTemplate, AdminPolicyAccessTemplate.default { AdminPolicyAccessTemplate.new })
|
7
8
|
attribute :registrationWorkflow, Types::Strict::Array.of(Types::Strict::String).default([].freeze)
|
@@ -2,6 +2,7 @@
|
|
2
2
|
|
3
3
|
module Cocina
|
4
4
|
module Models
|
5
|
+
# Property model for indicating the parts, aspects, or versions of the resource to which a descriptive element is applicable.
|
5
6
|
class AppliesTo < Struct
|
6
7
|
attribute :appliesTo, Types::Strict::Array.of(DescriptiveBasicValue).default([].freeze)
|
7
8
|
end
|
@@ -2,6 +2,7 @@
|
|
2
2
|
|
3
3
|
module Cocina
|
4
4
|
module Models
|
5
|
+
# Property model for describing agents contributing in some way to the creation and history of the resource.
|
5
6
|
class Contributor < Struct
|
6
7
|
attribute :name, Types::Strict::Array.of(DescriptiveValue).default([].freeze)
|
7
8
|
# Entity type of the contributor (person, organization, etc.). See https://github.com/sul-dlss/cocina-models/blob/main/docs/description_types.md for valid types.
|
@@ -2,6 +2,7 @@
|
|
2
2
|
|
3
3
|
module Cocina
|
4
4
|
module Models
|
5
|
+
# Information about how to access digital and physical versions of the object.
|
5
6
|
class DescriptiveAccessMetadata < Struct
|
6
7
|
attribute :url, Types::Strict::Array.of(DescriptiveValue).default([].freeze)
|
7
8
|
attribute :physicalLocation, Types::Strict::Array.of(DescriptiveValue).default([].freeze)
|
@@ -2,6 +2,7 @@
|
|
2
2
|
|
3
3
|
module Cocina
|
4
4
|
module Models
|
5
|
+
# Information about this resource description.
|
5
6
|
class DescriptiveAdminMetadata < Struct
|
6
7
|
attribute :contributor, Types::Strict::Array.of(Contributor).default([].freeze)
|
7
8
|
attribute :event, Types::Strict::Array.of(Event).default([].freeze)
|
@@ -2,6 +2,7 @@
|
|
2
2
|
|
3
3
|
module Cocina
|
4
4
|
module Models
|
5
|
+
# Basic value model for descriptive elements. Can only have one of value, parallelValue, groupedValue, or structuredValue.
|
5
6
|
class DescriptiveBasicValue < Struct
|
6
7
|
attribute :structuredValue, Types::Strict::Array.of(DescriptiveValue).default([].freeze)
|
7
8
|
attribute :parallelValue, Types::Strict::Array.of(DescriptiveValue).default([].freeze)
|
@@ -2,6 +2,7 @@
|
|
2
2
|
|
3
3
|
module Cocina
|
4
4
|
module Models
|
5
|
+
# Value model for mods geographic extension metadata
|
5
6
|
class DescriptiveGeographicMetadata < Struct
|
6
7
|
attribute :form, Types::Strict::Array.of(DescriptiveValue).default([].freeze)
|
7
8
|
attribute :subject, Types::Strict::Array.of(DescriptiveValue).default([].freeze)
|
@@ -2,6 +2,8 @@
|
|
2
2
|
|
3
3
|
module Cocina
|
4
4
|
module Models
|
5
|
+
# DEPRECATED
|
6
|
+
# Value model for multiple representations of information about the same contributor (e.g. in different languages).
|
5
7
|
class DescriptiveParallelContributor < Struct
|
6
8
|
attribute :name, Types::Strict::Array.of(DescriptiveValue).default([].freeze)
|
7
9
|
# Entity type of the contributor (person, organization, etc.). See https://github.com/sul-dlss/cocina-models/blob/main/docs/description_types.md for valid types.
|
@@ -2,6 +2,7 @@
|
|
2
2
|
|
3
3
|
module Cocina
|
4
4
|
module Models
|
5
|
+
# Value model for multiple representations of information about the same event (e.g. in different languages).
|
5
6
|
class DescriptiveParallelEvent < Struct
|
6
7
|
attribute :structuredValue, Types::Strict::Array.of(DescriptiveValue).default([].freeze)
|
7
8
|
# Description of the event (creation, publication, etc.).
|
@@ -2,6 +2,7 @@
|
|
2
2
|
|
3
3
|
module Cocina
|
4
4
|
module Models
|
5
|
+
# Value model for multiple representations of the same information (e.g. in different languages).
|
5
6
|
class DescriptiveParallelValue < Struct
|
6
7
|
attribute :parallelValue, Types::Strict::Array.of(DescriptiveValue).default([].freeze)
|
7
8
|
end
|
@@ -2,6 +2,7 @@
|
|
2
2
|
|
3
3
|
module Cocina
|
4
4
|
module Models
|
5
|
+
# Default value model for descriptive elements.
|
5
6
|
class DescriptiveValue < Struct
|
6
7
|
attribute :structuredValue, Types::Strict::Array.of(DescriptiveValue).default([].freeze)
|
7
8
|
attribute :parallelValue, Types::Strict::Array.of(DescriptiveValue).default([].freeze)
|
data/lib/cocina/models/dro.rb
CHANGED
data/lib/cocina/models/event.rb
CHANGED
@@ -2,6 +2,7 @@
|
|
2
2
|
|
3
3
|
module Cocina
|
4
4
|
module Models
|
5
|
+
# Property model for describing events in the history of the resource.
|
5
6
|
class Event < Struct
|
6
7
|
attribute :structuredValue, Types::Strict::Array.of(DescriptiveValue).default([].freeze)
|
7
8
|
# Description of the event (creation, publication, etc.).
|
data/lib/cocina/models/file.rb
CHANGED
@@ -2,6 +2,7 @@
|
|
2
2
|
|
3
3
|
module Cocina
|
4
4
|
module Models
|
5
|
+
# Languages, scripts, symbolic systems, and notations used in all or part of a resource or its descriptive metadata.
|
5
6
|
class Language < Struct
|
6
7
|
attribute :appliesTo, Types::Strict::Array.of(DescriptiveBasicValue).default([].freeze)
|
7
8
|
# Code value of the descriptive element.
|
@@ -41,8 +41,8 @@ module Cocina
|
|
41
41
|
status: name_elements.filter_map { |name_element| name_element['usage'] }.first
|
42
42
|
}.compact
|
43
43
|
{ name: [names] }.tap do |attrs|
|
44
|
-
|
45
|
-
attrs[:
|
44
|
+
attrs[:role] = name_elements.flat_map { |name_node| build_roles(name_node) }.compact.uniq.presence
|
45
|
+
attrs[:note] = name_elements.flat_map { |name_node| build_affiliation_notes(name_node) }.compact.uniq.presence
|
46
46
|
end.compact
|
47
47
|
end
|
48
48
|
|
@@ -51,7 +51,7 @@ module Cocina
|
|
51
51
|
status: name_node['usage']
|
52
52
|
}.compact.merge(common_lang_script(name_node))
|
53
53
|
|
54
|
-
name_attrs = name_attrs.merge(common_name(name_node, name_attrs[:name]))
|
54
|
+
name_attrs = name_attrs.merge(common_name(name_node, name_attrs[:name], is_parallel: true))
|
55
55
|
name_parts = build_name_parts(name_node)
|
56
56
|
notifier.warn('Missing name/namePart element') if name_parts.all?(&:empty?)
|
57
57
|
name_parts.each { |name_part| name_attrs = name_part.merge(name_attrs) }
|
@@ -85,9 +85,9 @@ module Cocina
|
|
85
85
|
}.compact.merge(common_name(name_node, name_parts))
|
86
86
|
end
|
87
87
|
|
88
|
-
def common_name(name_node, name)
|
88
|
+
def common_name(name_node, name, is_parallel: false)
|
89
89
|
{
|
90
|
-
note: build_notes(name_node),
|
90
|
+
note: build_notes(name_node, is_parallel: is_parallel),
|
91
91
|
identifier: build_identifier(name_node)
|
92
92
|
}.tap do |attrs|
|
93
93
|
roles = build_roles(name_node)
|
@@ -224,12 +224,8 @@ module Cocina
|
|
224
224
|
end.presence
|
225
225
|
end
|
226
226
|
|
227
|
-
def build_notes(name_node)
|
227
|
+
def build_notes(name_node, is_parallel:)
|
228
228
|
[].tap do |parts|
|
229
|
-
name_node.xpath('mods:affiliation', mods: Description::DESC_METADATA_NS).each do |affiliation_node|
|
230
|
-
parts << { value: affiliation_node.text, type: 'affiliation' }
|
231
|
-
end
|
232
|
-
|
233
229
|
description = name_node.xpath('mods:description', mods: Description::DESC_METADATA_NS).first
|
234
230
|
if description
|
235
231
|
parts << if description.text == UNCITED_DESCRIPTION
|
@@ -238,9 +234,18 @@ module Cocina
|
|
238
234
|
{ value: description.text, type: 'description' }
|
239
235
|
end
|
240
236
|
end
|
237
|
+
parts.concat(build_affiliation_notes(name_node)) unless is_parallel
|
241
238
|
end.presence
|
242
239
|
end
|
243
240
|
|
241
|
+
def build_affiliation_notes(name_node)
|
242
|
+
[].tap do |parts|
|
243
|
+
name_node.xpath('mods:affiliation', mods: Description::DESC_METADATA_NS).each do |affiliation_node|
|
244
|
+
parts << { value: affiliation_node.text, type: 'affiliation' }
|
245
|
+
end
|
246
|
+
end
|
247
|
+
end
|
248
|
+
|
244
249
|
def build_roles(name_node)
|
245
250
|
role_nodes = name_node.xpath('mods:role', mods: Description::DESC_METADATA_NS)
|
246
251
|
role_nodes.filter_map { |role_node| role_for(role_node) }.presence
|
@@ -20,6 +20,7 @@ module Cocina
|
|
20
20
|
|
21
21
|
def normalize
|
22
22
|
normalize_parallel_name_role
|
23
|
+
normalize_parallel_affiliation_note
|
23
24
|
normalize_text_role_term
|
24
25
|
normalize_role_term
|
25
26
|
normalize_role # must be after normalize_role_term
|
@@ -35,10 +36,13 @@ module Cocina
|
|
35
36
|
|
36
37
|
attr_reader :ng_xml
|
37
38
|
|
39
|
+
def grouped_name_nodes
|
40
|
+
name_nodes = ng_xml.root.xpath('//mods:name[@altRepGroup]', mods: ModsNormalizer::MODS_NS)
|
41
|
+
name_nodes.group_by { |name_node| name_node['altRepGroup'] }.values.reject { |name_node_group| name_node_group.size == 1 }
|
42
|
+
end
|
43
|
+
|
38
44
|
def normalize_parallel_name_role
|
39
45
|
# For parallel names, all should have the same roles.
|
40
|
-
name_nodes = ng_xml.root.xpath('//mods:name[@altRepGroup]', mods: ModsNormalizer::MODS_NS)
|
41
|
-
grouped_name_nodes = name_nodes.group_by { |name_node| name_node['altRepGroup'] }.values.reject { |name_node_group| name_node_group.size == 1 }
|
42
46
|
grouped_name_nodes.each do |name_node_group|
|
43
47
|
name_node_with_role = name_node_group.find { |name_node| role_node_for(name_node) }
|
44
48
|
next unless name_node_with_role
|
@@ -58,6 +62,27 @@ module Cocina
|
|
58
62
|
name_node.xpath('mods:role', mods: ModsNormalizer::MODS_NS).first
|
59
63
|
end
|
60
64
|
|
65
|
+
def normalize_parallel_affiliation_note
|
66
|
+
# For parallel names, all should have the same affiliation.
|
67
|
+
grouped_name_nodes.each do |name_node_group|
|
68
|
+
name_node_with_affiliation = name_node_group.find { |name_node| affiliation_node_for(name_node) }
|
69
|
+
next unless name_node_with_affiliation
|
70
|
+
|
71
|
+
name_node_group.each do |name_node|
|
72
|
+
next if name_node == name_node_with_affiliation
|
73
|
+
|
74
|
+
existing_affiliation_node = affiliation_node_for(name_node)
|
75
|
+
existing_affiliation_node&.remove
|
76
|
+
|
77
|
+
name_node << affiliation_node_for(name_node_with_affiliation).dup
|
78
|
+
end
|
79
|
+
end
|
80
|
+
end
|
81
|
+
|
82
|
+
def affiliation_node_for(name_node)
|
83
|
+
name_node.xpath('mods:affiliation', mods: ModsNormalizer::MODS_NS).first
|
84
|
+
end
|
85
|
+
|
61
86
|
def normalize_text_role_term
|
62
87
|
# Add the type="text" attribute to roleTerms that don't have a type (seen in MODS 3.3 druid:yy910cj7795)
|
63
88
|
ng_xml.root.xpath('//mods:roleTerm[not(@type)]', mods: ModsNormalizer::MODS_NS).each do |role_term_node|
|
@@ -394,7 +394,7 @@ module Cocina
|
|
394
394
|
xml.name name_attrs do
|
395
395
|
write_name_part(subject_value)
|
396
396
|
write_display_form(display_values)
|
397
|
-
write_roles(
|
397
|
+
write_roles(subject_value.note)
|
398
398
|
write_other_notes(subject.note, 'description')
|
399
399
|
write_other_notes(subject.note, 'affiliation')
|
400
400
|
end
|
@@ -410,7 +410,7 @@ module Cocina
|
|
410
410
|
write_display_form(display_values)
|
411
411
|
write_roles(subject.note)
|
412
412
|
write_other_notes(subject.note, 'description')
|
413
|
-
write_other_notes(
|
413
|
+
write_other_notes(subject_value.note, 'affiliation')
|
414
414
|
end
|
415
415
|
write_genres(subject_value)
|
416
416
|
end
|
@@ -2,6 +2,7 @@
|
|
2
2
|
|
3
3
|
module Cocina
|
4
4
|
module Models
|
5
|
+
# A request to create a DRO. This has the same general structure as a DRO but doesn't have externalIdentifier and doesn't require the access subschema. If no access subschema is provided, these values will be inherited from the AdminPolicy.
|
5
6
|
class RequestDRO < Struct
|
6
7
|
include Validatable
|
7
8
|
|
@@ -2,6 +2,7 @@
|
|
2
2
|
|
3
3
|
module Cocina
|
4
4
|
module Models
|
5
|
+
# A sequence or ordering of resources within a Collection or Object.
|
5
6
|
class Sequence < Struct
|
6
7
|
attribute :members, Types::Strict::Array.of(Types::Strict::String).default([].freeze)
|
7
8
|
# The direction that a sequence of canvases should be displayed to the user
|
data/lib/cocina/models/source.rb
CHANGED
data/openapi.yml
CHANGED
@@ -779,6 +779,7 @@ components:
|
|
779
779
|
$ref: "#/components/schemas/DescriptiveValue"
|
780
780
|
DescriptiveParallelContributor:
|
781
781
|
description: Value model for multiple representations of information about the same contributor (e.g. in different languages).
|
782
|
+
deprecated: true
|
782
783
|
type: object
|
783
784
|
additionalProperties: false
|
784
785
|
properties:
|
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.
|
4
|
+
version: 0.80.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: 2022-05-
|
11
|
+
date: 2022-05-13 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: activesupport
|