hydra-pcdm 0.0.1 → 0.1.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/.travis.yml +4 -0
- data/Gemfile +0 -4
- data/README.md +2 -2
- data/hydra-pcdm.gemspec +2 -1
- data/lib/hydra/pcdm.rb +21 -30
- data/lib/hydra/pcdm/ancestor_checker.rb +18 -0
- data/lib/hydra/pcdm/collection_indexer.rb +2 -2
- data/lib/hydra/pcdm/deep_member_iterator.rb +31 -0
- data/lib/hydra/pcdm/models/concerns/collection_behavior.rb +20 -57
- data/lib/hydra/pcdm/models/concerns/object_behavior.rb +12 -37
- data/lib/hydra/pcdm/models/concerns/pcdm_behavior.rb +34 -0
- data/lib/hydra/pcdm/object_indexer.rb +1 -1
- data/lib/hydra/pcdm/services/file/get_mime_type.rb +1 -1
- data/lib/hydra/pcdm/validators.rb +8 -0
- data/lib/hydra/pcdm/validators/ancestor_validator.rb +26 -0
- data/lib/hydra/pcdm/validators/composite_validator.rb +17 -0
- data/lib/hydra/pcdm/validators/pcdm_object_validator.rb +9 -0
- data/lib/hydra/pcdm/validators/pcdm_validator.rb +9 -0
- data/lib/hydra/pcdm/version.rb +1 -1
- data/lib/hydra/pcdm/vocab/pcdm_terms.rb +1 -1
- data/spec/hydra/pcdm/ancestor_checker_spec.rb +29 -0
- data/spec/hydra/pcdm/collection_indexer_spec.rb +11 -11
- data/spec/hydra/pcdm/deep_member_iterator_spec.rb +52 -0
- data/spec/hydra/pcdm/models/collection_spec.rb +691 -17
- data/spec/hydra/pcdm/models/file_spec.rb +16 -0
- data/spec/hydra/pcdm/models/object_spec.rb +576 -27
- data/spec/hydra/pcdm/object_indexer_spec.rb +6 -6
- data/spec/spec_helper.rb +8 -1
- metadata +31 -52
- data/lib/hydra/pcdm/services/collection/add_collection.rb +0 -20
- data/lib/hydra/pcdm/services/collection/add_object.rb +0 -19
- data/lib/hydra/pcdm/services/collection/add_related_object.rb +0 -21
- data/lib/hydra/pcdm/services/collection/get_collections.rb +0 -18
- data/lib/hydra/pcdm/services/collection/get_objects.rb +0 -18
- data/lib/hydra/pcdm/services/collection/get_related_objects.rb +0 -17
- data/lib/hydra/pcdm/services/collection/remove_collection.rb +0 -36
- data/lib/hydra/pcdm/services/collection/remove_object.rb +0 -43
- data/lib/hydra/pcdm/services/collection/remove_related_object.rb +0 -36
- data/lib/hydra/pcdm/services/object/add_object.rb +0 -20
- data/lib/hydra/pcdm/services/object/add_related_object.rb +0 -21
- data/lib/hydra/pcdm/services/object/get_objects.rb +0 -18
- data/lib/hydra/pcdm/services/object/get_related_objects.rb +0 -17
- data/lib/hydra/pcdm/services/object/remove_object.rb +0 -43
- data/lib/hydra/pcdm/services/object/remove_related_object.rb +0 -36
- data/spec/hydra/pcdm/services/collection/add_collection_spec.rb +0 -197
- data/spec/hydra/pcdm/services/collection/add_object_spec.rb +0 -132
- data/spec/hydra/pcdm/services/collection/add_related_object_spec.rb +0 -94
- data/spec/hydra/pcdm/services/collection/get_collections_spec.rb +0 -40
- data/spec/hydra/pcdm/services/collection/get_objects_spec.rb +0 -40
- data/spec/hydra/pcdm/services/collection/get_related_objects_spec.rb +0 -37
- data/spec/hydra/pcdm/services/collection/remove_collection_spec.rb +0 -143
- data/spec/hydra/pcdm/services/collection/remove_object_spec.rb +0 -180
- data/spec/hydra/pcdm/services/collection/remove_related_object_spec.rb +0 -146
- data/spec/hydra/pcdm/services/file/add_type_spec.rb +0 -19
- data/spec/hydra/pcdm/services/object/add_object_spec.rb +0 -186
- data/spec/hydra/pcdm/services/object/add_related_object_spec.rb +0 -94
- data/spec/hydra/pcdm/services/object/get_objects_spec.rb +0 -33
- data/spec/hydra/pcdm/services/object/get_related_objects_spec.rb +0 -39
- data/spec/hydra/pcdm/services/object/remove_object_spec.rb +0 -158
- data/spec/hydra/pcdm/services/object/remove_related_object_spec.rb +0 -126
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: c08bc42e4a5ea8d987f0830db5474b9e2d7c1ada
|
4
|
+
data.tar.gz: 7f3e582637ddb0254b8cc399ab71d45f9f7ac482
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 70d9932eddb9b3c3581ef2d14e7628fa15b6034d4dc607d3d92df74ea92ce19d40b5f5712b6eb2ef8421f3f4cd59a382dc683368eec2a2a123f8a4790bdcd913
|
7
|
+
data.tar.gz: b5b4827cc4a421cb9f35821d48504c0cbf4c072e191fad3bf29bcdbcdcb76275de3846c0e124f60e47c45d606a8a4b80967f6ee2cb780c29a03a1c84009e41a3
|
data/.travis.yml
CHANGED
data/Gemfile
CHANGED
data/README.md
CHANGED
@@ -33,12 +33,12 @@ We are using [Web ACL](http://www.w3.org/wiki/WebAccessControl) as implemented b
|
|
33
33
|
|
34
34
|
## PCDM Model
|
35
35
|
|
36
|
-
Reference: [Portland Common Data Model](https://
|
36
|
+
Reference: [Portland Common Data Model](https://github.com/duraspace/pcdm/wiki)
|
37
37
|
|
38
38
|
|
39
39
|
### Model Definition
|
40
40
|
|
41
|
-
![PCDM Model Definition](https://
|
41
|
+
![PCDM Model Definition](https://raw.githubusercontent.com/wiki/duraspace/pcdm/images/coll-object-file.png)
|
42
42
|
|
43
43
|
|
44
44
|
### Example
|
data/hydra-pcdm.gemspec
CHANGED
@@ -19,7 +19,8 @@ Gem::Specification.new do |spec|
|
|
19
19
|
spec.test_files = spec.files.grep(%r{^(test|spec|features)/})
|
20
20
|
spec.require_paths = ["lib"]
|
21
21
|
|
22
|
-
spec.add_dependency 'activefedora-aggregation', '~> 0.
|
22
|
+
spec.add_dependency 'activefedora-aggregation', '~> 0.4'
|
23
|
+
spec.add_dependency 'mime-types', '>= 1'
|
23
24
|
|
24
25
|
spec.add_development_dependency 'bundler', '~> 1.6'
|
25
26
|
spec.add_development_dependency 'jettywrapper', '>= 2.0.0'
|
data/lib/hydra/pcdm.rb
CHANGED
@@ -1,4 +1,7 @@
|
|
1
1
|
require 'active_support'
|
2
|
+
require 'mime/types'
|
3
|
+
require 'active_fedora/aggregation'
|
4
|
+
|
2
5
|
|
3
6
|
module Hydra
|
4
7
|
module PCDM
|
@@ -10,59 +13,47 @@ module Hydra
|
|
10
13
|
autoload :SweetjplVocabularies, 'hydra/pcdm/vocab/sweetjpl_terms'
|
11
14
|
|
12
15
|
# models
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
+
autoload_under 'models' do
|
17
|
+
autoload :Collection
|
18
|
+
autoload :Object
|
19
|
+
autoload :File
|
20
|
+
end
|
16
21
|
|
17
22
|
# behavior concerns
|
18
|
-
|
19
|
-
|
23
|
+
autoload_under 'models/concerns' do
|
24
|
+
autoload :CollectionBehavior
|
25
|
+
autoload :ObjectBehavior
|
26
|
+
autoload :PcdmBehavior
|
27
|
+
end
|
20
28
|
|
21
29
|
autoload :CollectionIndexer
|
22
30
|
autoload :ObjectIndexer
|
23
31
|
|
24
|
-
# collection services
|
25
|
-
autoload :AddCollectionToCollection, 'hydra/pcdm/services/collection/add_collection'
|
26
|
-
autoload :AddObjectToCollection, 'hydra/pcdm/services/collection/add_object'
|
27
|
-
autoload :AddRelatedObjectToCollection, 'hydra/pcdm/services/collection/add_related_object'
|
28
|
-
autoload :GetCollectionsFromCollection, 'hydra/pcdm/services/collection/get_collections'
|
29
|
-
autoload :GetObjectsFromCollection, 'hydra/pcdm/services/collection/get_objects'
|
30
|
-
autoload :GetRelatedObjectsFromCollection, 'hydra/pcdm/services/collection/get_related_objects'
|
31
|
-
autoload :RemoveCollectionFromCollection, 'hydra/pcdm/services/collection/remove_collection'
|
32
|
-
autoload :RemoveObjectFromCollection, 'hydra/pcdm/services/collection/remove_object'
|
33
|
-
autoload :RemoveRelatedObjectFromCollection, 'hydra/pcdm/services/collection/remove_related_object'
|
34
|
-
|
35
32
|
# file services
|
36
33
|
autoload :AddTypeToFile, 'hydra/pcdm/services/file/add_type'
|
37
34
|
autoload :GetMimeTypeForFile, 'hydra/pcdm/services/file/get_mime_type'
|
38
35
|
|
36
|
+
# Iterators
|
37
|
+
autoload :DeepMemberIterator, 'hydra/pcdm/deep_member_iterator'
|
39
38
|
|
40
|
-
#
|
41
|
-
autoload :
|
42
|
-
autoload :
|
43
|
-
autoload :AddRelatedObjectToObject, 'hydra/pcdm/services/object/add_related_object'
|
44
|
-
autoload :CreateObject, 'hydra/pcdm/services/object/create'
|
45
|
-
autoload :GetObjectsFromObject, 'hydra/pcdm/services/object/get_objects'
|
46
|
-
autoload :GetRelatedObjectsFromObject, 'hydra/pcdm/services/object/get_related_objects'
|
47
|
-
autoload :GetFilesFromObject, 'hydra/pcdm/services/object/get_collections'
|
48
|
-
autoload :RemoveObjectFromObject, 'hydra/pcdm/services/object/remove_object'
|
49
|
-
autoload :RemoveRelatedObjectFromObject, 'hydra/pcdm/services/object/remove_related_object'
|
50
|
-
|
39
|
+
# Associations
|
40
|
+
autoload :AncestorChecker, 'hydra/pcdm/ancestor_checker'
|
41
|
+
autoload :Validators, 'hydra/pcdm/validators'
|
51
42
|
|
52
43
|
# model validations
|
53
44
|
def self.collection? collection
|
54
45
|
return false unless collection.respond_to? :type
|
55
|
-
collection.type.include? RDFVocabularies::PCDMTerms.Collection
|
46
|
+
Array(collection.type).include? RDFVocabularies::PCDMTerms.Collection
|
56
47
|
end
|
57
48
|
|
58
49
|
def self.object? object
|
59
50
|
return false unless object.respond_to? :type
|
60
|
-
object.type.include? RDFVocabularies::PCDMTerms.Object
|
51
|
+
Array(object.type).include? RDFVocabularies::PCDMTerms.Object
|
61
52
|
end
|
62
53
|
|
63
54
|
def self.file? file
|
64
55
|
return false unless file.respond_to? :metadata_node
|
65
|
-
file.metadata_node.type.include? RDFVocabularies::PCDMTerms.File
|
56
|
+
Array(file.metadata_node.type).include? RDFVocabularies::PCDMTerms.File
|
66
57
|
end
|
67
58
|
|
68
59
|
end
|
@@ -0,0 +1,18 @@
|
|
1
|
+
module Hydra::PCDM
|
2
|
+
##
|
3
|
+
# Checks whether or not one object is an ancestor of another.
|
4
|
+
class AncestorChecker
|
5
|
+
attr_reader :record
|
6
|
+
|
7
|
+
# @param [ActiveFedora::Base] record The object which may have ancestors.
|
8
|
+
def initialize(record)
|
9
|
+
@record = record
|
10
|
+
end
|
11
|
+
|
12
|
+
# @param [#members] potential_ancestor Object which may be the ancestor of
|
13
|
+
# the initialized record.
|
14
|
+
def ancestor?(potential_ancestor)
|
15
|
+
record == potential_ancestor || Hydra::PCDM::DeepMemberIterator.new(potential_ancestor).include?(record)
|
16
|
+
end
|
17
|
+
end
|
18
|
+
end
|
@@ -3,8 +3,8 @@ module Hydra::PCDM
|
|
3
3
|
|
4
4
|
def generate_solr_document
|
5
5
|
super.tap do |solr_doc|
|
6
|
-
solr_doc["
|
7
|
-
solr_doc["
|
6
|
+
solr_doc["member_ids_ssim"] = object.member_ids
|
7
|
+
solr_doc["child_collection_ids_ssim"] = object.child_collection_ids
|
8
8
|
end
|
9
9
|
end
|
10
10
|
|
@@ -0,0 +1,31 @@
|
|
1
|
+
module Hydra::PCDM
|
2
|
+
##
|
3
|
+
# Iterates over a record's members and all of their members in a breadth-first
|
4
|
+
# search.
|
5
|
+
class DeepMemberIterator
|
6
|
+
include Enumerable
|
7
|
+
attr_reader :record
|
8
|
+
# @param [#members] record The object whose members are iterated across.
|
9
|
+
def initialize(record)
|
10
|
+
@record = HasMembers.new(record)
|
11
|
+
end
|
12
|
+
|
13
|
+
def each
|
14
|
+
record.members.each do |member|
|
15
|
+
yield member
|
16
|
+
end
|
17
|
+
record.members.each do |member|
|
18
|
+
DeepMemberIterator.new(member).each do |deep_member|
|
19
|
+
yield deep_member
|
20
|
+
end
|
21
|
+
end
|
22
|
+
end
|
23
|
+
end
|
24
|
+
##
|
25
|
+
# Small decorator to ensure that #members isn't undefined.
|
26
|
+
class HasMembers < SimpleDelegator
|
27
|
+
def members
|
28
|
+
__getobj__.try(:members) || []
|
29
|
+
end
|
30
|
+
end
|
31
|
+
end
|
@@ -1,79 +1,42 @@
|
|
1
|
-
require 'active_fedora/aggregation'
|
2
|
-
|
3
1
|
module Hydra::PCDM
|
2
|
+
|
3
|
+
# behavior:
|
4
|
+
# 1) Hydra::PCDM::Collection can aggregate (pcdm:hasMember) Hydra::PCDM::Collection (no infinite loop, e.g., A -> B -> C -> A)
|
5
|
+
# 2) Hydra::PCDM::Collection can aggregate (pcdm:hasMember) Hydra::PCDM::Object
|
6
|
+
# 3) Hydra::PCDM::Collection can aggregate (ore:aggregates) Hydra::PCDM::Object (Object related to the Collection)
|
7
|
+
|
8
|
+
# 4) Hydra::PCDM::Collection can NOT aggregate non-PCDM object
|
9
|
+
# 5) Hydra::PCDM::Collection can NOT contain (pcdm:hasFile) Hydra::PCDM::File
|
10
|
+
|
11
|
+
# 6) Hydra::PCDM::Collection can have descriptive metadata
|
12
|
+
# 7) Hydra::PCDM::Collection can have access metadata
|
13
|
+
#
|
4
14
|
module CollectionBehavior
|
5
15
|
extend ActiveSupport::Concern
|
6
16
|
|
7
17
|
included do
|
8
18
|
type RDFVocabularies::PCDMTerms.Collection
|
19
|
+
include ::Hydra::PCDM::PcdmBehavior
|
9
20
|
|
10
|
-
|
11
|
-
class_name: "ActiveFedora::Base"
|
12
|
-
|
13
|
-
indirectly_contains :related_objects, has_member_relation: RDF::Vocab::ORE.aggregates,
|
14
|
-
inserted_content_relation: RDF::Vocab::ORE.proxyFor, class_name: "ActiveFedora::Base",
|
15
|
-
through: 'ActiveFedora::Aggregation::Proxy', foreign_key: :target
|
21
|
+
filters_association :members, as: :child_collections, condition: :pcdm_collection?
|
16
22
|
end
|
17
23
|
|
18
24
|
module ClassMethods
|
19
25
|
def indexer
|
20
26
|
Hydra::PCDM::CollectionIndexer
|
21
27
|
end
|
22
|
-
|
23
|
-
|
24
|
-
# behavior:
|
25
|
-
# 1) Hydra::PCDM::Collection can aggregate (pcdm:hasMember) Hydra::PCDM::Collection (no infinite loop, e.g., A -> B -> C -> A)
|
26
|
-
# 2) Hydra::PCDM::Collection can aggregate (pcdm:hasMember) Hydra::PCDM::Object
|
27
|
-
# 3) Hydra::PCDM::Collection can aggregate (ore:aggregates) Hydra::PCDM::Object (Object related to the Collection)
|
28
|
-
|
29
|
-
# 4) Hydra::PCDM::Collection can NOT aggregate non-PCDM object
|
30
|
-
# 5) Hydra::PCDM::Collection can NOT contain (pcdm:hasFile) Hydra::PCDM::File
|
31
|
-
|
32
|
-
# 6) Hydra::PCDM::Collection can have descriptive metadata
|
33
|
-
# 7) Hydra::PCDM::Collection can have access metadata
|
34
|
-
|
35
|
-
def child_collections= collections
|
36
|
-
raise ArgumentError, "each collection must be a pcdm collection" unless collections.all? { |c| Hydra::PCDM.collection? c }
|
37
|
-
raise ArgumentError, "a collection can't be an ancestor of itself" if collection_ancestor?(collections)
|
38
|
-
self.members = objects + collections
|
39
|
-
end
|
40
|
-
|
41
|
-
def child_collections
|
42
|
-
members.to_a.select { |m| Hydra::PCDM.collection? m }
|
43
|
-
end
|
44
|
-
|
45
|
-
def objects= objects
|
46
|
-
raise ArgumentError, "each object must be a pcdm object" unless objects.all? { |o| Hydra::PCDM.object? o }
|
47
|
-
self.members = child_collections + objects
|
48
|
-
end
|
49
|
-
|
50
|
-
def objects
|
51
|
-
members.to_a.select { |m| Hydra::PCDM.object? m }
|
52
|
-
end
|
53
|
-
|
54
|
-
def collection_ancestor? collections
|
55
|
-
collections.each do |check|
|
56
|
-
return true if check.id == self.id
|
57
|
-
return true if ancestor?(check)
|
28
|
+
|
29
|
+
def type_validator
|
58
30
|
end
|
59
|
-
false
|
60
31
|
end
|
61
32
|
|
62
|
-
def
|
63
|
-
return true if collection.id == self.id
|
64
|
-
return false if collection.child_collections.empty?
|
65
|
-
current_collections = collection.child_collections
|
66
|
-
next_batch = []
|
67
|
-
while !current_collections.empty? do
|
68
|
-
current_collections.each do |c|
|
69
|
-
return true if c.id == self.id
|
70
|
-
next_batch += c.child_collections
|
71
|
-
end
|
72
|
-
current_collections = next_batch
|
73
|
-
end
|
33
|
+
def pcdm_object?
|
74
34
|
false
|
75
35
|
end
|
76
36
|
|
37
|
+
def pcdm_collection?
|
38
|
+
true
|
39
|
+
end
|
77
40
|
end
|
78
41
|
end
|
79
42
|
|
@@ -1,5 +1,3 @@
|
|
1
|
-
require 'active_fedora/aggregation'
|
2
|
-
|
3
1
|
module Hydra::PCDM
|
4
2
|
|
5
3
|
# behavior:
|
@@ -16,56 +14,34 @@ module Hydra::PCDM
|
|
16
14
|
|
17
15
|
included do
|
18
16
|
type RDFVocabularies::PCDMTerms.Object
|
19
|
-
|
20
|
-
aggregates :members, predicate: RDFVocabularies::PCDMTerms.hasMember,
|
21
|
-
class_name: "ActiveFedora::Base"
|
22
|
-
|
23
|
-
indirectly_contains :related_objects, has_member_relation: RDF::Vocab::ORE.aggregates,
|
24
|
-
inserted_content_relation: RDF::Vocab::ORE.proxyFor, class_name: "ActiveFedora::Base",
|
25
|
-
through: 'ActiveFedora::Aggregation::Proxy', foreign_key: :target
|
17
|
+
include ::Hydra::PCDM::PcdmBehavior
|
26
18
|
|
27
19
|
directly_contains :files, has_member_relation: RDFVocabularies::PCDMTerms.hasFile,
|
28
20
|
class_name: "Hydra::PCDM::File"
|
29
|
-
|
30
21
|
end
|
31
22
|
|
32
23
|
module ClassMethods
|
33
24
|
def indexer
|
34
25
|
Hydra::PCDM::ObjectIndexer
|
35
26
|
end
|
36
|
-
end
|
37
27
|
|
38
|
-
|
39
|
-
|
40
|
-
|
41
|
-
self.members = objects
|
28
|
+
def type_validator
|
29
|
+
@type_validator ||= Validators::PCDMObjectValidator
|
30
|
+
end
|
42
31
|
end
|
43
32
|
|
44
|
-
|
45
|
-
|
33
|
+
# @return [Boolean] whether this instance is a PCDM Object.
|
34
|
+
def pcdm_object?
|
35
|
+
true
|
46
36
|
end
|
47
37
|
|
48
|
-
|
49
|
-
|
50
|
-
return true if check.id == self.id
|
51
|
-
return true if ancestor?(check)
|
52
|
-
end
|
38
|
+
# @return [Boolean] whether this instance is a PCDM Collection.
|
39
|
+
def pcdm_collection?
|
53
40
|
false
|
54
41
|
end
|
55
42
|
|
56
|
-
def
|
57
|
-
|
58
|
-
return false if object.objects.empty?
|
59
|
-
current_objects = object.objects
|
60
|
-
next_batch = []
|
61
|
-
while !current_objects.empty? do
|
62
|
-
current_objects.each do |c|
|
63
|
-
return true if c.id == self.id
|
64
|
-
next_batch += c.objects
|
65
|
-
end
|
66
|
-
current_objects = next_batch
|
67
|
-
end
|
68
|
-
false
|
43
|
+
def parent_objects
|
44
|
+
aggregated_by.select(&:pcdm_object?)
|
69
45
|
end
|
70
46
|
|
71
47
|
def contains= files
|
@@ -81,7 +57,7 @@ module Hydra::PCDM
|
|
81
57
|
# filter_files_by_type(::RDF::URI("http://pcdm.org/ExtractedText"))
|
82
58
|
def filter_files_by_type uri
|
83
59
|
self.files.reject do |file|
|
84
|
-
file.metadata_node.
|
60
|
+
!file.metadata_node.type.include?(uri)
|
85
61
|
end
|
86
62
|
end
|
87
63
|
|
@@ -98,7 +74,6 @@ module Hydra::PCDM
|
|
98
74
|
return matching_files.first
|
99
75
|
end
|
100
76
|
end
|
101
|
-
|
102
77
|
end
|
103
78
|
end
|
104
79
|
|
@@ -0,0 +1,34 @@
|
|
1
|
+
module Hydra::PCDM
|
2
|
+
module PcdmBehavior
|
3
|
+
extend ActiveSupport::Concern
|
4
|
+
included do
|
5
|
+
aggregates :members, predicate: RDFVocabularies::PCDMTerms.hasMember,
|
6
|
+
class_name: "ActiveFedora::Base",
|
7
|
+
type_validator: type_validator
|
8
|
+
filters_association :members, as: :child_objects, condition: :pcdm_object?
|
9
|
+
indirectly_contains :related_objects, has_member_relation: RDF::Vocab::ORE.aggregates,
|
10
|
+
inserted_content_relation: RDF::Vocab::ORE.proxyFor, class_name: "ActiveFedora::Base",
|
11
|
+
through: 'ActiveFedora::Aggregation::Proxy', foreign_key: :target,
|
12
|
+
type_validator: Validators::PCDMObjectValidator
|
13
|
+
end
|
14
|
+
|
15
|
+
module ClassMethods
|
16
|
+
def type_validator
|
17
|
+
@type_validator ||= Validators::CompositeValidator.new(
|
18
|
+
super,
|
19
|
+
Validators::PCDMValidator,
|
20
|
+
Validators::AncestorValidator
|
21
|
+
)
|
22
|
+
end
|
23
|
+
end
|
24
|
+
|
25
|
+
def parents
|
26
|
+
aggregated_by
|
27
|
+
end
|
28
|
+
|
29
|
+
def parent_collections
|
30
|
+
aggregated_by.select(&:pcdm_collection?)
|
31
|
+
end
|
32
|
+
|
33
|
+
end
|
34
|
+
end
|