cocina-models 0.80.0 → 0.81.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:
|
|
4
|
-
data.tar.gz:
|
|
3
|
+
metadata.gz: 0d8392fadece0bb4ec12ed93e958c99abf04e29ad0a78c14ee8651ec8ecd1e37
|
|
4
|
+
data.tar.gz: db4a5de344bb53d98b2b71f725e8b1d1b9e0d5e0b28416989ad55f19df826376
|
|
5
5
|
SHA512:
|
|
6
|
-
metadata.gz:
|
|
7
|
-
data.tar.gz:
|
|
6
|
+
metadata.gz: 4880e4eb86935116e0bec017926aeab5e5aa12d8792ee5066d0aeef5f514e6f13f63c8bc68c03035fdff2748f95aa7215f236384e109a8e532bd76e9677ae53c
|
|
7
|
+
data.tar.gz: 22154804ee4b103bdbd3aaaee449327bb4a6c9bc1dce9431a5311ed06c5e76039ccb420634d275f56d644a60ffa529bd9cb822f9c549be057f4972d791a34bf7
|
|
@@ -36,7 +36,7 @@ module Cocina
|
|
|
36
36
|
|
|
37
37
|
def build_parallel
|
|
38
38
|
names = {
|
|
39
|
-
parallelValue:
|
|
39
|
+
parallelValue: build_parallel_values,
|
|
40
40
|
type: type_for(name_elements.first['type']),
|
|
41
41
|
status: name_elements.filter_map { |name_element| name_element['usage'] }.first
|
|
42
42
|
}.compact
|
|
@@ -52,7 +52,7 @@ module Cocina
|
|
|
52
52
|
}.compact.merge(common_lang_script(name_node))
|
|
53
53
|
|
|
54
54
|
name_attrs = name_attrs.merge(common_name(name_node, name_attrs[:name], is_parallel: true))
|
|
55
|
-
name_parts = build_name_parts(name_node)
|
|
55
|
+
name_parts = build_name_parts(name_node, parallel: true)
|
|
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) }
|
|
58
58
|
name_attrs.compact
|
|
@@ -106,7 +106,17 @@ module Cocina
|
|
|
106
106
|
end.compact
|
|
107
107
|
end
|
|
108
108
|
|
|
109
|
-
def
|
|
109
|
+
def build_parallel_values
|
|
110
|
+
parallel_values = []
|
|
111
|
+
name_elements.each do |name_node|
|
|
112
|
+
parallel_values << build_parallel_name(name_node)
|
|
113
|
+
display_val = display_value(name_node)
|
|
114
|
+
parallel_values << display_val if display_val
|
|
115
|
+
end
|
|
116
|
+
parallel_values.compact
|
|
117
|
+
end
|
|
118
|
+
|
|
119
|
+
def build_name_parts(name_node, parallel: false)
|
|
110
120
|
name_part_nodes = name_node.xpath('mods:namePart', mods: Description::DESC_METADATA_NS)
|
|
111
121
|
alternative_name_nodes = name_node.xpath('mods:alternativeName', mods: Description::DESC_METADATA_NS)
|
|
112
122
|
|
|
@@ -116,23 +126,64 @@ module Cocina
|
|
|
116
126
|
parts << { valueAt: name_node['xlink:href'] } if name_node['xlink:href']
|
|
117
127
|
parts << common_authority(name_node) if name_node['valueURI']
|
|
118
128
|
when 1
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
.merge(common_authority(name_node)).merge(common_lang_script(name_node)).presence
|
|
129
|
+
name = build_simple_value_name(name_node, name_part_nodes.first, alternative_name_nodes, parallel)
|
|
130
|
+
parts << name.merge(common_authority(name_node)).merge(common_lang_script(name_node)).presence
|
|
122
131
|
else
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
end
|
|
126
|
-
parts << { structuredValue: vals }.merge(common_authority(name_node)).merge(common_lang_script(name_node))
|
|
132
|
+
name = build_structured_value_name(name_node, name_part_nodes)
|
|
133
|
+
parts << name.merge(common_authority(name_node)).merge(common_lang_script(name_node))
|
|
127
134
|
end
|
|
128
135
|
|
|
129
136
|
parts = build_alternative_name(alternative_name_nodes, parts) if alternative_name_nodes.present?
|
|
130
|
-
|
|
131
|
-
display_form = name_node.xpath('mods:displayForm', mods: Description::DESC_METADATA_NS).first
|
|
132
|
-
parts << { value: display_form.text, type: 'display' } if display_form
|
|
133
137
|
parts.compact
|
|
134
138
|
end
|
|
135
139
|
|
|
140
|
+
def build_simple_value_name(name_node, name_part_node, alternative_name_nodes, parallel)
|
|
141
|
+
name_value_hash = build_name_part(name_node, name_part_node, default_type: alternative_name_nodes.present?)
|
|
142
|
+
display_form_node = name_node.xpath('mods:displayForm', mods: Description::DESC_METADATA_NS).first
|
|
143
|
+
if display_form_node.present? && !parallel
|
|
144
|
+
cocina_contrib_name =
|
|
145
|
+
{
|
|
146
|
+
parallelValue: [
|
|
147
|
+
name_value_hash
|
|
148
|
+
]
|
|
149
|
+
}
|
|
150
|
+
add_display_parallel_value(name_node, cocina_contrib_name)
|
|
151
|
+
else
|
|
152
|
+
name_value_hash
|
|
153
|
+
end
|
|
154
|
+
end
|
|
155
|
+
|
|
156
|
+
def build_structured_value_name(name_node, name_part_nodes)
|
|
157
|
+
vals = name_part_nodes.filter_map { |name_part_node| build_name_part(name_node, name_part_node, default_type: name_node['type'] != 'corporate').presence }
|
|
158
|
+
display_form_node = name_node.xpath('mods:displayForm', mods: Description::DESC_METADATA_NS).first
|
|
159
|
+
if display_form_node.present?
|
|
160
|
+
cocina_contrib_name =
|
|
161
|
+
{
|
|
162
|
+
parallelValue: [
|
|
163
|
+
{ structuredValue: vals }
|
|
164
|
+
]
|
|
165
|
+
}
|
|
166
|
+
add_display_parallel_value(name_node, cocina_contrib_name)
|
|
167
|
+
else
|
|
168
|
+
{ structuredValue: vals }
|
|
169
|
+
end
|
|
170
|
+
end
|
|
171
|
+
|
|
172
|
+
def add_display_parallel_value(name_node, cocina_contrib_name)
|
|
173
|
+
display_form = name_node.xpath('mods:displayForm', mods: Description::DESC_METADATA_NS)&.text
|
|
174
|
+
return cocina_contrib_name if display_form.blank?
|
|
175
|
+
|
|
176
|
+
display_parallel_value = display_value(name_node)
|
|
177
|
+
cocina_contrib_name[:parallelValue] << display_parallel_value if display_parallel_value && cocina_contrib_name[:parallelValue].present?
|
|
178
|
+
|
|
179
|
+
cocina_contrib_name
|
|
180
|
+
end
|
|
181
|
+
|
|
182
|
+
def display_value(name_node)
|
|
183
|
+
display_form = name_node.xpath('mods:displayForm', mods: Description::DESC_METADATA_NS)&.text
|
|
184
|
+
{ value: display_form, type: 'display' } if display_form.present?
|
|
185
|
+
end
|
|
186
|
+
|
|
136
187
|
def build_name_part(name_node, name_part_node, default_type: true)
|
|
137
188
|
if name_part_node.content.blank? && !name_part_node['xlink:href']
|
|
138
189
|
notifier.warn('name/namePart missing value')
|
|
@@ -36,25 +36,11 @@ module Cocina
|
|
|
36
36
|
if contributor.type == 'unspecified others'
|
|
37
37
|
write_etal
|
|
38
38
|
elsif contributor.name.present?
|
|
39
|
+
# Expect contributor to have a single value for name property
|
|
39
40
|
contrib_name = contributor.name.first
|
|
40
|
-
|
|
41
|
-
if
|
|
42
|
-
|
|
43
|
-
parallel_values.each do |parallel_contrib_name|
|
|
44
|
-
Cocina::Models::Builders::NameTitleGroupBuilder.value_slices(parallel_contrib_name)&.each do |parallel_contrib_name_slice|
|
|
45
|
-
if name_title_vals_index[parallel_contrib_name_slice]
|
|
46
|
-
name_title_group = name_title_vals_index[parallel_contrib_name_slice]&.values&.first
|
|
47
|
-
write_parallel_contributor(contributor, contrib_name, parallel_contrib_name,
|
|
48
|
-
name_title_group, altrepgroup_id)
|
|
49
|
-
else
|
|
50
|
-
# TODO: want a way to notify that we hit a problem - either notifier or HB error (issue #3751)
|
|
51
|
-
# OR validate for semantic correctness upon creation/update so we can't get here.
|
|
52
|
-
# notifier.warn("For contributor name '#{parallel_contrib_name_val}', no title matching '#{title_from_contrib}'")
|
|
53
|
-
write_parallel_contributor(contributor, contrib_name, parallel_contrib_name, nil,
|
|
54
|
-
altrepgroup_id)
|
|
55
|
-
end
|
|
56
|
-
end
|
|
57
|
-
end
|
|
41
|
+
parallel_name_values = contrib_name.parallelValue
|
|
42
|
+
if parallel_name_values.present?
|
|
43
|
+
write_contributor_with_parallel_names(parallel_name_values, contrib_name)
|
|
58
44
|
else
|
|
59
45
|
write_contributor(contributor)
|
|
60
46
|
end
|
|
@@ -105,7 +91,50 @@ module Cocina
|
|
|
105
91
|
end
|
|
106
92
|
end
|
|
107
93
|
|
|
108
|
-
def
|
|
94
|
+
def write_contributor_with_parallel_names(parallel_name_values, contrib_name)
|
|
95
|
+
display_type_parallel_name = display_type_parallel_name(parallel_name_values)
|
|
96
|
+
if parallel_name_values.size == 1
|
|
97
|
+
contrib_name_value_slice = Cocina::Models::Builders::NameTitleGroupBuilder.value_slices(parallel_name_values.first)
|
|
98
|
+
name_title_group = name_title_vals_index[contrib_name_value_slice]&.values&.first
|
|
99
|
+
write_name_from_parallel(contributor, contributor.name.first, parallel_name_values, name_title_group, nil)
|
|
100
|
+
elsif parallel_name_values.size == 2 && display_type_parallel_name
|
|
101
|
+
contrib_name_value_slice = Cocina::Models::Builders::NameTitleGroupBuilder.value_slices(parallel_name_values.first)
|
|
102
|
+
name_title_group = name_title_vals_index[contrib_name_value_slice]&.values&.first
|
|
103
|
+
write_name_with_display_form(contributor, contributor.name.first, parallel_name_values, 0, name_title_group, nil)
|
|
104
|
+
else
|
|
105
|
+
write_multiple_parallel_contributors(parallel_name_values, contrib_name)
|
|
106
|
+
end
|
|
107
|
+
end
|
|
108
|
+
|
|
109
|
+
def write_multiple_parallel_contributors(parallel_name_values, contrib_name)
|
|
110
|
+
altrepgroup_id = id_generator.next_altrepgroup
|
|
111
|
+
parallel_name_values.each_with_index do |parallel_contrib_name, index|
|
|
112
|
+
display_name_present = parallel_name_values[index + 1].present? && parallel_name_values[index + 1].type == 'display'
|
|
113
|
+
Cocina::Models::Builders::NameTitleGroupBuilder.value_slices(parallel_contrib_name)&.each do |parallel_contrib_name_slice|
|
|
114
|
+
if name_title_vals_index[parallel_contrib_name_slice]
|
|
115
|
+
name_title_group = name_title_vals_index[parallel_contrib_name_slice]&.values&.first
|
|
116
|
+
if display_name_present
|
|
117
|
+
# associate type 'display' with the previous value
|
|
118
|
+
write_name_with_display_form(contributor, contrib_name, parallel_name_values, index, name_title_group, altrepgroup_id)
|
|
119
|
+
else
|
|
120
|
+
write_name_from_parallel(contributor, contrib_name, parallel_contrib_name, name_title_group, altrepgroup_id)
|
|
121
|
+
end
|
|
122
|
+
elsif display_name_present
|
|
123
|
+
# TODO: want a way to notify that we hit a problem - either notifier or HB error (issue #3751)
|
|
124
|
+
# OR validate for semantic correctness upon creation/update so we can't get here.
|
|
125
|
+
# notifier.warn("For contributor name '#{parallel_contrib_name_slice}', no contrib matching")
|
|
126
|
+
write_name_with_display_form(contributor, contrib_name, parallel_name_values, index, nil, altrepgroup_id)
|
|
127
|
+
elsif parallel_name_values[index].type == 'display'
|
|
128
|
+
# we assume we included this as part of a previous name
|
|
129
|
+
next
|
|
130
|
+
else
|
|
131
|
+
write_name_from_parallel(contributor, contrib_name, parallel_contrib_name, nil, altrepgroup_id)
|
|
132
|
+
end
|
|
133
|
+
end
|
|
134
|
+
end
|
|
135
|
+
end
|
|
136
|
+
|
|
137
|
+
def write_name_from_parallel(contributor, name, parallel_name, name_title_group, altrepgroup_id)
|
|
109
138
|
attributes = parallel_name_attributes(name, parallel_name, name_title_group, altrepgroup_id)
|
|
110
139
|
type_attr = NAME_TYPE.fetch(contributor.type, name_title_group ? 'personal' : nil)
|
|
111
140
|
attributes[:type] = type_attr if type_attr
|
|
@@ -121,6 +150,37 @@ module Cocina
|
|
|
121
150
|
end
|
|
122
151
|
end
|
|
123
152
|
|
|
153
|
+
# rubocop:disable Metrics/ParameterLists
|
|
154
|
+
def write_name_with_display_form(contributor, name, parallel_name_values, index, name_title_group, altrepgroup_id)
|
|
155
|
+
display_type_parallel_name = display_type_parallel_name(parallel_name_values)
|
|
156
|
+
parallel_name = parallel_name_values[index]
|
|
157
|
+
return if parallel_name.blank?
|
|
158
|
+
|
|
159
|
+
attributes = if altrepgroup_id.present?
|
|
160
|
+
parallel_name_attributes(name, parallel_name, name_title_group, altrepgroup_id)
|
|
161
|
+
else
|
|
162
|
+
name_attributes(contributor, name, nil)
|
|
163
|
+
end
|
|
164
|
+
type_attr = NAME_TYPE.fetch(contributor.type, name_title_group ? 'personal' : nil)
|
|
165
|
+
attributes[:type] = type_attr if type_attr
|
|
166
|
+
xml.name attributes do
|
|
167
|
+
if parallel_name.structuredValue.present?
|
|
168
|
+
write_structured(parallel_name)
|
|
169
|
+
else
|
|
170
|
+
write_basic(parallel_name)
|
|
171
|
+
end
|
|
172
|
+
write_display_form(display_type_parallel_name) if display_type_parallel_name.present?
|
|
173
|
+
write_identifier(contributor) if contributor.identifier.present?
|
|
174
|
+
write_note(contributor)
|
|
175
|
+
write_roles(contributor)
|
|
176
|
+
end
|
|
177
|
+
end
|
|
178
|
+
# rubocop:enable Metrics/ParameterLists
|
|
179
|
+
|
|
180
|
+
def display_type_parallel_name(parallel_name_values)
|
|
181
|
+
parallel_name_values.detect { |parallel_value| parallel_value.type == 'display' }
|
|
182
|
+
end
|
|
183
|
+
|
|
124
184
|
def parallel_name_attributes(name, parallel_name, name_title_group, altrepgroup_id)
|
|
125
185
|
{
|
|
126
186
|
nameTitleGroup: name_title_group,
|
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.81.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-
|
|
11
|
+
date: 2022-06-01 00:00:00.000000000 Z
|
|
12
12
|
dependencies:
|
|
13
13
|
- !ruby/object:Gem::Dependency
|
|
14
14
|
name: activesupport
|