cocina-models 0.73.4 → 0.74.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/description_types.yml +68 -1
- data/docs/description_types.md +29 -1
- data/lib/cocina/models/validatable.rb +2 -2
- data/lib/cocina/models/validators/purl_validator.rb +51 -0
- data/lib/cocina/models/validators/validator.rb +26 -1
- data/lib/cocina/models/version.rb +1 -1
- metadata +3 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: de6cff9bb4c5ec4f7b2533f024c37a6536d4c94ca1ba19cb91f4203ee8e9588f
|
4
|
+
data.tar.gz: 2b01b63cbccae36d295b825ffd44f435dd03e95ea84daf54caa62b13d696f9c5
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 6cff72fbbe94becd71a3ad92f622650dba10b7a26d3eef9f34d8c856e47b2bfd87551f0e8a6bccd7974c36347d33f7a20c906e417e7a70346fa00f0d43f4a66f
|
7
|
+
data.tar.gz: fc2e259a1d7c9a2efeda647d6db82bce3a9116736b1d69fbd01e07bfae2f169a5b56510ad7e29b2b10a9efe3ecc9896b0bf16f203e27ad752cc2c3df55730a09
|
data/description_types.yml
CHANGED
@@ -17,6 +17,8 @@ access.note:
|
|
17
17
|
description: License describing allowed uses of the resource.
|
18
18
|
- value: use and reproduction
|
19
19
|
description: Information related to allowed uses of the resource in other contexts.
|
20
|
+
- value: access constraints
|
21
|
+
status: TEMP
|
20
22
|
access.physicalLocation:
|
21
23
|
- value: discovery
|
22
24
|
description: Location where a user may find the resource.
|
@@ -142,12 +144,21 @@ event:
|
|
142
144
|
- value: withdrawal
|
143
145
|
description: The removal of previous access to a resource, often due to its obsolescence.
|
144
146
|
event.date:
|
147
|
+
- value: accompanying letter
|
148
|
+
description: Athanasius
|
149
|
+
status: deprecated
|
145
150
|
- value: acquisition
|
146
151
|
description: The transferral of ownership of a resource to a repository.
|
147
152
|
- value: capture
|
148
153
|
description: A record of the resource in a fixed form at a specific time.
|
149
154
|
- value: collection
|
150
155
|
description: The addition of a resource to a set of other resources.
|
156
|
+
- value: composition
|
157
|
+
description: Athanasius
|
158
|
+
status: deprecated
|
159
|
+
- value: copy
|
160
|
+
description: Athanasius
|
161
|
+
status: deprecated
|
151
162
|
- value: copyright
|
152
163
|
description: The activity by which a resource may be considered subject to copyright law.
|
153
164
|
- value: coverage
|
@@ -167,21 +178,54 @@ event.date:
|
|
167
178
|
description: The delivery of the resource to an external audience.
|
168
179
|
- value: generation
|
169
180
|
description: The creation of a resource by an automatic or natural process.
|
170
|
-
- value:
|
181
|
+
- value: Hijri calendar
|
171
182
|
- value: Islamic
|
172
183
|
- value: Julian
|
184
|
+
- value: letter
|
185
|
+
description: Athanasius
|
186
|
+
status: deprecated
|
187
|
+
- value: letter referred to
|
188
|
+
description: Athanasius
|
189
|
+
status: deprecated
|
173
190
|
- value: manufacture
|
174
191
|
description: The physical assembly of a resource, often in multiple copies, for publication or other distribution.
|
192
|
+
- value: manuscript
|
193
|
+
description: Athanasius
|
194
|
+
status: deprecated
|
195
|
+
- value: manuscript referred to
|
196
|
+
description: Athanasius
|
197
|
+
status: deprecated
|
175
198
|
- value: modification
|
176
199
|
description: A change to an existing resource.
|
200
|
+
- value: new document
|
201
|
+
description: Athanasius
|
202
|
+
- value: new style letter
|
203
|
+
status: deprecated
|
204
|
+
description: Athanasius
|
205
|
+
status: deprecated
|
206
|
+
- value: observation
|
207
|
+
description: Athanasius
|
208
|
+
status: deprecated
|
209
|
+
- value: old style letter
|
210
|
+
description: Athanasius
|
211
|
+
status: deprecated
|
212
|
+
- value: original sent
|
213
|
+
description: Athanasius
|
214
|
+
status: deprecated
|
177
215
|
- value: performance
|
178
216
|
description: The enactment of an artistic or cultural work for an audience, such as a play.
|
179
217
|
- value: presentation
|
180
218
|
description: The discussion of an academic or intellectual work for an audience, such as a seminar.
|
219
|
+
- value: proclamation
|
220
|
+
description: Athanasius
|
221
|
+
status: deprecated
|
181
222
|
- value: production
|
182
223
|
description: The physical assembly of a resource not considered published, such as page proofs for a book.
|
183
224
|
- value: publication
|
184
225
|
description: The publishing or issuing of a resource.
|
226
|
+
- value: quoted
|
227
|
+
description: Athanasius
|
228
|
+
status: deprecated
|
185
229
|
- value: recording
|
186
230
|
description: The initial fixation to a medium of live audio and/or visual activity.
|
187
231
|
- value: release
|
@@ -243,6 +287,9 @@ geographic.subject.structuredValue:
|
|
243
287
|
- value: south
|
244
288
|
- value: west
|
245
289
|
identifier:
|
290
|
+
- value: accession
|
291
|
+
status: deprecated
|
292
|
+
use: accession number
|
246
293
|
- value: accession number
|
247
294
|
- value: alternate case number
|
248
295
|
- value: anchor
|
@@ -254,8 +301,11 @@ identifier:
|
|
254
301
|
code: arxiv
|
255
302
|
- value: case identifier
|
256
303
|
- value: case number
|
304
|
+
- value: CCP
|
305
|
+
- value: CLC
|
257
306
|
- value: CSt
|
258
307
|
- value: CStRLIN
|
308
|
+
- value: CTC
|
259
309
|
- value: Data Provider Digital Object Identifier
|
260
310
|
- value: document number
|
261
311
|
- value: DOI
|
@@ -317,6 +367,14 @@ identifier:
|
|
317
367
|
- value: West Mat \#
|
318
368
|
- value: Wikidata
|
319
369
|
code: wikidata
|
370
|
+
- value: Bodley 342
|
371
|
+
status: TEMP
|
372
|
+
- value: vintage
|
373
|
+
status: TEMP
|
374
|
+
- value: accesion
|
375
|
+
status: TEMP
|
376
|
+
- value: Suri UUID
|
377
|
+
status: TEMP
|
320
378
|
note:
|
321
379
|
- value: abstract
|
322
380
|
- value: access
|
@@ -438,6 +496,8 @@ note:
|
|
438
496
|
- value: version
|
439
497
|
- value: version identification
|
440
498
|
- value: writing
|
499
|
+
- value: note
|
500
|
+
status: TEMP
|
441
501
|
note.groupedValue:
|
442
502
|
- value: caption
|
443
503
|
- value: date
|
@@ -492,6 +552,8 @@ subject:
|
|
492
552
|
- value: time
|
493
553
|
- value: title
|
494
554
|
- value: topic
|
555
|
+
- value: surname
|
556
|
+
status: TEMP
|
495
557
|
subject.note:
|
496
558
|
- value: affiliation
|
497
559
|
- value: description
|
@@ -519,6 +581,7 @@ subject.structuredValue:
|
|
519
581
|
- value: longitude
|
520
582
|
- value: main title
|
521
583
|
- value: name
|
584
|
+
- value: nonsorting characters
|
522
585
|
- value: north
|
523
586
|
- value: occupation
|
524
587
|
- value: ordinal
|
@@ -560,6 +623,10 @@ title:
|
|
560
623
|
description: Title transliterated from non-Latin script to Latin script.
|
561
624
|
- value: uniform
|
562
625
|
description: Form of title in Library of Congress title authority.
|
626
|
+
- value: main
|
627
|
+
status: TEMP
|
628
|
+
- value: other title
|
629
|
+
status: TEMP
|
563
630
|
title.note:
|
564
631
|
- value: associated name
|
565
632
|
description: A name linked to the title, such as for a name-title heading.
|
data/docs/description_types.md
CHANGED
@@ -15,6 +15,7 @@ _Path: access.note_
|
|
15
15
|
* display label: Display label for the purl.
|
16
16
|
* license: License describing allowed uses of the resource.
|
17
17
|
* use and reproduction: Information related to allowed uses of the resource in other contexts.
|
18
|
+
* access constraints
|
18
19
|
|
19
20
|
## Access physicallocation types
|
20
21
|
_Path: access.physicalLocation_
|
@@ -103,9 +104,12 @@ _Path: event_
|
|
103
104
|
|
104
105
|
## Event date types
|
105
106
|
_Path: event.date_
|
107
|
+
* accompanying letter: Athanasius
|
106
108
|
* acquisition: The transferral of ownership of a resource to a repository.
|
107
109
|
* capture: A record of the resource in a fixed form at a specific time.
|
108
110
|
* collection: The addition of a resource to a set of other resources.
|
111
|
+
* composition: Athanasius
|
112
|
+
* copy: Athanasius
|
109
113
|
* copyright: The activity by which a resource may be considered subject to copyright law.
|
110
114
|
* coverage
|
111
115
|
* creation: The coming into being of a resource.
|
@@ -116,15 +120,26 @@ _Path: event.date_
|
|
116
120
|
* development: The creation of a print from a photographic negative or other source medium.
|
117
121
|
* distribution: The delivery of the resource to an external audience.
|
118
122
|
* generation: The creation of a resource by an automatic or natural process.
|
119
|
-
*
|
123
|
+
* Hijri calendar
|
120
124
|
* Islamic
|
121
125
|
* Julian
|
126
|
+
* letter: Athanasius
|
127
|
+
* letter referred to: Athanasius
|
122
128
|
* manufacture: The physical assembly of a resource, often in multiple copies, for publication or other distribution.
|
129
|
+
* manuscript: Athanasius
|
130
|
+
* manuscript referred to: Athanasius
|
123
131
|
* modification: A change to an existing resource.
|
132
|
+
* new document: Athanasius
|
133
|
+
* new style letter: Athanasius
|
134
|
+
* observation: Athanasius
|
135
|
+
* old style letter: Athanasius
|
136
|
+
* original sent: Athanasius
|
124
137
|
* performance: The enactment of an artistic or cultural work for an audience, such as a play.
|
125
138
|
* presentation: The discussion of an academic or intellectual work for an audience, such as a seminar.
|
139
|
+
* proclamation: Athanasius
|
126
140
|
* production: The physical assembly of a resource not considered published, such as page proofs for a book.
|
127
141
|
* publication: The publishing or issuing of a resource.
|
142
|
+
* quoted: Athanasius
|
128
143
|
* recording: The initial fixation to a medium of live audio and/or visual activity.
|
129
144
|
* release: Making a resource available to a broader audience.
|
130
145
|
* Revolutionary calendar
|
@@ -194,6 +209,7 @@ _Path: geographic.subject.structuredValue_
|
|
194
209
|
|
195
210
|
# Identifier types
|
196
211
|
_Path: identifier_
|
212
|
+
* accession
|
197
213
|
* accession number
|
198
214
|
* alternate case number
|
199
215
|
* anchor
|
@@ -202,8 +218,11 @@ _Path: identifier_
|
|
202
218
|
* arXiv
|
203
219
|
* case identifier
|
204
220
|
* case number
|
221
|
+
* CCP
|
222
|
+
* CLC
|
205
223
|
* CSt
|
206
224
|
* CStRLIN
|
225
|
+
* CTC
|
207
226
|
* Data Provider Digital Object Identifier
|
208
227
|
* document number
|
209
228
|
* DOI
|
@@ -242,6 +261,10 @@ _Path: identifier_
|
|
242
261
|
* videorecording identifier
|
243
262
|
* West Mat \#
|
244
263
|
* Wikidata
|
264
|
+
* Bodley 342
|
265
|
+
* vintage
|
266
|
+
* accesion
|
267
|
+
* Suri UUID
|
245
268
|
|
246
269
|
# Note types
|
247
270
|
_Path: note_
|
@@ -349,6 +372,7 @@ _Path: note_
|
|
349
372
|
* version
|
350
373
|
* version identification
|
351
374
|
* writing
|
375
|
+
* note
|
352
376
|
|
353
377
|
## Note types for grouped value (MODS legacy)
|
354
378
|
_Path: note.groupedValue_
|
@@ -396,6 +420,7 @@ _Path: subject_
|
|
396
420
|
* time
|
397
421
|
* title
|
398
422
|
* topic
|
423
|
+
* surname
|
399
424
|
|
400
425
|
## Subject note types
|
401
426
|
_Path: subject.note_
|
@@ -427,6 +452,7 @@ _Path: subject.structuredValue_
|
|
427
452
|
* longitude
|
428
453
|
* main title
|
429
454
|
* name
|
455
|
+
* nonsorting characters
|
430
456
|
* north
|
431
457
|
* occupation
|
432
458
|
* ordinal
|
@@ -465,6 +491,8 @@ _Path: title_
|
|
465
491
|
* translated: Title translated into another language.
|
466
492
|
* transliterated: Title transliterated from non-Latin script to Latin script.
|
467
493
|
* uniform: Form of title in Library of Congress title authority.
|
494
|
+
* main
|
495
|
+
* other title
|
468
496
|
|
469
497
|
## Title note types
|
470
498
|
_Path: title.note_
|
@@ -8,7 +8,7 @@ module Cocina
|
|
8
8
|
|
9
9
|
class_methods do
|
10
10
|
def new(attributes = default_attributes, safe = false, validate = true, &block)
|
11
|
-
Validators::Validator.validate(self, attributes
|
11
|
+
Validators::Validator.validate(self, attributes) if validate
|
12
12
|
super(attributes, safe, &block)
|
13
13
|
end
|
14
14
|
end
|
@@ -16,7 +16,7 @@ module Cocina
|
|
16
16
|
def new(*args)
|
17
17
|
validate = args.first.delete(:validate) if args.present?
|
18
18
|
new_model = super(*args)
|
19
|
-
Validators::Validator.validate(new_model.class, new_model
|
19
|
+
Validators::Validator.validate(new_model.class, new_model) if validate || validate.nil?
|
20
20
|
new_model
|
21
21
|
end
|
22
22
|
end
|
@@ -0,0 +1,51 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module Cocina
|
4
|
+
module Models
|
5
|
+
module Validators
|
6
|
+
# Validates that Purl matches the external identifier (druid)
|
7
|
+
class PurlValidator
|
8
|
+
def self.validate(clazz, attributes)
|
9
|
+
new(clazz, attributes).validate
|
10
|
+
end
|
11
|
+
|
12
|
+
def initialize(clazz, attributes)
|
13
|
+
@clazz = clazz
|
14
|
+
@attributes = attributes
|
15
|
+
end
|
16
|
+
|
17
|
+
def validate
|
18
|
+
return unless meets_preconditions?
|
19
|
+
|
20
|
+
return if identifier_from_druid == identifier_from_purl
|
21
|
+
|
22
|
+
raise ValidationError, "Purl mismatch: #{druid} purl does not match object druid."
|
23
|
+
end
|
24
|
+
|
25
|
+
private
|
26
|
+
|
27
|
+
attr_reader :clazz, :attributes
|
28
|
+
|
29
|
+
def meets_preconditions?
|
30
|
+
purl
|
31
|
+
end
|
32
|
+
|
33
|
+
def druid
|
34
|
+
@druid ||= attributes[:externalIdentifier]
|
35
|
+
end
|
36
|
+
|
37
|
+
def purl
|
38
|
+
@purl ||= attributes.dig(:description, :purl)
|
39
|
+
end
|
40
|
+
|
41
|
+
def identifier_from_druid
|
42
|
+
druid.delete_prefix('druid:')
|
43
|
+
end
|
44
|
+
|
45
|
+
def identifier_from_purl
|
46
|
+
purl.split('/').last
|
47
|
+
end
|
48
|
+
end
|
49
|
+
end
|
50
|
+
end
|
51
|
+
end
|
@@ -8,13 +8,38 @@ module Cocina
|
|
8
8
|
VALIDATORS = [
|
9
9
|
OpenApiValidator,
|
10
10
|
DarkValidator,
|
11
|
+
PurlValidator,
|
11
12
|
CatalogLinksValidator,
|
12
13
|
DescriptionTypesValidator
|
13
14
|
].freeze
|
14
15
|
|
15
16
|
def self.validate(clazz, attributes)
|
16
|
-
|
17
|
+
# This gets rid of nested model objects.
|
18
|
+
# Once DSA is on Rails 6, this can be:
|
19
|
+
# attributes_hash = attributes.to_h.deep_transform_values do |value|
|
20
|
+
# value.class.name.starts_with?('Cocina::Models') ? value.to_h : value
|
21
|
+
# end.with_indifferent_access
|
22
|
+
# And add require 'active_support/core_ext/hash/deep_transform_values' to models file.
|
23
|
+
|
24
|
+
# In the meantime, copying code.
|
25
|
+
attributes_hash = deep_transform_values(attributes.to_h) do |value|
|
26
|
+
value.class.name.starts_with?('Cocina::Models') ? value.to_h : value
|
27
|
+
end.with_indifferent_access
|
28
|
+
|
29
|
+
VALIDATORS.each { |validator| validator.validate(clazz, attributes_hash) }
|
30
|
+
end
|
31
|
+
|
32
|
+
def self.deep_transform_values(object, &block)
|
33
|
+
case object
|
34
|
+
when Hash
|
35
|
+
object.transform_values { |value| deep_transform_values(value, &block) }
|
36
|
+
when Array
|
37
|
+
object.map { |e| deep_transform_values(e, &block) }
|
38
|
+
else
|
39
|
+
yield(object)
|
40
|
+
end
|
17
41
|
end
|
42
|
+
private_class_method :deep_transform_values
|
18
43
|
end
|
19
44
|
end
|
20
45
|
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.
|
4
|
+
version: 0.74.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-04-
|
11
|
+
date: 2022-04-15 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: activesupport
|
@@ -391,6 +391,7 @@ files:
|
|
391
391
|
- lib/cocina/models/validators/dark_validator.rb
|
392
392
|
- lib/cocina/models/validators/description_types_validator.rb
|
393
393
|
- lib/cocina/models/validators/open_api_validator.rb
|
394
|
+
- lib/cocina/models/validators/purl_validator.rb
|
394
395
|
- lib/cocina/models/validators/validator.rb
|
395
396
|
- lib/cocina/models/version.rb
|
396
397
|
- lib/cocina/models/vocabulary.rb
|