cocina-models 0.74.0 → 0.76.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (133) hide show
  1. checksums.yaml +4 -4
  2. data/.rubocop.yml +40 -11
  3. data/.rubocop_todo.yml +71 -2
  4. data/README.md +19 -3
  5. data/cocina-models.gemspec +2 -0
  6. data/description_types.yml +167 -39
  7. data/docs/description_types.md +470 -216
  8. data/lib/cocina/generator/generator.rb +7 -15
  9. data/lib/cocina/generator/schema.rb +1 -3
  10. data/lib/cocina/generator/schema_base.rb +0 -8
  11. data/lib/cocina/generator/schema_ref.rb +1 -1
  12. data/lib/cocina/generator/schema_value.rb +14 -4
  13. data/lib/cocina/models/access.rb +4 -4
  14. data/lib/cocina/models/admin_policy.rb +1 -1
  15. data/lib/cocina/models/admin_policy_access_template.rb +7 -7
  16. data/lib/cocina/models/admin_policy_administrative.rb +1 -1
  17. data/lib/cocina/models/admin_policy_with_metadata.rb +3 -3
  18. data/lib/cocina/models/builders/dro_rights_description_builder.rb +69 -0
  19. data/lib/cocina/models/builders/name_title_group_builder.rb +130 -0
  20. data/lib/cocina/models/builders/rights_description_builder.rb +83 -0
  21. data/lib/cocina/models/builders/title_builder.rb +211 -0
  22. data/lib/cocina/models/citation_only_access.rb +2 -2
  23. data/lib/cocina/models/collection_access.rb +4 -4
  24. data/lib/cocina/models/collection_identification.rb +1 -1
  25. data/lib/cocina/models/collection_with_metadata.rb +2 -2
  26. data/lib/cocina/models/contributor.rb +4 -4
  27. data/lib/cocina/models/controlled_digital_lending_access.rb +2 -2
  28. data/lib/cocina/models/dark_access.rb +4 -4
  29. data/lib/cocina/models/description.rb +3 -3
  30. data/lib/cocina/models/descriptive_basic_value.rb +13 -13
  31. data/lib/cocina/models/descriptive_parallel_contributor.rb +5 -5
  32. data/lib/cocina/models/descriptive_parallel_event.rb +3 -3
  33. data/lib/cocina/models/descriptive_value.rb +13 -13
  34. data/lib/cocina/models/descriptive_value_language.rb +6 -6
  35. data/lib/cocina/models/dro.rb +1 -1
  36. data/lib/cocina/models/dro_access.rb +8 -8
  37. data/lib/cocina/models/dro_with_metadata.rb +3 -3
  38. data/lib/cocina/models/embargo.rb +5 -5
  39. data/lib/cocina/models/event.rb +3 -3
  40. data/lib/cocina/models/file.rb +4 -4
  41. data/lib/cocina/models/file_access.rb +4 -4
  42. data/lib/cocina/models/identification.rb +2 -2
  43. data/lib/cocina/models/language.rb +12 -12
  44. data/lib/cocina/models/location_based_access.rb +1 -1
  45. data/lib/cocina/models/location_based_download_access.rb +1 -1
  46. data/lib/cocina/models/mapping/error_notifier.rb +36 -0
  47. data/lib/cocina/models/mapping/from_mods/access.rb +177 -0
  48. data/lib/cocina/models/mapping/from_mods/admin_metadata.rb +217 -0
  49. data/lib/cocina/models/mapping/from_mods/alt_rep_group.rb +26 -0
  50. data/lib/cocina/models/mapping/from_mods/authority.rb +51 -0
  51. data/lib/cocina/models/mapping/from_mods/contributor.rb +161 -0
  52. data/lib/cocina/models/mapping/from_mods/description.rb +99 -0
  53. data/lib/cocina/models/mapping/from_mods/description_builder.rb +61 -0
  54. data/lib/cocina/models/mapping/from_mods/event.rb +543 -0
  55. data/lib/cocina/models/mapping/from_mods/form.rb +381 -0
  56. data/lib/cocina/models/mapping/from_mods/geographic.rb +219 -0
  57. data/lib/cocina/models/mapping/from_mods/hydrus_default_title_builder.rb +28 -0
  58. data/lib/cocina/models/mapping/from_mods/identifier.rb +51 -0
  59. data/lib/cocina/models/mapping/from_mods/identifier_builder.rb +71 -0
  60. data/lib/cocina/models/mapping/from_mods/identifier_type.rb +292 -0
  61. data/lib/cocina/models/mapping/from_mods/language.rb +36 -0
  62. data/lib/cocina/models/mapping/from_mods/language_script.rb +30 -0
  63. data/lib/cocina/models/mapping/from_mods/language_term.rb +106 -0
  64. data/lib/cocina/models/mapping/from_mods/name_builder.rb +307 -0
  65. data/lib/cocina/models/mapping/from_mods/note.rb +162 -0
  66. data/lib/cocina/models/mapping/from_mods/part_builder.rb +147 -0
  67. data/lib/cocina/models/mapping/from_mods/primary.rb +27 -0
  68. data/lib/cocina/models/mapping/from_mods/purl.rb +53 -0
  69. data/lib/cocina/models/mapping/from_mods/related_resource.rb +105 -0
  70. data/lib/cocina/models/mapping/from_mods/subject.rb +413 -0
  71. data/lib/cocina/models/mapping/from_mods/subject_authority_codes.rb +794 -0
  72. data/lib/cocina/models/mapping/from_mods/title.rb +160 -0
  73. data/lib/cocina/models/mapping/from_mods/title_builder.rb +106 -0
  74. data/lib/cocina/models/mapping/from_mods/title_builder_strategy.rb +19 -0
  75. data/lib/cocina/models/mapping/from_mods/value_uri.rb +25 -0
  76. data/lib/cocina/models/mapping/normalizers/base.rb +16 -0
  77. data/lib/cocina/models/mapping/normalizers/mods/geo_extension_normalizer.rb +69 -0
  78. data/lib/cocina/models/mapping/normalizers/mods/name_normalizer.rb +191 -0
  79. data/lib/cocina/models/mapping/normalizers/mods/origin_info_normalizer.rb +157 -0
  80. data/lib/cocina/models/mapping/normalizers/mods/subject_normalizer.rb +296 -0
  81. data/lib/cocina/models/mapping/normalizers/mods/title_normalizer.rb +91 -0
  82. data/lib/cocina/models/mapping/normalizers/mods_normalizer.rb +409 -0
  83. data/lib/cocina/models/mapping/purl.rb +28 -0
  84. data/lib/cocina/models/mapping/to_mods/access.rb +155 -0
  85. data/lib/cocina/models/mapping/to_mods/admin_metadata.rb +129 -0
  86. data/lib/cocina/models/mapping/to_mods/contributor.rb +49 -0
  87. data/lib/cocina/models/mapping/to_mods/description.rb +63 -0
  88. data/lib/cocina/models/mapping/to_mods/event.rb +200 -0
  89. data/lib/cocina/models/mapping/to_mods/form.rb +292 -0
  90. data/lib/cocina/models/mapping/to_mods/geographic.rb +151 -0
  91. data/lib/cocina/models/mapping/to_mods/id_generator.rb +25 -0
  92. data/lib/cocina/models/mapping/to_mods/identifier.rb +57 -0
  93. data/lib/cocina/models/mapping/to_mods/language.rb +82 -0
  94. data/lib/cocina/models/mapping/to_mods/mods_writer.rb +38 -0
  95. data/lib/cocina/models/mapping/to_mods/name_title_group.rb +29 -0
  96. data/lib/cocina/models/mapping/to_mods/name_writer.rb +228 -0
  97. data/lib/cocina/models/mapping/to_mods/note.rb +105 -0
  98. data/lib/cocina/models/mapping/to_mods/part_writer.rb +115 -0
  99. data/lib/cocina/models/mapping/to_mods/related_resource.rb +108 -0
  100. data/lib/cocina/models/mapping/to_mods/role_writer.rb +50 -0
  101. data/lib/cocina/models/mapping/to_mods/subject.rb +486 -0
  102. data/lib/cocina/models/mapping/to_mods/title.rb +260 -0
  103. data/lib/cocina/models/object_metadata.rb +2 -2
  104. data/lib/cocina/models/presentation.rb +2 -2
  105. data/lib/cocina/models/related_resource.rb +9 -9
  106. data/lib/cocina/models/release_tag.rb +4 -4
  107. data/lib/cocina/models/request_admin_policy.rb +1 -1
  108. data/lib/cocina/models/request_administrative.rb +1 -1
  109. data/lib/cocina/models/request_collection.rb +2 -2
  110. data/lib/cocina/models/request_description.rb +3 -3
  111. data/lib/cocina/models/request_dro.rb +4 -4
  112. data/lib/cocina/models/request_file.rb +5 -5
  113. data/lib/cocina/models/request_identification.rb +1 -1
  114. data/lib/cocina/models/sequence.rb +1 -1
  115. data/lib/cocina/models/source.rb +4 -4
  116. data/lib/cocina/models/standard.rb +5 -5
  117. data/lib/cocina/models/stanford_access.rb +2 -2
  118. data/lib/cocina/models/title.rb +13 -13
  119. data/lib/cocina/models/validators/associated_name_validator.rb +77 -0
  120. data/lib/cocina/models/validators/dark_validator.rb +4 -2
  121. data/lib/cocina/models/validators/open_api_validator.rb +0 -4
  122. data/lib/cocina/models/validators/validator.rb +1 -0
  123. data/lib/cocina/models/version.rb +1 -1
  124. data/lib/cocina/models/world_access.rb +2 -2
  125. data/lib/cocina/models.rb +4 -0
  126. data/lib/cocina/rspec/factories.rb +157 -0
  127. data/lib/cocina/rspec.rb +2 -0
  128. data/openapi.yml +4 -4
  129. metadata +93 -6
  130. data/docs/_config.yml +0 -1
  131. data/lib/cocina/models/dro_rights_description_builder.rb +0 -67
  132. data/lib/cocina/models/rights_description_builder.rb +0 -81
  133. data/lib/cocina/models/title_builder.rb +0 -208
