cocina-models 0.73.6 → 0.74.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 +4 -4
- data/description_types.yml +25 -2
- data/docs/description_types.md +14 -2
- 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 +2 -1
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.
|
|
@@ -176,7 +178,7 @@ event.date:
|
|
|
176
178
|
description: The delivery of the resource to an external audience.
|
|
177
179
|
- value: generation
|
|
178
180
|
description: The creation of a resource by an automatic or natural process.
|
|
179
|
-
- value:
|
|
181
|
+
- value: Hijri calendar
|
|
180
182
|
- value: Islamic
|
|
181
183
|
- value: Julian
|
|
182
184
|
- value: letter
|
|
@@ -285,6 +287,9 @@ geographic.subject.structuredValue:
|
|
|
285
287
|
- value: south
|
|
286
288
|
- value: west
|
|
287
289
|
identifier:
|
|
290
|
+
- value: accession
|
|
291
|
+
status: deprecated
|
|
292
|
+
use: accession number
|
|
288
293
|
- value: accession number
|
|
289
294
|
- value: alternate case number
|
|
290
295
|
- value: anchor
|
|
@@ -296,8 +301,11 @@ identifier:
|
|
|
296
301
|
code: arxiv
|
|
297
302
|
- value: case identifier
|
|
298
303
|
- value: case number
|
|
304
|
+
- value: CCP
|
|
305
|
+
- value: CLC
|
|
299
306
|
- value: CSt
|
|
300
307
|
- value: CStRLIN
|
|
308
|
+
- value: CTC
|
|
301
309
|
- value: Data Provider Digital Object Identifier
|
|
302
310
|
- value: document number
|
|
303
311
|
- value: DOI
|
|
@@ -359,6 +367,14 @@ identifier:
|
|
|
359
367
|
- value: West Mat \#
|
|
360
368
|
- value: Wikidata
|
|
361
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
|
|
362
378
|
note:
|
|
363
379
|
- value: abstract
|
|
364
380
|
- value: access
|
|
@@ -480,6 +496,8 @@ note:
|
|
|
480
496
|
- value: version
|
|
481
497
|
- value: version identification
|
|
482
498
|
- value: writing
|
|
499
|
+
- value: note
|
|
500
|
+
status: TEMP
|
|
483
501
|
note.groupedValue:
|
|
484
502
|
- value: caption
|
|
485
503
|
- value: date
|
|
@@ -534,6 +552,8 @@ subject:
|
|
|
534
552
|
- value: time
|
|
535
553
|
- value: title
|
|
536
554
|
- value: topic
|
|
555
|
+
- value: surname
|
|
556
|
+
status: TEMP
|
|
537
557
|
subject.note:
|
|
538
558
|
- value: affiliation
|
|
539
559
|
- value: description
|
|
@@ -574,7 +594,6 @@ subject.structuredValue:
|
|
|
574
594
|
- value: south
|
|
575
595
|
- value: start
|
|
576
596
|
- value: state
|
|
577
|
-
- value: subtitle
|
|
578
597
|
- value: surname
|
|
579
598
|
- value: term of address
|
|
580
599
|
- value: territory
|
|
@@ -604,6 +623,10 @@ title:
|
|
|
604
623
|
description: Title transliterated from non-Latin script to Latin script.
|
|
605
624
|
- value: uniform
|
|
606
625
|
description: Form of title in Library of Congress title authority.
|
|
626
|
+
- value: main
|
|
627
|
+
status: TEMP
|
|
628
|
+
- value: other title
|
|
629
|
+
status: TEMP
|
|
607
630
|
title.note:
|
|
608
631
|
- value: associated name
|
|
609
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_
|
|
@@ -119,7 +120,7 @@ _Path: event.date_
|
|
|
119
120
|
* development: The creation of a print from a photographic negative or other source medium.
|
|
120
121
|
* distribution: The delivery of the resource to an external audience.
|
|
121
122
|
* generation: The creation of a resource by an automatic or natural process.
|
|
122
|
-
*
|
|
123
|
+
* Hijri calendar
|
|
123
124
|
* Islamic
|
|
124
125
|
* Julian
|
|
125
126
|
* letter: Athanasius
|
|
@@ -208,6 +209,7 @@ _Path: geographic.subject.structuredValue_
|
|
|
208
209
|
|
|
209
210
|
# Identifier types
|
|
210
211
|
_Path: identifier_
|
|
212
|
+
* accession
|
|
211
213
|
* accession number
|
|
212
214
|
* alternate case number
|
|
213
215
|
* anchor
|
|
@@ -216,8 +218,11 @@ _Path: identifier_
|
|
|
216
218
|
* arXiv
|
|
217
219
|
* case identifier
|
|
218
220
|
* case number
|
|
221
|
+
* CCP
|
|
222
|
+
* CLC
|
|
219
223
|
* CSt
|
|
220
224
|
* CStRLIN
|
|
225
|
+
* CTC
|
|
221
226
|
* Data Provider Digital Object Identifier
|
|
222
227
|
* document number
|
|
223
228
|
* DOI
|
|
@@ -256,6 +261,10 @@ _Path: identifier_
|
|
|
256
261
|
* videorecording identifier
|
|
257
262
|
* West Mat \#
|
|
258
263
|
* Wikidata
|
|
264
|
+
* Bodley 342
|
|
265
|
+
* vintage
|
|
266
|
+
* accesion
|
|
267
|
+
* Suri UUID
|
|
259
268
|
|
|
260
269
|
# Note types
|
|
261
270
|
_Path: note_
|
|
@@ -363,6 +372,7 @@ _Path: note_
|
|
|
363
372
|
* version
|
|
364
373
|
* version identification
|
|
365
374
|
* writing
|
|
375
|
+
* note
|
|
366
376
|
|
|
367
377
|
## Note types for grouped value (MODS legacy)
|
|
368
378
|
_Path: note.groupedValue_
|
|
@@ -410,6 +420,7 @@ _Path: subject_
|
|
|
410
420
|
* time
|
|
411
421
|
* title
|
|
412
422
|
* topic
|
|
423
|
+
* surname
|
|
413
424
|
|
|
414
425
|
## Subject note types
|
|
415
426
|
_Path: subject.note_
|
|
@@ -454,7 +465,6 @@ _Path: subject.structuredValue_
|
|
|
454
465
|
* south
|
|
455
466
|
* start
|
|
456
467
|
* state
|
|
457
|
-
* subtitle
|
|
458
468
|
* surname
|
|
459
469
|
* term of address
|
|
460
470
|
* territory
|
|
@@ -481,6 +491,8 @@ _Path: title_
|
|
|
481
491
|
* translated: Title translated into another language.
|
|
482
492
|
* transliterated: Title transliterated from non-Latin script to Latin script.
|
|
483
493
|
* uniform: Form of title in Library of Congress title authority.
|
|
494
|
+
* main
|
|
495
|
+
* other title
|
|
484
496
|
|
|
485
497
|
## Title note types
|
|
486
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,7 +1,7 @@
|
|
|
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
|
|
@@ -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
|