active-fedora 9.4.3 → 9.5.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/History.txt +13 -0
- data/lib/active_fedora.rb +1 -0
- data/lib/active_fedora/association_hash.rb +117 -0
- data/lib/active_fedora/associations.rb +28 -25
- data/lib/active_fedora/associations/basic_contains_association.rb +14 -2
- data/lib/active_fedora/associations/builder/contains.rb +6 -1
- data/lib/active_fedora/associations/id_composite.rb +4 -1
- data/lib/active_fedora/core.rb +12 -0
- data/lib/active_fedora/errors.rb +4 -0
- data/lib/active_fedora/file.rb +5 -2
- data/lib/active_fedora/files_hash.rb +1 -68
- data/lib/active_fedora/fixity_service.rb +13 -4
- data/lib/active_fedora/persistence.rb +18 -9
- data/lib/active_fedora/reflection.rb +5 -1
- data/lib/active_fedora/relation/calculations.rb +2 -2
- data/lib/active_fedora/relation/finder_methods.rb +25 -36
- data/lib/active_fedora/relation/query_methods.rb +5 -3
- data/lib/active_fedora/solr_query_builder.rb +62 -6
- data/lib/active_fedora/solr_service.rb +2 -2
- data/lib/active_fedora/version.rb +1 -1
- data/spec/integration/contains_association_spec.rb +34 -0
- data/spec/integration/scoped_query_spec.rb +8 -4
- data/spec/unit/attached_files_spec.rb +8 -0
- data/spec/unit/file_spec.rb +14 -0
- data/spec/unit/finder_methods_spec.rb +50 -0
- data/spec/unit/fixity_service_spec.rb +33 -9
- data/spec/unit/query_spec.rb +97 -56
- data/spec/unit/solr_config_options_spec.rb +7 -3
- metadata +5 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: d20da0e6b44ea16a3ea8b082bf4d7ace579231c0
|
4
|
+
data.tar.gz: a0d115e8e0897dfac1ef208ee9b936b51c0f679b
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 62cf90d783c51e26e1ff7ac3cb19a9ab5c3c5daff025900244c076d61b9f7a6533a9daab5951bd9225a445ccd3287a59ac0311673919338a0d6ffd17b6a5b7c2
|
7
|
+
data.tar.gz: a556f5e96eb8b20134a6b9e58c397717882a36184d6972ea3fb705e25a899845b36dfc0ddfd8d524d77828c979f1c8157895e628f2af1aa6015db975c1cffd0c
|
data/History.txt
CHANGED
@@ -1,3 +1,16 @@
|
|
1
|
+
v9.5.0
|
2
|
+
2015-10-16: query for nil creates correct query [Justin Coyne]
|
3
|
+
|
4
|
+
2015-10-16: Support both Fedora and Premis fixity predicates [Adam Wead]
|
5
|
+
|
6
|
+
2015-10-12: AssociationHash - alias to [David Chandek-Stark]
|
7
|
+
|
8
|
+
2015-10-12: Fixed syntax error in raise statement [David Chandek-Stark]
|
9
|
+
|
10
|
+
2015-10-02: Let autoload do its thing [Justin Coyne]
|
11
|
+
|
12
|
+
2015-09-28: Add support for contained RDF sources. [Trey Terrell]
|
13
|
+
|
1
14
|
v9.4.3
|
2
15
|
2015-09-30: Don't mark an attribute as changed if it's set to the same value
|
3
16
|
[Justin Coyne]
|
data/lib/active_fedora.rb
CHANGED
@@ -0,0 +1,117 @@
|
|
1
|
+
module ActiveFedora
|
2
|
+
##
|
3
|
+
# Used as an access method for associations on a model, given some
|
4
|
+
# reflections.
|
5
|
+
class AssociationHash
|
6
|
+
def initialize (model, reflections)
|
7
|
+
@base = model
|
8
|
+
@reflections = reflections
|
9
|
+
end
|
10
|
+
|
11
|
+
def [] (name)
|
12
|
+
association(name).reader if association(name)
|
13
|
+
end
|
14
|
+
|
15
|
+
def []= (name, object)
|
16
|
+
association(name).writer(object) if association(name)
|
17
|
+
end
|
18
|
+
|
19
|
+
def association(name)
|
20
|
+
# Check to see if the key exists before casting to a symbol, because symbols
|
21
|
+
# are not garbage collected in earlier versions of Ruby
|
22
|
+
@base.association(name.to_sym) if key?(name)
|
23
|
+
end
|
24
|
+
|
25
|
+
def reflections
|
26
|
+
@reflections
|
27
|
+
end
|
28
|
+
|
29
|
+
def merge(other_hash)
|
30
|
+
Merged.new(self, other_hash)
|
31
|
+
end
|
32
|
+
|
33
|
+
def each
|
34
|
+
keys.each do |k|
|
35
|
+
yield k, self[k]
|
36
|
+
end
|
37
|
+
end
|
38
|
+
|
39
|
+
def keys
|
40
|
+
reflections.keys
|
41
|
+
end
|
42
|
+
|
43
|
+
# Check that the key exists with indifferent access (symbol or string) in a
|
44
|
+
# manner that avoids generating extra symbols. Symbols are not garbage collected
|
45
|
+
# in earlier versions of ruby.
|
46
|
+
def key?(key)
|
47
|
+
keys.include?(key) || keys.map(&:to_s).include?(key)
|
48
|
+
end
|
49
|
+
alias_method :include?, :key?
|
50
|
+
|
51
|
+
def values
|
52
|
+
keys.map { |k| self[k] }
|
53
|
+
end
|
54
|
+
|
55
|
+
def has_key?(key)
|
56
|
+
keys.include?(key)
|
57
|
+
end
|
58
|
+
|
59
|
+
def size
|
60
|
+
keys.size
|
61
|
+
end
|
62
|
+
|
63
|
+
def empty?
|
64
|
+
reflections.empty?
|
65
|
+
end
|
66
|
+
|
67
|
+
def each_value
|
68
|
+
keys.each do |k|
|
69
|
+
yield self[k]
|
70
|
+
end
|
71
|
+
end
|
72
|
+
|
73
|
+
def changed
|
74
|
+
select do |_, obj|
|
75
|
+
obj.changed?
|
76
|
+
end
|
77
|
+
end
|
78
|
+
|
79
|
+
def select
|
80
|
+
keys.each_with_object({}) do |k, h|
|
81
|
+
val = self[k]
|
82
|
+
h[k] = val if yield k, val
|
83
|
+
end
|
84
|
+
end
|
85
|
+
|
86
|
+
def freeze
|
87
|
+
keys.each do |name|
|
88
|
+
association(name).reader.freeze if association(name).loaded?
|
89
|
+
end
|
90
|
+
super
|
91
|
+
end
|
92
|
+
end
|
93
|
+
##
|
94
|
+
# Represents the result of merging two association hashes.
|
95
|
+
# @note As the keys can come from multiple models, the attributes become
|
96
|
+
# unwritable.
|
97
|
+
class Merged < AssociationHash
|
98
|
+
attr_reader :first, :second
|
99
|
+
|
100
|
+
def initialize(first, second)
|
101
|
+
@first = first
|
102
|
+
@second = second
|
103
|
+
end
|
104
|
+
|
105
|
+
def [] (name)
|
106
|
+
first[name] || second[name]
|
107
|
+
end
|
108
|
+
|
109
|
+
def []= (name)
|
110
|
+
raise NotImplementedError, "Unable to set properties on a merged association hash."
|
111
|
+
end
|
112
|
+
|
113
|
+
def keys
|
114
|
+
first.keys + second.keys
|
115
|
+
end
|
116
|
+
end
|
117
|
+
end
|
@@ -10,31 +10,30 @@ module ActiveFedora
|
|
10
10
|
end
|
11
11
|
|
12
12
|
module Associations
|
13
|
-
|
14
13
|
extend ActiveSupport::Concern
|
14
|
+
extend ActiveSupport::Autoload
|
15
15
|
|
16
|
-
autoload :Association
|
17
|
-
autoload :
|
18
|
-
autoload :
|
19
|
-
autoload :
|
20
|
-
autoload :
|
21
|
-
autoload :
|
22
|
-
autoload :
|
23
|
-
autoload :ContainerProxy, 'active_fedora/associations/container_proxy'
|
16
|
+
autoload :Association
|
17
|
+
autoload :SingularAssociation
|
18
|
+
autoload :RDF
|
19
|
+
autoload :SingularRDF
|
20
|
+
autoload :CollectionAssociation
|
21
|
+
autoload :CollectionProxy
|
22
|
+
autoload :ContainerProxy
|
24
23
|
|
25
|
-
autoload :HasManyAssociation
|
26
|
-
autoload :BelongsToAssociation
|
27
|
-
autoload :HasAndBelongsToManyAssociation
|
28
|
-
autoload :BasicContainsAssociation
|
29
|
-
autoload :DirectlyContainsAssociation
|
30
|
-
autoload :DirectlyContainsOneAssociation
|
31
|
-
autoload :IndirectlyContainsAssociation
|
32
|
-
autoload :ContainsAssociation
|
33
|
-
autoload :DeleteProxy
|
34
|
-
autoload :ContainedFinder
|
35
|
-
autoload :RecordComposite
|
36
|
-
autoload :IDComposite
|
37
|
-
autoload :NullValidator
|
24
|
+
autoload :HasManyAssociation
|
25
|
+
autoload :BelongsToAssociation
|
26
|
+
autoload :HasAndBelongsToManyAssociation
|
27
|
+
autoload :BasicContainsAssociation
|
28
|
+
autoload :DirectlyContainsAssociation
|
29
|
+
autoload :DirectlyContainsOneAssociation
|
30
|
+
autoload :IndirectlyContainsAssociation
|
31
|
+
autoload :ContainsAssociation
|
32
|
+
autoload :DeleteProxy
|
33
|
+
autoload :ContainedFinder
|
34
|
+
autoload :RecordComposite
|
35
|
+
autoload :IDComposite
|
36
|
+
autoload :NullValidator
|
38
37
|
|
39
38
|
module Builder
|
40
39
|
autoload :Association, 'active_fedora/associations/builder/association'
|
@@ -53,6 +52,10 @@ module ActiveFedora
|
|
53
52
|
autoload :SingularProperty, 'active_fedora/associations/builder/singular_property'
|
54
53
|
end
|
55
54
|
|
55
|
+
eager_autoload do
|
56
|
+
autoload :AssociationScope
|
57
|
+
end
|
58
|
+
|
56
59
|
# Clears out the association cache.
|
57
60
|
def clear_association_cache #:nodoc:
|
58
61
|
@association_cache.clear if persisted?
|
@@ -162,13 +165,13 @@ module ActiveFedora
|
|
162
165
|
# This method is used to specify the details of a contained resource.
|
163
166
|
# Pass the name as the first argument and a hash of options as the second argument
|
164
167
|
# Note that this method doesn't actually execute the block, but stores it, to be executed
|
165
|
-
# by any the implementation of the
|
168
|
+
# by any the implementation of the resource(specified as :class_name)
|
166
169
|
#
|
167
170
|
# @param [String] name the handle to refer to this child as
|
168
171
|
# @param [Hash] options
|
169
|
-
# @option options [Class] :class_name The class that will represent this child, should extend ``ActiveFedora::File''
|
172
|
+
# @option options [Class] :class_name The class that will represent this child, should extend ``ActiveFedora::File'' or ``ActiveFedora::Base''
|
170
173
|
# @option options [String] :url
|
171
|
-
# @option options [Boolean] :autocreate Always create this
|
174
|
+
# @option options [Boolean] :autocreate Always create this resource on new objects
|
172
175
|
# @yield block executed by some types of child resources
|
173
176
|
def contains(name, options = {}, &block)
|
174
177
|
options[:block] = block if block
|
@@ -7,13 +7,13 @@ module ActiveFedora
|
|
7
7
|
end
|
8
8
|
|
9
9
|
def find_target
|
10
|
-
|
10
|
+
find_or_initialize_target do |record|
|
11
11
|
configure_datastream(record) if reflection.options[:block]
|
12
12
|
end
|
13
13
|
end
|
14
14
|
|
15
15
|
def target_uri
|
16
|
-
"#{owner.
|
16
|
+
"#{owner.id}/#{reflection.name}"
|
17
17
|
end
|
18
18
|
|
19
19
|
private
|
@@ -23,6 +23,18 @@ module ActiveFedora
|
|
23
23
|
super
|
24
24
|
end
|
25
25
|
|
26
|
+
def find_or_initialize_target(&block)
|
27
|
+
begin
|
28
|
+
if reflection.klass < ActiveFedora::File
|
29
|
+
reflection.build_association(target_uri, &block)
|
30
|
+
else
|
31
|
+
reflection.klass.find(target_uri)
|
32
|
+
end
|
33
|
+
rescue ActiveFedora::ObjectNotFoundError
|
34
|
+
reflection.build_association(target_uri, &block)
|
35
|
+
end
|
36
|
+
end
|
37
|
+
|
26
38
|
def replace(record)
|
27
39
|
if record
|
28
40
|
raise_on_type_mismatch(record)
|
@@ -21,7 +21,12 @@ module ActiveFedora::Associations::Builder
|
|
21
21
|
set_uri = uri.kind_of?(RDF::URI) ? uri.value.present? : uri.present?
|
22
22
|
if set_uri
|
23
23
|
file_uri = "#{uri}/#{name}"
|
24
|
-
|
24
|
+
begin
|
25
|
+
file.uri = file_uri
|
26
|
+
rescue ActiveFedora::AlreadyPersistedError
|
27
|
+
end
|
28
|
+
end
|
29
|
+
if file.respond_to?(:exists!)
|
25
30
|
file.exists! if contains_assertions.include?(file_uri)
|
26
31
|
end
|
27
32
|
end
|
@@ -5,6 +5,9 @@ module ActiveFedora::Associations
|
|
5
5
|
class IDComposite
|
6
6
|
attr_reader :ids, :id_translator
|
7
7
|
include Enumerable
|
8
|
+
# @param [Array<#to_s>] ids An array of ids or URIs to convert to IDs.
|
9
|
+
# @param [#call] id_translator An object to handle the conversion of a URI
|
10
|
+
# to an ID.
|
8
11
|
def initialize(ids, id_translator)
|
9
12
|
@ids = ids
|
10
13
|
@id_translator = id_translator
|
@@ -20,7 +23,7 @@ module ActiveFedora::Associations
|
|
20
23
|
private
|
21
24
|
|
22
25
|
def convert(id)
|
23
|
-
if id.start_with?("http")
|
26
|
+
if id.to_s.start_with?("http")
|
24
27
|
id_translator.call(id)
|
25
28
|
else
|
26
29
|
id
|
data/lib/active_fedora/core.rb
CHANGED
@@ -37,6 +37,18 @@ module ActiveFedora
|
|
37
37
|
run_callbacks :initialize
|
38
38
|
end
|
39
39
|
|
40
|
+
##
|
41
|
+
# @param [#to_s] uri a full fedora URI or relative ID to set this resource
|
42
|
+
# to.
|
43
|
+
# @note This can only be run on an unpersisted resource.
|
44
|
+
def uri=(uri)
|
45
|
+
if persisted?
|
46
|
+
raise AlreadyPersistedError, "You can not set a URI for a persisted ActiveFedora object."
|
47
|
+
else
|
48
|
+
@ldp_source = build_ldp_resource(self.class.uri_to_id(uri))
|
49
|
+
end
|
50
|
+
end
|
51
|
+
|
40
52
|
# Reloads the object from Fedora.
|
41
53
|
def reload
|
42
54
|
check_persistence unless persisted?
|
data/lib/active_fedora/errors.rb
CHANGED
@@ -76,4 +76,8 @@ module ActiveFedora #:nodoc:
|
|
76
76
|
# Raised when Fedora returns a version without a create date
|
77
77
|
class VersionLacksCreateDate < ActiveFedoraError
|
78
78
|
end
|
79
|
+
|
80
|
+
# Raised when you try to set a URI to an already persisted Base object.
|
81
|
+
class AlreadyPersistedError < ActiveFedoraError
|
82
|
+
end
|
79
83
|
end
|
data/lib/active_fedora/file.rb
CHANGED
@@ -35,8 +35,11 @@ module ActiveFedora
|
|
35
35
|
case parent_or_url_or_hash
|
36
36
|
when Hash
|
37
37
|
@ldp_source = build_ldp_resource_via_uri
|
38
|
-
when nil
|
39
|
-
@ldp_source = build_ldp_resource_via_uri
|
38
|
+
when nil
|
39
|
+
@ldp_source = build_ldp_resource_via_uri nil
|
40
|
+
when String, ::RDF::URI
|
41
|
+
id = ActiveFedora::Associations::IDComposite.new([parent_or_url_or_hash], translate_uri_to_id).first
|
42
|
+
@ldp_source = build_ldp_resource id
|
40
43
|
when ActiveFedora::Base
|
41
44
|
Deprecation.warn File, "Initializing a file by passing a container is deprecated. Initialize with a uri instead. This capability will be removed in active-fedora 10.0"
|
42
45
|
uri = if parent_or_url_or_hash.uri.kind_of?(::RDF::URI) && parent_or_url_or_hash.uri.value.empty?
|
@@ -1,82 +1,15 @@
|
|
1
|
-
require 'forwardable'
|
2
|
-
|
3
1
|
module ActiveFedora
|
4
|
-
class FilesHash
|
5
|
-
extend Forwardable
|
6
|
-
|
2
|
+
class FilesHash < AssociationHash
|
7
3
|
def initialize (model)
|
8
4
|
@base = model
|
9
5
|
end
|
10
6
|
|
11
|
-
def [] (name)
|
12
|
-
association(name).reader if association(name)
|
13
|
-
end
|
14
|
-
|
15
|
-
def []= (name, object)
|
16
|
-
association(name).writer(object) if association(name)
|
17
|
-
end
|
18
|
-
|
19
|
-
def association(name)
|
20
|
-
# Check to see if the key exists before casting to a symbol, because symbols
|
21
|
-
# are not garbage collected in earlier versions of Ruby
|
22
|
-
@base.association(name.to_sym) if key?(name)
|
23
|
-
end
|
24
|
-
|
25
7
|
def reflections
|
26
8
|
@base.class.child_resource_reflections
|
27
9
|
end
|
28
10
|
|
29
|
-
def each
|
30
|
-
keys.each do |k|
|
31
|
-
yield k, self[k]
|
32
|
-
end
|
33
|
-
end
|
34
|
-
|
35
11
|
def keys
|
36
12
|
reflections.keys + @base.undeclared_files
|
37
13
|
end
|
38
|
-
|
39
|
-
# Check that the key exists with indifferent access (symbol or string) in a
|
40
|
-
# manner that avoids generating extra symbols. Symbols are not garbage collected
|
41
|
-
# in earlier versions of ruby.
|
42
|
-
def key?(key)
|
43
|
-
keys.include?(key) || keys.map(&:to_s).include?(key)
|
44
|
-
end
|
45
|
-
|
46
|
-
def values
|
47
|
-
keys.map { |k| self[k] }
|
48
|
-
end
|
49
|
-
|
50
|
-
def has_key?(key)
|
51
|
-
keys.include?(key)
|
52
|
-
end
|
53
|
-
|
54
|
-
def size
|
55
|
-
keys.size
|
56
|
-
end
|
57
|
-
|
58
|
-
def empty?
|
59
|
-
reflections.empty?
|
60
|
-
end
|
61
|
-
|
62
|
-
def each_value
|
63
|
-
keys.each do |k|
|
64
|
-
yield self[k]
|
65
|
-
end
|
66
|
-
end
|
67
|
-
|
68
|
-
def select
|
69
|
-
keys.each_with_object({}) do |k, h|
|
70
|
-
val = self[k]
|
71
|
-
h[k] = val if yield k, val
|
72
|
-
end
|
73
|
-
end
|
74
|
-
|
75
|
-
def freeze
|
76
|
-
keys.each do |name|
|
77
|
-
association(name).reader.freeze if association(name).loaded?
|
78
|
-
end
|
79
|
-
super
|
80
|
-
end
|
81
14
|
end
|
82
15
|
end
|
@@ -11,26 +11,35 @@ module ActiveFedora
|
|
11
11
|
end
|
12
12
|
|
13
13
|
# Executes a fixity check on Fedora and saves the Faraday::Response.
|
14
|
-
#
|
14
|
+
# @return true or false
|
15
15
|
def check
|
16
16
|
@response = get_fixity_response_from_fedora
|
17
|
-
status.
|
17
|
+
status.include?(success)
|
18
18
|
end
|
19
19
|
|
20
20
|
def status
|
21
|
-
fixity_graph.query(predicate:
|
21
|
+
fixity_graph.query(predicate: premis_status_predicate).map(&:object) +
|
22
|
+
fixity_graph.query(predicate: fedora_status_predicate).map(&:object)
|
22
23
|
end
|
23
24
|
|
24
25
|
private
|
25
26
|
|
27
|
+
def premis_status_predicate
|
28
|
+
::RDF::Vocab::PREMIS.hasEventOutcome
|
29
|
+
end
|
30
|
+
|
26
31
|
# Fcrepo4.status was used by Fedora < 4.3, but it was removed
|
27
32
|
# from the 2015-07-24 version of the fedora 4 ontology
|
28
33
|
# http://fedora.info/definitions/v4/2015/07/24/repository and
|
29
34
|
# from rdf-vocab in version 0.8.5
|
30
|
-
def
|
35
|
+
def fedora_status_predicate
|
31
36
|
::RDF::URI("http://fedora.info/definitions/v4/repository#status")
|
32
37
|
end
|
33
38
|
|
39
|
+
def success
|
40
|
+
::RDF::Literal.new("SUCCESS")
|
41
|
+
end
|
42
|
+
|
34
43
|
def get_fixity_response_from_fedora
|
35
44
|
uri = target + "/fcr:fixity"
|
36
45
|
ActiveFedora.fedora.connection.get(encoded_url(uri))
|