@@ -23,8 +23,6 @@ module Cocina
23
23
  raise ValidationError, e.message
24
24
  end
25
25
 
26
- # rubocop:disable Metrics/AbcSize
27
- # rubocop:disable Metrics/CyclomaticComplexity
28
26
  def self.operation_has_cocina_version?(request_operation)
29
27
  schema = request_operation.operation_object.request_body.content['application/json'].schema
30
28
  all_of_properties = Array(schema.all_of&.flat_map { |all_of| all_of.properties&.keys }).compact
@@ -32,8 +30,6 @@ module Cocina
32
30
  properties = Array(schema.properties&.keys)
33
31
  (properties + all_of_properties + one_of_properties).include?('cocinaVersion')
34
32
  end
35
- # rubocop:enable Metrics/AbcSize
36
- # rubocop:enable Metrics/CyclomaticComplexity
37
33
  private_class_method :operation_has_cocina_version?
38
34
 
39
35
  # rubocop:disable Style/ClassVars
@@ -10,6 +10,7 @@ module Cocina
10
10
  DarkValidator,
11
11
  PurlValidator,
12
12
  CatalogLinksValidator,
13
+ AssociatedNameValidator,
13
14
  DescriptionTypesValidator
14
15
  ].freeze
15
16
 
@@ -2,6 +2,6 @@
2
2
 
