active-fedora 9.1.2 → 9.2.0.rc1
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/.travis.yml +1 -1
- data/Gemfile +1 -0
- data/History.txt +90 -0
- data/active-fedora.gemspec +2 -2
- data/lib/active_fedora.rb +17 -3
- data/lib/active_fedora/associations.rb +77 -0
- data/lib/active_fedora/associations/association.rb +2 -2
- data/lib/active_fedora/associations/basic_contains_association.rb +52 -0
- data/lib/active_fedora/associations/builder/directly_contains.rb +23 -0
- data/lib/active_fedora/associations/builder/directly_contains_one.rb +44 -0
- data/lib/active_fedora/associations/builder/has_and_belongs_to_many.rb +2 -23
- data/lib/active_fedora/associations/builder/indirectly_contains.rb +26 -0
- data/lib/active_fedora/associations/builder/property.rb +10 -0
- data/lib/active_fedora/associations/collection_association.rb +42 -45
- data/lib/active_fedora/associations/collection_proxy.rb +6 -0
- data/lib/active_fedora/associations/contained_finder.rb +41 -0
- data/lib/active_fedora/associations/container_proxy.rb +9 -0
- data/lib/active_fedora/associations/contains_association.rb +20 -38
- data/lib/active_fedora/associations/delete_proxy.rb +28 -0
- data/lib/active_fedora/associations/directly_contains_association.rb +56 -0
- data/lib/active_fedora/associations/directly_contains_one_association.rb +113 -0
- data/lib/active_fedora/associations/has_and_belongs_to_many_association.rb +6 -14
- data/lib/active_fedora/associations/has_many_association.rb +0 -3
- data/lib/active_fedora/associations/id_composite.rb +30 -0
- data/lib/active_fedora/associations/indirectly_contains_association.rb +90 -0
- data/lib/active_fedora/associations/rdf.rb +8 -4
- data/lib/active_fedora/associations/record_composite.rb +39 -0
- data/lib/active_fedora/attached_files.rb +1 -1
- data/lib/active_fedora/attributes.rb +28 -10
- data/lib/active_fedora/attributes/active_triple_attribute.rb +17 -0
- data/lib/active_fedora/attributes/om_attribute.rb +29 -0
- data/lib/active_fedora/attributes/rdf_datastream_attribute.rb +47 -0
- data/lib/active_fedora/attributes/stream_attribute.rb +46 -0
- data/lib/active_fedora/autosave_association.rb +2 -2
- data/lib/active_fedora/base.rb +3 -0
- data/lib/active_fedora/containers/container.rb +38 -0
- data/lib/active_fedora/containers/direct_container.rb +5 -0
- data/lib/active_fedora/containers/indirect_container.rb +7 -0
- data/lib/active_fedora/core.rb +4 -48
- data/lib/active_fedora/delegated_attribute.rb +5 -98
- data/lib/active_fedora/fedora.rb +1 -1
- data/lib/active_fedora/fedora_attributes.rb +4 -26
- data/lib/active_fedora/file.rb +87 -159
- data/lib/active_fedora/file/attributes.rb +63 -0
- data/lib/active_fedora/file/streaming.rb +46 -0
- data/lib/active_fedora/file_relation.rb +7 -0
- data/lib/active_fedora/identifiable.rb +87 -0
- data/lib/active_fedora/inbound_relation_connection.rb +21 -0
- data/lib/active_fedora/indexers.rb +10 -0
- data/lib/active_fedora/indexers/global_indexer.rb +30 -0
- data/lib/active_fedora/indexers/null_indexer.rb +12 -0
- data/lib/active_fedora/indexing/map.rb +4 -5
- data/lib/active_fedora/indexing_service.rb +3 -22
- data/lib/active_fedora/loadable_from_json.rb +8 -0
- data/lib/active_fedora/pathing.rb +24 -0
- data/lib/active_fedora/persistence.rb +15 -8
- data/lib/active_fedora/rdf.rb +2 -0
- data/lib/active_fedora/rdf/fcrepo4.rb +1 -0
- data/lib/active_fedora/rdf/field_map.rb +90 -0
- data/lib/active_fedora/rdf/field_map_entry.rb +28 -0
- data/lib/active_fedora/rdf/indexing_service.rb +9 -23
- data/lib/active_fedora/rdf/rdf_datastream.rb +1 -2
- data/lib/active_fedora/reflection.rb +16 -15
- data/lib/active_fedora/relation/delegation.rb +15 -4
- data/lib/active_fedora/relation/finder_methods.rb +4 -4
- data/lib/active_fedora/schema.rb +26 -0
- data/lib/active_fedora/schema_indexing_strategy.rb +25 -0
- data/lib/active_fedora/simple_datastream.rb +2 -2
- data/lib/active_fedora/solr_query_builder.rb +3 -2
- data/lib/active_fedora/version.rb +1 -1
- data/lib/active_fedora/with_metadata.rb +1 -1
- data/spec/integration/associations/rdf_spec.rb +49 -0
- data/spec/integration/base_spec.rb +19 -0
- data/spec/integration/belongs_to_association_spec.rb +6 -6
- data/spec/integration/collection_association_spec.rb +4 -4
- data/spec/integration/complex_rdf_datastream_spec.rb +12 -12
- data/spec/integration/datastream_rdf_nested_attributes_spec.rb +1 -1
- data/spec/integration/direct_container_spec.rb +254 -0
- data/spec/integration/directly_contains_one_association_spec.rb +102 -0
- data/spec/integration/file_spec.rb +16 -5
- data/spec/integration/has_many_associations_spec.rb +93 -58
- data/spec/integration/indirect_container_spec.rb +251 -0
- data/spec/integration/rdf_nested_attributes_spec.rb +1 -1
- data/spec/integration/relation_spec.rb +43 -27
- data/spec/spec_helper.rb +1 -1
- data/spec/unit/attributes_spec.rb +6 -6
- data/spec/unit/collection_proxy_spec.rb +28 -0
- data/spec/unit/file_spec.rb +1 -1
- data/spec/unit/files_hash_spec.rb +4 -4
- data/spec/unit/has_and_belongs_to_many_association_spec.rb +11 -9
- data/spec/unit/indexers/global_indexer_spec.rb +41 -0
- data/spec/unit/indexing_service_spec.rb +0 -21
- data/spec/unit/loadable_from_json_spec.rb +31 -0
- data/spec/unit/pathing_spec.rb +37 -0
- data/spec/unit/rdf/indexing_service_spec.rb +3 -3
- data/spec/unit/rdf_resource_datastream_spec.rb +26 -7
- data/spec/unit/schema_indexing_strategy_spec.rb +68 -0
- data/spec/unit/solr_query_builder_spec.rb +1 -1
- data/spec/unit/solr_service_spec.rb +1 -1
- metadata +49 -8
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 8342f8e77df84a1256f26396de99577f34010d2a
|
4
|
+
data.tar.gz: 87203d5509bac4250d9a8c02082b31a310de971f
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 407aab67f7584c962bc16c24b0a9f8fc8c25b7d25c7c5d92dd83ee7dbad9cc75b4800fdb7c267790ea4c0879fccc03bcc52da344601e3596b3e4f3214e462dd2
|
7
|
+
data.tar.gz: c23c707171608bc46666cfa2c45b45313cf7fdfedc4e656b3b50458565888b35625fd3e3acc5efc77b80fa6b19aa72226d2c2a62870a6343325b89b2bbb929e5
|
data/.travis.yml
CHANGED
data/Gemfile
CHANGED
data/History.txt
CHANGED
@@ -1,3 +1,93 @@
|
|
1
|
+
v9.2.0.rc1
|
2
|
+
2015-06-30: Refactor CollectionAssociation#reset [Justin Coyne]
|
3
|
+
|
4
|
+
2015-06-30: make CollectionAssociation#find_target private [Justin Coyne]
|
5
|
+
|
6
|
+
2015-06-25: Implements delete for direct containers. [Hector Correa]
|
7
|
+
|
8
|
+
2015-06-29: The uri() method should return an RDF::URI instead of a string
|
9
|
+
[Justin Coyne]
|
10
|
+
|
11
|
+
2015-06-29: Refactor File#== to avoid an unnecessary API call The new_record?
|
12
|
+
call used to cause an API call to fedora, which we are now able to avoid.
|
13
|
+
[Justin Coyne]
|
14
|
+
|
15
|
+
2015-06-26: Allow File constructor to take a block. Enables removing several
|
16
|
+
TODOs about using `tap` [Justin Coyne]
|
17
|
+
|
18
|
+
2015-06-26: Avoid unnecessary solr query If only one property has been defined
|
19
|
+
for a predicate, there's no reason to run a query to filter the results by
|
20
|
+
class. This avoids a call to solr that is unnecessary in most situations.
|
21
|
+
[Justin Coyne]
|
22
|
+
|
23
|
+
2015-06-26: For an AF record the primary key is always `id` [Justin Coyne]
|
24
|
+
|
25
|
+
2015-06-26: Use the solr terms query when fetching by id This allows the query
|
26
|
+
to be smaller and more understandable [Justin Coyne]
|
27
|
+
|
28
|
+
2015-06-25: RDF::IndexingService indexes objects & properties [Adam Wead]
|
29
|
+
true/false depending on whether something was saved or not. [Hector Correa]
|
30
|
+
|
31
|
+
2015-06-24: Reorganizing ActiveFedora:File code [Adam Wead]
|
32
|
+
|
33
|
+
2015-06-24: Make autosave tests more specific [Adam Wead]
|
34
|
+
|
35
|
+
2015-06-24: Use foreign_key in case user has specified one [Adam Wead]
|
36
|
+
|
37
|
+
2015-06-24: Refactoring ActiveFedora::File to use ActiveFedora::Persistence
|
38
|
+
changed WithMetadata to override create_or_update instead of save so that it
|
39
|
+
gets called when you call save or save! [Carolyn Cole]
|
40
|
+
|
41
|
+
2015-06-24: Removing unneeded line [Carolyn Cole]
|
42
|
+
|
43
|
+
2015-05-02: Add optional prefix to resource URI [Adam Wead]
|
44
|
+
|
45
|
+
2015-06-24: refactoring equals [Carolyn Cole]
|
46
|
+
|
47
|
+
2015-06-24: Removing dead define_destroy_hook method [Adam Wead]
|
48
|
+
|
49
|
+
2015-06-24: Refactoring .find_target for HasAndBelongsToMany [Adam Wead]
|
50
|
+
|
51
|
+
2015-06-18: Implements directly_contains_one association Note: part of this
|
52
|
+
functionality is blocked by #794 [Matt Zumwalt]
|
53
|
+
|
54
|
+
2015-06-24: Return relation for .limit, fixes #352 [Carolyn Cole]
|
55
|
+
|
56
|
+
2015-06-23: Refactoring DelegateAttribute [Adam Wead]
|
57
|
+
|
58
|
+
2015-06-18: Create a blacklist to disallow mutating relations [Justin Coyne]
|
59
|
+
|
60
|
+
2015-06-15: Add documentation to apply_schema. [Trey Terrell]
|
61
|
+
|
62
|
+
2015-06-04: Add apply_schema support to AF. [Trey Terrell]
|
63
|
+
|
64
|
+
2015-06-11: Remove unnecessary dependency on rdf-vocab [Justin Coyne]
|
65
|
+
|
66
|
+
2015-05-18: Direct/Indirect containers should have an include? method [Justin
|
67
|
+
Coyne]
|
68
|
+
|
69
|
+
2015-05-18: A SolrBackedResource should be enumerable [Justin Coyne]
|
70
|
+
|
71
|
+
2015-05-13: Refactor Deleting Indirect Proxies [Trey Terrell]
|
72
|
+
|
73
|
+
2015-04-29: Update ActiveTriples [Trey Terrell]
|
74
|
+
|
75
|
+
2015-05-13: Translation procs should not overwrite one another [Justin Coyne]
|
76
|
+
|
77
|
+
2015-05-13: Fix Deletion of Indirect Container Proxies [Trey Terrell]
|
78
|
+
|
79
|
+
2015-05-11: Update Travis to support YARD [Trey Terrell]
|
80
|
+
|
81
|
+
2015-05-11: Delete proxies. [Trey Terrell]
|
82
|
+
|
83
|
+
2015-05-11: Add spec for deleting indirect items. [Trey Terrell]
|
84
|
+
|
85
|
+
2015-05-08: Request Inbound Relations [Trey Terrell]
|
86
|
+
|
87
|
+
2015-05-07: Added ldp:IndirectContainer [Justin Coyne]
|
88
|
+
|
89
|
+
2015-05-06: Add direct containers [Justin Coyne]
|
90
|
+
|
1
91
|
v9.1.2
|
2
92
|
2015-06-11: Remove unnecessary dependency on rdf-vocab [Justin Coyne]
|
3
93
|
|
data/active-fedora.gemspec
CHANGED
@@ -18,11 +18,11 @@ Gem::Specification.new do |s|
|
|
18
18
|
s.add_dependency 'om', '~> 3.1'
|
19
19
|
s.add_dependency 'nom-xml', '>= 0.5.1'
|
20
20
|
s.add_dependency "activesupport", '>= 4.1.0'
|
21
|
-
s.add_dependency "active-triples", '~> 0.
|
21
|
+
s.add_dependency "active-triples", '~> 0.7.1'
|
22
22
|
s.add_dependency "rdf-rdfxml", '~> 1.1.0'
|
23
23
|
s.add_dependency "linkeddata"
|
24
24
|
s.add_dependency "deprecation"
|
25
|
-
s.add_dependency "ldp", '~> 0.3.
|
25
|
+
s.add_dependency "ldp", '~> 0.3.1'
|
26
26
|
|
27
27
|
s.add_development_dependency "rdoc"
|
28
28
|
s.add_development_dependency "yard"
|
data/lib/active_fedora.rb
CHANGED
@@ -51,23 +51,34 @@ module ActiveFedora #:nodoc:
|
|
51
51
|
autoload :CleanConnection
|
52
52
|
autoload :Config
|
53
53
|
autoload :Core
|
54
|
-
autoload_under '
|
55
|
-
autoload :
|
56
|
-
autoload :
|
54
|
+
autoload_under 'containers' do
|
55
|
+
autoload :Container
|
56
|
+
autoload :DirectContainer
|
57
|
+
autoload :IndirectContainer
|
57
58
|
end
|
58
59
|
autoload :Datastream
|
59
60
|
autoload :Datastreams
|
60
61
|
autoload :DelegatedAttribute
|
62
|
+
autoload_under 'attributes' do
|
63
|
+
autoload :StreamAttribute
|
64
|
+
autoload :ActiveTripleAttribute
|
65
|
+
autoload :OmAttribute
|
66
|
+
autoload :RdfDatastreamAttribute
|
67
|
+
end
|
61
68
|
autoload :Fedora
|
62
69
|
autoload :FedoraAttributes
|
63
70
|
autoload :File
|
64
71
|
autoload :FileConfigurator
|
65
72
|
autoload :FilePathBuilder
|
73
|
+
autoload :FileRelation
|
66
74
|
autoload :FilesHash
|
67
75
|
autoload :FixityService
|
76
|
+
autoload :Identifiable
|
77
|
+
autoload :Indexers
|
68
78
|
autoload :Indexing
|
69
79
|
autoload :IndexingService
|
70
80
|
autoload :InheritableAccessors
|
81
|
+
autoload :InboundRelationConnection
|
71
82
|
autoload :LdpCache
|
72
83
|
autoload :LdpResource
|
73
84
|
autoload :LdpResourceService
|
@@ -77,6 +88,7 @@ module ActiveFedora #:nodoc:
|
|
77
88
|
autoload :NomDatastream
|
78
89
|
autoload :NullRelation
|
79
90
|
autoload :OmDatastream
|
91
|
+
autoload :Pathing
|
80
92
|
autoload :Persistence
|
81
93
|
autoload :ProfileIndexingService
|
82
94
|
autoload :Property
|
@@ -101,9 +113,11 @@ module ActiveFedora #:nodoc:
|
|
101
113
|
autoload :FinderMethods
|
102
114
|
end
|
103
115
|
|
116
|
+
autoload :Schema
|
104
117
|
autoload :Scoping
|
105
118
|
autoload :Serialization
|
106
119
|
autoload :SimpleDatastream
|
120
|
+
autoload :SchemaIndexingStrategy
|
107
121
|
autoload :SolrInstanceLoader
|
108
122
|
autoload :SolrQueryBuilder
|
109
123
|
autoload :SolrService
|
@@ -1,3 +1,4 @@
|
|
1
|
+
require 'active_support/core_ext/enumerable'
|
1
2
|
require 'active_support/core_ext/module/delegation'
|
2
3
|
require 'active_support/core_ext/object/blank'
|
3
4
|
|
@@ -19,11 +20,20 @@ module ActiveFedora
|
|
19
20
|
autoload :SingularRDF, 'active_fedora/associations/singular_rdf'
|
20
21
|
autoload :CollectionAssociation, 'active_fedora/associations/collection_association'
|
21
22
|
autoload :CollectionProxy, 'active_fedora/associations/collection_proxy'
|
23
|
+
autoload :ContainerProxy, 'active_fedora/associations/container_proxy'
|
22
24
|
|
23
25
|
autoload :HasManyAssociation, 'active_fedora/associations/has_many_association'
|
24
26
|
autoload :BelongsToAssociation, 'active_fedora/associations/belongs_to_association'
|
25
27
|
autoload :HasAndBelongsToManyAssociation, 'active_fedora/associations/has_and_belongs_to_many_association'
|
28
|
+
autoload :BasicContainsAssociation, 'active_fedora/associations/basic_contains_association'
|
29
|
+
autoload :DirectlyContainsAssociation, 'active_fedora/associations/directly_contains_association'
|
30
|
+
autoload :DirectlyContainsOneAssociation, 'active_fedora/associations/directly_contains_one_association'
|
31
|
+
autoload :IndirectlyContainsAssociation, 'active_fedora/associations/indirectly_contains_association'
|
26
32
|
autoload :ContainsAssociation, 'active_fedora/associations/contains_association'
|
33
|
+
autoload :DeleteProxy, 'active_fedora/associations/delete_proxy'
|
34
|
+
autoload :ContainedFinder, 'active_fedora/associations/contained_finder'
|
35
|
+
autoload :RecordComposite, 'active_fedora/associations/record_composite'
|
36
|
+
autoload :IDComposite, 'active_fedora/associations/id_composite'
|
27
37
|
|
28
38
|
module Builder
|
29
39
|
autoload :Association, 'active_fedora/associations/builder/association'
|
@@ -34,6 +44,9 @@ module ActiveFedora
|
|
34
44
|
autoload :HasMany, 'active_fedora/associations/builder/has_many'
|
35
45
|
autoload :HasAndBelongsToMany, 'active_fedora/associations/builder/has_and_belongs_to_many'
|
36
46
|
autoload :Contains, 'active_fedora/associations/builder/contains'
|
47
|
+
autoload :DirectlyContains, 'active_fedora/associations/builder/directly_contains'
|
48
|
+
autoload :DirectlyContainsOne, 'active_fedora/associations/builder/directly_contains_one'
|
49
|
+
autoload :IndirectlyContains, 'active_fedora/associations/builder/indirectly_contains'
|
37
50
|
|
38
51
|
autoload :Property, 'active_fedora/associations/builder/property'
|
39
52
|
autoload :SingularProperty, 'active_fedora/associations/builder/singular_property'
|
@@ -61,6 +74,14 @@ module ActiveFedora
|
|
61
74
|
association
|
62
75
|
end
|
63
76
|
|
77
|
+
def delete(*)
|
78
|
+
reflections.each_pair do |name, reflection|
|
79
|
+
if reflection.macro == :has_many
|
80
|
+
association(name.to_sym).delete_all
|
81
|
+
end
|
82
|
+
end
|
83
|
+
super
|
84
|
+
end
|
64
85
|
|
65
86
|
private
|
66
87
|
|
@@ -77,6 +98,62 @@ module ActiveFedora
|
|
77
98
|
|
78
99
|
module ClassMethods
|
79
100
|
|
101
|
+
# This method is used to declare an ldp:DirectContainer on a resource
|
102
|
+
# you must specify an is_member_of_relation or a has_member_relation
|
103
|
+
#
|
104
|
+
# @param [String] name the handle to refer to this child as
|
105
|
+
# @param [Hash] options
|
106
|
+
# @option options [String] :class_name ('ActiveFedora::File') The name of the class that will represent the contained resources
|
107
|
+
# @option options [RDF::URI] :has_member_relation the rdf predicate to use for the ldp:hasMemberRelation
|
108
|
+
# @option options [RDF::URI] :is_member_of_relation the rdf predicate to use for the ldp:isMemberOfRelation
|
109
|
+
#
|
110
|
+
# example:
|
111
|
+
# class FooHistory < ActiveFedora::Base
|
112
|
+
# directly_contains :files, has_member_relation:
|
113
|
+
# ::RDF::URI.new("http://example.com/hasFiles"), class_name: 'Thing'
|
114
|
+
# directly_contains :other_stuff, is_member_of_relation:
|
115
|
+
# ::RDF::URI.new("http://example.com/isContainedBy"), class_name: 'Thing'
|
116
|
+
# end
|
117
|
+
#
|
118
|
+
def directly_contains(name, options={})
|
119
|
+
Builder::DirectlyContains.build(self, name, { class_name: 'ActiveFedora::File' }.merge(options))
|
120
|
+
end
|
121
|
+
|
122
|
+
def directly_contains_one(name, options={})
|
123
|
+
Builder::DirectlyContainsOne.build(self, name, { class_name: 'ActiveFedora::File' }.merge(options))
|
124
|
+
end
|
125
|
+
|
126
|
+
# This method is used to declare an ldp:IndirectContainer on a resource
|
127
|
+
# you must specify an is_member_of_relation or a has_member_relation
|
128
|
+
#
|
129
|
+
# @param [String] name the handle to refer to this child as
|
130
|
+
# @param [Hash] options
|
131
|
+
# @option options [String] :class_name ('ActiveFedora::File') The name of the class that will represent the contained resources
|
132
|
+
# @option options [RDF::URI] :has_member_relation the rdf predicate to use for the ldp:hasMemberRelation
|
133
|
+
# @option options [RDF::URI] :is_member_of_relation the rdf predicate to use for the ldp:isMemberOfRelation
|
134
|
+
# @option options [RDF::URI] :inserted_content_relation the rdf predicate to use for the ldp:insertedContentRelation
|
135
|
+
# @option options [String] :through name of a class to represent the interstitial node
|
136
|
+
# @option options [Symbol] :foreign_key property that points at the remote resource
|
137
|
+
#
|
138
|
+
# example:
|
139
|
+
# class Proxy < ActiveFedora::Base
|
140
|
+
# belongs_to :proxy_for, predicate: ::RDF::URI.new('http://www.openarchives.org/ore/terms/proxyFor'), class_name: 'ActiveFedora::Base'
|
141
|
+
# end
|
142
|
+
#
|
143
|
+
# class FooHistory < ActiveFedora::Base
|
144
|
+
# indirectly_contains :files, has_member_relation: RDF::Vocab::ORE.aggregates,
|
145
|
+
# inserted_content_relation: RDF::Vocab::ORE.proxyFor, class_name: 'Thing',
|
146
|
+
# through: 'Proxy', foreign_key: :proxy_for
|
147
|
+
#
|
148
|
+
# indirectly_contains :other_stuff, is_member_of_relation:
|
149
|
+
# ::RDF::URI.new("http://example.com/isContainedBy"), class_name: 'Thing',
|
150
|
+
# through: 'Proxy', foreign_key: :proxy_for
|
151
|
+
# end
|
152
|
+
#
|
153
|
+
def indirectly_contains(name, options={})
|
154
|
+
Builder::IndirectlyContains.build(self, name, options)
|
155
|
+
end
|
156
|
+
|
80
157
|
def has_many(name, options={})
|
81
158
|
Builder::HasMany.build(self, name, options)
|
82
159
|
end
|
@@ -24,6 +24,7 @@ module ActiveFedora
|
|
24
24
|
def reset
|
25
25
|
@loaded = false
|
26
26
|
@target = nil
|
27
|
+
@stale_state = nil
|
27
28
|
@inversed = false
|
28
29
|
end
|
29
30
|
|
@@ -173,8 +174,7 @@ module ActiveFedora
|
|
173
174
|
end
|
174
175
|
|
175
176
|
def build_record(attributes)
|
176
|
-
|
177
|
-
reflection.build_association(attributes).tap do |record|
|
177
|
+
reflection.build_association(attributes) do |record|
|
178
178
|
initialize_attributes(record)
|
179
179
|
end
|
180
180
|
end
|
@@ -0,0 +1,52 @@
|
|
1
|
+
module ActiveFedora
|
2
|
+
module Associations
|
3
|
+
class BasicContainsAssociation < SingularAssociation #:nodoc:
|
4
|
+
# Implements the reader method, e.g. foo.bar for Foo.has_one :bar
|
5
|
+
def reader(force_reload = false)
|
6
|
+
super || build
|
7
|
+
end
|
8
|
+
|
9
|
+
def find_target
|
10
|
+
reflection.build_association(target_uri) do |record|
|
11
|
+
configure_datastream(record) if reflection.options[:block]
|
12
|
+
end
|
13
|
+
end
|
14
|
+
|
15
|
+
def target_uri
|
16
|
+
"#{owner.uri}/#{reflection.name}"
|
17
|
+
end
|
18
|
+
|
19
|
+
private
|
20
|
+
|
21
|
+
def raise_on_type_mismatch(record)
|
22
|
+
return if record.is_a? LoadableFromJson::SolrBackedMetadataFile
|
23
|
+
super
|
24
|
+
end
|
25
|
+
|
26
|
+
def replace(record)
|
27
|
+
if record
|
28
|
+
raise_on_type_mismatch(record)
|
29
|
+
@updated = true
|
30
|
+
end
|
31
|
+
|
32
|
+
self.target = record
|
33
|
+
end
|
34
|
+
|
35
|
+
def new_record(method, attributes)
|
36
|
+
record = super
|
37
|
+
configure_datastream(record)
|
38
|
+
record
|
39
|
+
end
|
40
|
+
|
41
|
+
def configure_datastream(record)
|
42
|
+
# If you called has_metadata with a block, pass the block into the File class
|
43
|
+
if reflection.options[:block].class == Proc
|
44
|
+
reflection.options[:block].call(record)
|
45
|
+
end
|
46
|
+
if record.new_record? && reflection.options[:autocreate]
|
47
|
+
record.datastream_will_change!
|
48
|
+
end
|
49
|
+
end
|
50
|
+
end
|
51
|
+
end
|
52
|
+
end
|
@@ -0,0 +1,23 @@
|
|
1
|
+
module ActiveFedora::Associations::Builder
|
2
|
+
class DirectlyContains < CollectionAssociation #:nodoc:
|
3
|
+
self.macro = :directly_contains
|
4
|
+
self.valid_options += [:has_member_relation, :is_member_of_relation]
|
5
|
+
self.valid_options -= [:predicate]
|
6
|
+
|
7
|
+
def build
|
8
|
+
reflection = super
|
9
|
+
configure_dependency
|
10
|
+
reflection
|
11
|
+
end
|
12
|
+
|
13
|
+
def validate_options
|
14
|
+
super
|
15
|
+
if !options[:has_member_relation] && !options[:is_member_of_relation]
|
16
|
+
raise ArgumentError, "You must specify a :has_member_relation or :is_member_of_relation predicate for #{name}"
|
17
|
+
elsif !options[:has_member_relation].kind_of?(RDF::URI) && !options[:is_member_of_relation].kind_of?(RDF::URI)
|
18
|
+
raise ArgumentError, "Predicate must be a kind of RDF::URI"
|
19
|
+
end
|
20
|
+
end
|
21
|
+
end
|
22
|
+
end
|
23
|
+
|
@@ -0,0 +1,44 @@
|
|
1
|
+
module ActiveFedora::Associations::Builder
|
2
|
+
class DirectlyContainsOne < SingularAssociation #:nodoc:
|
3
|
+
self.macro = :directly_contains_one
|
4
|
+
self.valid_options += [:has_member_relation, :is_member_of_relation, :type, :through]
|
5
|
+
self.valid_options -= [:predicate]
|
6
|
+
|
7
|
+
def validate_options
|
8
|
+
raise ArgumentError, "you must specify a :through option on #{name}. #{name} will use the container from that directly_contains association." if !options[:through]
|
9
|
+
if options[:through]
|
10
|
+
inherit_options_from_association(options[:through])
|
11
|
+
end
|
12
|
+
super
|
13
|
+
|
14
|
+
if options[:class_name] == "ActiveFedora::File"
|
15
|
+
raise ArgumentError, "You cannot set :class_name of #{name} to ActiveFedora::File because directly_contains_one needs to assert and read RDF.type assertions, which is not supported by ActiveFedora::File. To make Files support RDF.type assertions, define a subclass of ActiveFedora::File and make it `include ActiveFedora::WithMetadata`. Otherwise, all subclasses of ActiveFedora::Base support RDF.type assertions."
|
16
|
+
elsif !options[:has_member_relation] && !options[:is_member_of_relation]
|
17
|
+
raise ArgumentError, "You must specify a :has_member_relation or :is_member_of_relation predicate for #{name}"
|
18
|
+
elsif !options[:has_member_relation].kind_of?(RDF::URI) && !options[:is_member_of_relation].kind_of?(RDF::URI)
|
19
|
+
raise ArgumentError, "Predicate must be a kind of RDF::URI"
|
20
|
+
end
|
21
|
+
|
22
|
+
if !options[:type].kind_of?(RDF::URI)
|
23
|
+
raise ArgumentError, "You must specify a Type and it must be a kind of RDF::URI"
|
24
|
+
end
|
25
|
+
end
|
26
|
+
|
27
|
+
private
|
28
|
+
|
29
|
+
# Inherits :has_member_relation from the association corresponding to association_name
|
30
|
+
# @param [Symbol] association_name of the association to inherit from
|
31
|
+
def inherit_options_from_association(association_name)
|
32
|
+
associated_through_reflection = lookup_reflection(association_name)
|
33
|
+
raise ArgumentError, "You specified `:through => #{@reflection.options[:through]}` on the #{name} associaiton but #{model} does not actually have a #{@reflection.options[:through]}` association" if associated_through_reflection.nil? || !associated_through_reflection.name
|
34
|
+
raise ArgumentError, "You must specify a directly_contains association as the :through option on #{name}. You provided a #{associated_through_reflection.macro}" unless associated_through_reflection.macro == :directly_contains
|
35
|
+
options[:has_member_relation] = associated_through_reflection.options[:has_member_relation] unless options[:has_member_relation]
|
36
|
+
options[:class_name] = associated_through_reflection.options[:class_name] unless (options[:class_name] && options[:class_name] != "ActiveFedora::File")
|
37
|
+
end
|
38
|
+
|
39
|
+
def lookup_reflection(association_name)
|
40
|
+
model.reflect_on_association(association_name)
|
41
|
+
end
|
42
|
+
|
43
|
+
end
|
44
|
+
end
|