3
3
  module Cocina
4
4
  module Models
5
- VERSION = '0.74.0'
5
+ VERSION = '0.76.0'
6
6
  end
7
7
  end
@@ -8,8 +8,8 @@ module Cocina
8
8
  # Download access level.
9
9
  attribute :download, Types::Strict::String.enum('none', 'stanford', 'world')
10
10
  # Not used for this access type, must be null.
11
- attribute :location, Types::Strict::String.optional.enum('').meta(omittable: true)
12
- attribute :controlledDigitalLending, Types::Strict::Bool.enum(false).meta(omittable: true)
11
+ attribute? :location, Types::Strict::String.optional.enum('')
12
+ attribute? :controlledDigitalLending, Types::Strict::Bool.default(false).enum(false)
13
13
  end
14
14
  end
15
15
  end
data/lib/cocina/models.rb CHANGED
@@ -9,8 +9,11 @@ require 'yaml'
9
9
  require 'openapi_parser'
10
10
  require 'openapi3_parser'
11
11
  require 'active_support'
12
+ require 'active_support/core_ext/class/attribute'
13
+ require 'active_support/core_ext/enumerable'
12
14
  require 'active_support/core_ext/hash/indifferent_access'
13
15
  require 'active_support/core_ext/string'
16
+ require 'active_support/core_ext/object/deep_dup'
14
17
  require 'thor'
15
18
 
16
19
  # Help Zeitwerk find some of our classes
@@ -24,6 +27,7 @@ class CocinaModelsInflector < Zeitwerk::Inflector
24
27
  'dro_with_metadata' => 'DROWithMetadata',
25
28
  'request_dro_structural' => 'RequestDROStructural',
26
29
  'rspec' => 'RSpec',
30
+ 'value_uri' => 'ValueURI',
27
31
  'version' => 'VERSION'
28
32
  }.freeze
29
33
 
@@ -0,0 +1,157 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Cocina
4
+ module RSpec
5
+ # Factories for Cocina model objects.
6
+ class Factories
7
+ # Provides the build method.
8
+ module Methods
9
+ def build(type, ...)
10
+ # If we don't support this factory, maybe factory_bot does.
11
+ Factories.supported_type?(type) ? Factories.build(type, ...) : super
12
+ end
13
+ end
14
+
15
+ def self.supported_type?(type)
16
+ %i[dro collection admin_policy dro_with_metadata collection_with_metadata admin_policy_with_metadata].include?(type)
17
+ end
18
+
19
+ WITH_METADATA_SUFFIX = '_with_metadata'
20
+
21
+ def self.build(type, attributes = {})
22
+ raise "Unsupported factory type #{type}" unless supported_type?(type)
23
+
24
+ build_type = type.to_s.delete_suffix(WITH_METADATA_SUFFIX)
25
+
26
+ fixture = public_send("build_#{build_type}".to_sym, attributes)
27
+ return fixture unless type.end_with?(WITH_METADATA_SUFFIX)
28
+
29
+ Cocina::Models.with_metadata(fixture, 'abc123')
30
+ end
31
+
32
+ DRO_DEFAULTS = {
33
+ type: Cocina::Models::ObjectType.object,
34
+ id: 'druid:bc234fg5678',
35
+ version: 1,
36
+ label: 'test object',
37
+ title: 'test object',
38
+ source_id: 'sul:1234',
39
+ admin_policy_id: 'druid:hv992ry2431'
40
+ }.freeze
41
+
42
+ COLLECTION_DEFAULTS = DRO_DEFAULTS.except(:source_id).merge(type: Cocina::Models::ObjectType.collection)
43
+
44
+ ADMIN_POLICY_DEFAULTS = {
45
+ type: Cocina::Models::ObjectType.admin_policy,
46
+ id: 'druid:bc234fg5678',
47
+ version: 1,
48
+ label: 'test admin policy',
49
+ title: 'test admin policy',
50
+ admin_policy_id: 'druid:hv992ry2431',
51
+ agreement_id: 'druid:hp308wm0436'
52
+ }.freeze
53
+
54
+ # rubocop:disable Metrics/ParameterLists
55
+ def self.build_dro_properties(type:, id:, version:, label:, title:, source_id:, admin_policy_id:,
56
+ barcode: nil, catkeys: [], collection_ids: [])
57
+ {
58
+ type: type,
59
+ externalIdentifier: id,
60
+ version: version,
61
+ label: label,
62
+ access: {},
63
+ administrative: { hasAdminPolicy: admin_policy_id },
64
+ description: {
65
+ title: [{ value: title }],
66
+ purl: "https://purl.stanford.edu/#{id.delete_prefix('druid:')}"
67
+ },
68
+ identification: {
69
+ sourceId: source_id
70
+ },
71
+ structural: {
72
+ isMemberOf: collection_ids
73
+ }
74
+ }.tap do |props|
75
+ if catkeys.present?
76
+ props[:identification][:catalogLinks] = catkeys.map.with_index do |catkey, index|
77
+ { catalog: 'symphony', catalogRecordId: catkey, refresh: index.zero? }
78
+ end
79
+ end
80
+ props[:identification][:barcode] = barcode if barcode
81
+ end
82
+ end
83
+ # rubocop:enable Metrics/ParameterLists
84
+
85
+ def self.build_dro(attributes)
86
+ Cocina::Models.build(build_dro_properties(**DRO_DEFAULTS.merge(attributes)))
87
+ end
88
+
89
+ # rubocop:disable Metrics/ParameterLists
90
+ def self.build_collection_properties(type:, id:, version:, label:, title:, admin_policy_id:, source_id: nil, catkeys: [])
91
+ {
92
+ type: type,
93
+ externalIdentifier: id,
94
+ version: version,
95
+ label: label,
96
+ access: {},
97
+ administrative: { hasAdminPolicy: admin_policy_id },
98
+ description: {
99
+ title: [{ value: title }],
100
+ purl: "https://purl.stanford.edu/#{id.delete_prefix('druid:')}"
101
+ },
102
+ identification: {}
103
+ }.tap do |props|
104
+ if catkeys.present?
105
+ props[:identification][:catalogLinks] = catkeys.map.with_index do |catkey, index|
106
+ { catalog: 'symphony', catalogRecordId: catkey, refresh: index.zero? }
107
+ end
108
+ end
109
+ props[:identification][:sourceId] = source_id if source_id
110
+ end
111
+ end
112
+ # rubocop:enable Metrics/ParameterLists
113
+
114
+ def self.build_collection(attributes)
115
+ Cocina::Models.build(build_collection_properties(**COLLECTION_DEFAULTS.merge(attributes)))
116
+ end
117
+
118
+ def self.build_admin_policy(attributes)
119
+ Cocina::Models.build(build_admin_policy_properties(**ADMIN_POLICY_DEFAULTS.merge(attributes)))
120
+ end
121
+
122
+ # rubocop:disable Metrics/ParameterLists
123
+ def self.build_admin_policy_properties(type:, id:, version:, label:, title:,
124
+ admin_policy_id:, agreement_id:,
125
+ use_statement: nil, copyright: nil, license: nil,
126
+ registration_workflow: nil, collections_for_registration: nil,
127
+ without_description: false)
128
+ {
129
+ type: type,
130
+ externalIdentifier: id,
131
+ version: version,
132
+ label: label,
133
+ administrative: {
134
+ hasAdminPolicy: admin_policy_id,
135
+ hasAgreement: agreement_id,
136
+ accessTemplate: {
137
+ view: 'world',
138
+ download: 'world'
139
+ }
140
+ },
141
+ description: {
142
+ title: [{ value: title }],
143
+ purl: "https://purl.stanford.edu/#{id.delete_prefix('druid:')}"
144
+ }
145
+ }.tap do |props|
146
+ props[:administrative][:accessTemplate][:useAndReproductionStatement] = use_statement if use_statement
147
+ props[:administrative][:accessTemplate][:copyright] = copyright if copyright
148
+ props[:administrative][:accessTemplate][:license] = license if license
149
+ props[:administrative][:registrationWorkflow] = registration_workflow if registration_workflow
150
+ props[:administrative][:collectionsForRegistration] = collections_for_registration if collections_for_registration
151
+ props.delete(:description) if without_description
152
+ end
153
+ end
154
+ # rubocop:enable Metrics/ParameterLists
155
+ end
156
+ end
157
+ end
data/lib/cocina/rspec.rb CHANGED
@@ -4,7 +4,9 @@ require 'rspec/core'
4
4
  require 'rspec/matchers'
5
5
  require 'super_diff/rspec'
6
6
  require 'cocina/rspec/matchers'
7
+ require 'cocina/rspec/factories'
7
8
 
8
9
  RSpec.configure do |config|
9
10
  config.include Cocina::RSpec::Matchers
11
+ config.include Cocina::RSpec::Factories::Methods
10
12
  end
data/openapi.yml CHANGED
@@ -383,6 +383,7 @@ components:
383
383
  catalogRecordId:
384
384
  description: Record identifier that is unique within the context of the linked record's catalog.
385
385
  type: string
386
+ pattern: '^\d+(:\d+)*$'
386
387
  example: '11403803'
387
388
  required:
388
389
  - catalog
@@ -523,7 +524,7 @@ components:
523
524
  items:
524
525
  $ref: "#/components/schemas/DescriptiveValue"
525
526
  type:
526
- description: Entity type of the contributor (person, organization, etc.). See https://sul-dlss.github.io/cocina-models/description_types.html for valid types.
527
+ description: 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.
527
528
  type: string
528
529
  status:
529
530
  description: Status of the contributor relative to other parallel contributors
@@ -579,7 +580,6 @@ components:
579
580
  required:
580
581
  - view
581
582
  - download
582
- - controlledDigitalLending
583
583
  DarkAccess:
584
584
  type: object
585
585
  properties:
@@ -712,7 +712,7 @@ components:
712
712
  # https://github.com/interagent/committee/issues/286
713
713
  # - type: integer
714
714
  type:
715
- description: Type of value provided by the descriptive element. See https://sul-dlss.github.io/cocina-models/description_types.html for valid types.
715
+ description: Type of value provided by the descriptive element. See https://github.com/sul-dlss/cocina-models/blob/main/docs/description_types.md for valid types.
716
716
  type: string
717
717
  status:
718
718
  description: Status of the descriptive element value relative to other instances
@@ -788,7 +788,7 @@ components:
788
788
  items:
789
789
  $ref: "#/components/schemas/DescriptiveValue"
790
790
  type:
791
- description: Entity type of the contributor (person, organization, etc.). See https://sul-dlss.github.io/cocina-models/description_types.html for valid types.
791
+ description: 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.
792
792
  type: string
793
793
  status:
794
794
  description: Status of the contributor relative to other parallel contributors (e.g. the primary author among a group of contributors).
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.74.0
4
+ version: 0.76.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-15 00:00:00.000000000 Z
11
+ date: 2022-04-28 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: activesupport
@@ -66,6 +66,34 @@ dependencies:
66
66
  - - "~>"
67
67
  - !ruby/object:Gem::Version
68
68
  version: '1.1'
69
+ - !ruby/object:Gem::Dependency
70
+ name: equivalent-xml
71
+ requirement: !ruby/object:Gem::Requirement
72
+ requirements:
73
+ - - ">="
74
+ - !ruby/object:Gem::Version
75
+ version: '0'
76
+ type: :runtime
77
+ prerelease: false
78
+ version_requirements: !ruby/object:Gem::Requirement
79
+ requirements:
80
+ - - ">="
81
+ - !ruby/object:Gem::Version
82
+ version: '0'
83
+ - !ruby/object:Gem::Dependency
84
+ name: nokogiri
85
+ requirement: !ruby/object:Gem::Requirement
86
+ requirements:
87
+ - - ">="
88
+ - !ruby/object:Gem::Version
89
+ version: '0'
90
+ type: :runtime
91
+ prerelease: false
92
+ version_requirements: !ruby/object:Gem::Requirement
93
+ requirements:
94
+ - - ">="
95
+ - !ruby/object:Gem::Version
96
+ version: '0'
69
97
  - !ruby/object:Gem::Dependency
70
98
  name: openapi3_parser
71
99
  requirement: !ruby/object:Gem::Requirement
@@ -275,7 +303,6 @@ files:
275
303
  - bin/setup
276
304
  - cocina-models.gemspec
277
305
  - description_types.yml
278
- - docs/_config.yml
279
306
  - docs/cocina-base.jsonld
280
307
  - docs/description_types.md
281
308
  - docs/index.html
@@ -313,6 +340,10 @@ files:
313
340
  - lib/cocina/models/admin_policy_with_metadata.rb
314
341
  - lib/cocina/models/administrative.rb
315
342
  - lib/cocina/models/applies_to.rb
343
+ - lib/cocina/models/builders/dro_rights_description_builder.rb
344
+ - lib/cocina/models/builders/name_title_group_builder.rb
345
+ - lib/cocina/models/builders/rights_description_builder.rb
346
+ - lib/cocina/models/builders/title_builder.rb
316
347
  - lib/cocina/models/business_barcode.rb
317
348
  - lib/cocina/models/catalog_link.rb
318
349
  - lib/cocina/models/catkey_barcode.rb
@@ -341,7 +372,6 @@ files:
341
372
  - lib/cocina/models/doi.rb
342
373
  - lib/cocina/models/dro.rb
343
374
  - lib/cocina/models/dro_access.rb
344
- - lib/cocina/models/dro_rights_description_builder.rb
345
375
  - lib/cocina/models/dro_structural.rb
346
376
  - lib/cocina/models/dro_with_metadata.rb
347
377
  - lib/cocina/models/druid.rb
@@ -360,6 +390,63 @@ files:
360
390
  - lib/cocina/models/license.rb
361
391
  - lib/cocina/models/location_based_access.rb
362
392
  - lib/cocina/models/location_based_download_access.rb
393
+ - lib/cocina/models/mapping/error_notifier.rb
394
+ - lib/cocina/models/mapping/from_mods/access.rb
395
+ - lib/cocina/models/mapping/from_mods/admin_metadata.rb
396
+ - lib/cocina/models/mapping/from_mods/alt_rep_group.rb
397
+ - lib/cocina/models/mapping/from_mods/authority.rb
398
+ - lib/cocina/models/mapping/from_mods/contributor.rb
399
+ - lib/cocina/models/mapping/from_mods/description.rb
400
+ - lib/cocina/models/mapping/from_mods/description_builder.rb
401
+ - lib/cocina/models/mapping/from_mods/event.rb
402
+ - lib/cocina/models/mapping/from_mods/form.rb
403
+ - lib/cocina/models/mapping/from_mods/geographic.rb
404
+ - lib/cocina/models/mapping/from_mods/hydrus_default_title_builder.rb
405
+ - lib/cocina/models/mapping/from_mods/identifier.rb
406
+ - lib/cocina/models/mapping/from_mods/identifier_builder.rb
407
+ - lib/cocina/models/mapping/from_mods/identifier_type.rb
408
+ - lib/cocina/models/mapping/from_mods/language.rb
409
+ - lib/cocina/models/mapping/from_mods/language_script.rb
410
+ - lib/cocina/models/mapping/from_mods/language_term.rb
411
+ - lib/cocina/models/mapping/from_mods/name_builder.rb
412
+ - lib/cocina/models/mapping/from_mods/note.rb
413
+ - lib/cocina/models/mapping/from_mods/part_builder.rb
414
+ - lib/cocina/models/mapping/from_mods/primary.rb
415
+ - lib/cocina/models/mapping/from_mods/purl.rb
416
+ - lib/cocina/models/mapping/from_mods/related_resource.rb
417
+ - lib/cocina/models/mapping/from_mods/subject.rb
418
+ - lib/cocina/models/mapping/from_mods/subject_authority_codes.rb
419
+ - lib/cocina/models/mapping/from_mods/title.rb
420
+ - lib/cocina/models/mapping/from_mods/title_builder.rb
421
+ - lib/cocina/models/mapping/from_mods/title_builder_strategy.rb
422
+ - lib/cocina/models/mapping/from_mods/value_uri.rb
423
+ - lib/cocina/models/mapping/normalizers/base.rb
424
+ - lib/cocina/models/mapping/normalizers/mods/geo_extension_normalizer.rb
425
+ - lib/cocina/models/mapping/normalizers/mods/name_normalizer.rb
426
+ - lib/cocina/models/mapping/normalizers/mods/origin_info_normalizer.rb
427
+ - lib/cocina/models/mapping/normalizers/mods/subject_normalizer.rb
428
+ - lib/cocina/models/mapping/normalizers/mods/title_normalizer.rb
429
+ - lib/cocina/models/mapping/normalizers/mods_normalizer.rb
430
+ - lib/cocina/models/mapping/purl.rb
431
+ - lib/cocina/models/mapping/to_mods/access.rb
432
+ - lib/cocina/models/mapping/to_mods/admin_metadata.rb
433
+ - lib/cocina/models/mapping/to_mods/contributor.rb
434
+ - lib/cocina/models/mapping/to_mods/description.rb
435
+ - lib/cocina/models/mapping/to_mods/event.rb
436
+ - lib/cocina/models/mapping/to_mods/form.rb
437
+ - lib/cocina/models/mapping/to_mods/geographic.rb
438
+ - lib/cocina/models/mapping/to_mods/id_generator.rb
439
+ - lib/cocina/models/mapping/to_mods/identifier.rb
440
+ - lib/cocina/models/mapping/to_mods/language.rb
441
+ - lib/cocina/models/mapping/to_mods/mods_writer.rb
442
+ - lib/cocina/models/mapping/to_mods/name_title_group.rb
443
+ - lib/cocina/models/mapping/to_mods/name_writer.rb
444
+ - lib/cocina/models/mapping/to_mods/note.rb
445
+ - lib/cocina/models/mapping/to_mods/part_writer.rb
446
+ - lib/cocina/models/mapping/to_mods/related_resource.rb
447
+ - lib/cocina/models/mapping/to_mods/role_writer.rb
448
+ - lib/cocina/models/mapping/to_mods/subject.rb
449
+ - lib/cocina/models/mapping/to_mods/title.rb
363
450
  - lib/cocina/models/message_digest.rb
364
451
  - lib/cocina/models/object_metadata.rb
365
452
  - lib/cocina/models/object_type.rb
@@ -377,7 +464,6 @@ files:
377
464
  - lib/cocina/models/request_file_set.rb
378
465
  - lib/cocina/models/request_file_set_structural.rb
379
466
  - lib/cocina/models/request_identification.rb
380
- - lib/cocina/models/rights_description_builder.rb
381
467
  - lib/cocina/models/sequence.rb
382
468
  - lib/cocina/models/source.rb
383
469
  - lib/cocina/models/source_id.rb
@@ -385,8 +471,8 @@ files:
385
471
  - lib/cocina/models/standard_barcode.rb
386
472
  - lib/cocina/models/stanford_access.rb
387
473
  - lib/cocina/models/title.rb
388
- - lib/cocina/models/title_builder.rb
389
474
  - lib/cocina/models/validatable.rb
475
+ - lib/cocina/models/validators/associated_name_validator.rb
390
476
  - lib/cocina/models/validators/catalog_links_validator.rb
391
477
  - lib/cocina/models/validators/dark_validator.rb
392
478
  - lib/cocina/models/validators/description_types_validator.rb
@@ -397,6 +483,7 @@ files:
397
483
  - lib/cocina/models/vocabulary.rb
398
484
  - lib/cocina/models/world_access.rb
399
485
  - lib/cocina/rspec.rb
486
+ - lib/cocina/rspec/factories.rb
400
487
  - lib/cocina/rspec/matchers.rb
401
488
  - openapi.yml
402
489
  homepage: https://github.com/sul-dlss/cocina-models
data/docs/_config.yml DELETED
@@ -1 +0,0 @@
1
- theme: jekyll-theme-tactile
@@ -1,67 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- module Cocina
4
- module Models
5
- # Rights description builder for items
6
- class DroRightsDescriptionBuilder < RightsDescriptionBuilder
7
- # @param [Cocina::Models::DRO] cocina_item
8
-
9
- # This overrides the superclass
10
- # @return [Cocina::Models::DROAccess]
11
- def object_access
12
- @object_access ||= cocina.access
13
- end
14
-
15
- private
16
-
17
- def object_level_access
18
- super + access_level_from_files.uniq.map { |str| "#{str} (file)" }
19
- end
20
-
21
- def access_level_from_files
22
- # dark access doesn't permit any file access
23
- return [] if object_access.view == 'dark'
24
-
25
- file_access_nodes.reject { |fa| same_as_object_access?(fa) }.flat_map do |fa|
26
- file_access_from_file(fa)
27
- end
28
- end
29
-
30
- # rubocop:disable Metrics/MethodLength
31
- def file_access_from_file(file_access)
32
- basic_access = if file_access[:view] == 'location-based'
33
- "location: #{file_access[:location]}"
34
- else
35
- file_access[:view]
36
- end
37
-
38
- return [basic_access] if file_access[:view] == file_access[:download]
39
-
40
- basic_access += ' (no-download)' if file_access[:view] != 'dark'
41
-
42
- case file_access[:download]
43
- when 'stanford'
44
- [basic_access, 'stanford']
45
- when 'location-based'
46
- # Here we're using location to mean download location.
47
- [basic_access, "location: #{file_access[:location]}"]
48
- else
49
- [basic_access]
50
- end
51
- end
52
- # rubocop:enable Metrics/MethodLength
53
-
54
- def same_as_object_access?(file_access)
55
- (file_access[:view] == object_access.view && file_access[:download] == object_access.download) ||
56
- (object_access.view == 'citation-only' && file_access[:view] == 'dark')
57
- end
58
-
59
- def file_access_nodes
60
- Array(cocina.structural.contains)
61
- .flat_map { |fs| Array(fs.structural.contains) }
62
- .map { |file| file.access.to_h }
63
- .uniq
64
- end
65
- end
66
- end
67
- end
@@ -1,81 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- module Cocina
4
- module Models
5
- # RightsDescriptionBuilder
6
- class RightsDescriptionBuilder
7
- # @param [Cocina::Models::AdminPolicy, Cocina::Models::DRO] cocina_object
8
- def self.build(cocina_object)
9
- new(cocina_object).build
10
- end
11
-
12
- def initialize(cocina_object)
13
- @cocina = cocina_object
14
- end
15
-
16
- # This is set up to work for APOs, but this method is to be overridden on sub classes
17
- # @return [Cocina::Models::AdminPolicyDefaultAccess]
18
- def object_access
19
- @object_access ||= cocina.administrative.accessTemplate
20
- end
21
-
22
- def build
23
- return 'controlled digital lending' if object_access.controlledDigitalLending
24
-
25
- return ['dark'] if object_access.view == 'dark'
26
-
27
- object_level_access
28
- end
29
-
30
- private
31
-
32
- attr_reader :cocina
33
-
34
- # rubocop:disable Metrics/MethodLength
35
- def object_level_access
36
- case object_access.view
37
- when 'citation-only'
38
- ['citation']
39
- when 'world'
40
- world_object_access
41
- when 'location-based'
42
- case object_access.download
43
- when 'none'
44
- ["location: #{object_access.location} (no-download)"]
45
- else
46
- ["location: #{object_access.location}"]
47
- end
48
- when 'stanford'
49
- stanford_object_access
50
- end
51
- end
52
- # rubocop:enable Metrics/MethodLength
53
-
54
- def stanford_object_access
55
- case object_access.download
56
- when 'none'
57
- ['stanford (no-download)']
58
- when 'location-based'
59
- # this is an odd case we might want to move away from. See https://github.com/sul-dlss/cocina-models/issues/258
60
- ['stanford (no-download)', "location: #{object_access.location}"]
61
- else
62
- ['stanford']
63
- end
64
- end
65
-
66
- def world_object_access
67
- case object_access.download
68
- when 'stanford'
69
- ['stanford', 'world (no-download)']
70
- when 'none'
71
- ['world (no-download)']
72
- when 'world'
73
- ['world']
74
- when 'location-based'
75
- # this is an odd case we might want to move away from. See https://github.com/sul-dlss/cocina-models/issues/258
76
- ['world (no-download)', "location: #{object_access.location}"]
77
- end
78
- end
79
- end
80
- end
81
- end