active-fedora 9.2.0 → 9.2.1
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 +2 -4
- data/History.txt +12 -0
- data/lib/active_fedora/associations/collection_association.rb +1 -1
- data/lib/active_fedora/change_set.rb +3 -3
- data/lib/active_fedora/loadable_from_json.rb +34 -1
- data/lib/active_fedora/relation.rb +1 -0
- data/lib/active_fedora/version.rb +1 -1
- data/spec/integration/collection_association_spec.rb +16 -0
- data/spec/integration/relation_spec.rb +5 -1
- data/spec/integration/solr_instance_loader_spec.rb +29 -4
- data/spec/unit/change_set_spec.rb +5 -0
- data/spec/unit/file_spec.rb +34 -25
- metadata +3 -3
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 912cef8852fb193d0e8c55b2996b060608b04426
|
4
|
+
data.tar.gz: a9b6e0994fbd8edefb197a93ca5031a3bd439f9f
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 0a8e668c4d8ce320ada6b10a9104a61ced5901802f24f9aeca5fbd5381ddb30573ef270dbbc0e42c9c0b0f51bd70df8d108deb285e34e15ce229abe644d48edd
|
7
|
+
data.tar.gz: 5a9bb242cf7d205c5f853457f4d458afdbfdf0862f041610ffc2705c9e2e32c04ca7c0fb32cf0730be078f3e4da22a3de37efe55137b0ba2673898822fe513b6
|
data/.travis.yml
CHANGED
@@ -3,19 +3,17 @@ cache: bundler
|
|
3
3
|
sudo: false
|
4
4
|
rvm:
|
5
5
|
- 2.2.1
|
6
|
-
|
7
6
|
gemfile:
|
8
7
|
- gemfiles/rails4.1.gemfile
|
9
8
|
- gemfiles/rails4.2.gemfile
|
10
|
-
|
11
9
|
matrix:
|
12
10
|
include:
|
13
11
|
- rvm: 2.1
|
14
12
|
gemfile: gemfiles/rails4.2.gemfile
|
15
|
-
|
16
13
|
notifications:
|
17
14
|
irc: "irc.freenode.org#projecthydra"
|
18
|
-
|
19
15
|
env:
|
20
16
|
global:
|
21
17
|
- NOKOGIRI_USE_SYSTEM_LIBRARIES=true
|
18
|
+
before_script:
|
19
|
+
- jdk_switcher use oraclejdk8
|
data/History.txt
CHANGED
@@ -1,3 +1,15 @@
|
|
1
|
+
v9.2.1
|
2
|
+
2015-07-20: Don't delete objects not part of the association. [Trey Terrell]
|
3
|
+
|
4
|
+
2015-07-19: Improve handling of imperfect profile_json when loading instances
|
5
|
+
from Solr. [Olli Lyytinen]
|
6
|
+
|
7
|
+
2015-07-16: ChangeSet shouldn't record other subjects. [Trey Terrell]
|
8
|
+
|
9
|
+
2015-07-15: Update unit test style [Mike Giarlo]
|
10
|
+
|
11
|
+
2015-07-09: Relation should respond to enumerable methods [Justin Coyne]
|
12
|
+
|
1
13
|
v9.2.0
|
2
14
|
2015-07-08: Add comments to FedoraAttributes [ci skip] [Justin Coyne]
|
3
15
|
|
@@ -354,7 +354,7 @@ module ActiveFedora
|
|
354
354
|
end
|
355
355
|
|
356
356
|
def delete_or_destroy(records, method)
|
357
|
-
records = records.flatten
|
357
|
+
records = records.flatten.select{|x| load_target.include?(x)}
|
358
358
|
records.each { |record| raise_on_type_mismatch(record) }
|
359
359
|
existing_records = records.select { |r| r.persisted? }
|
360
360
|
|
@@ -22,14 +22,14 @@ module ActiveFedora
|
|
22
22
|
@changes ||= changed_attributes.each_with_object({}) do |key, result|
|
23
23
|
if object.respond_to?(:association) && object.association(key.to_sym).present?
|
24
24
|
predicate = object.association(key.to_sym).reflection.predicate
|
25
|
-
result[predicate] = graph.query(predicate: predicate)
|
25
|
+
result[predicate] = graph.query(subject: object.rdf_subject, predicate: predicate)
|
26
26
|
elsif object.class.properties.keys.include?(key)
|
27
27
|
predicate = graph.reflections.reflect_on_property(key).predicate
|
28
|
-
result[predicate] = graph.query(predicate: predicate)
|
28
|
+
result[predicate] = graph.query(subject: object.rdf_subject, predicate: predicate)
|
29
29
|
elsif key == 'type'.freeze
|
30
30
|
# working around https://github.com/ActiveTriples/ActiveTriples/issues/122
|
31
31
|
predicate = ::RDF.type
|
32
|
-
result[predicate] = graph.query(predicate: predicate)
|
32
|
+
result[predicate] = graph.query(subject: object.rdf_subject, predicate: predicate)
|
33
33
|
elsif object.local_attributes.include?(key)
|
34
34
|
raise "Unable to find a graph predicate corresponding to the attribute: \"#{key}\""
|
35
35
|
end
|
@@ -117,7 +117,7 @@ module ActiveFedora
|
|
117
117
|
attached_files[key] = SolrBackedMetadataFile.new
|
118
118
|
end
|
119
119
|
@resource = SolrBackedResource.new(self.class)
|
120
|
-
self.attributes = attrs
|
120
|
+
self.attributes = adapt_attributes(attrs)
|
121
121
|
# TODO Should we clear the change tracking, or make this object Read-only?
|
122
122
|
|
123
123
|
run_callbacks :find
|
@@ -126,5 +126,38 @@ module ActiveFedora
|
|
126
126
|
self
|
127
127
|
end
|
128
128
|
|
129
|
+
private
|
130
|
+
|
131
|
+
# Adapt attributes read from Solr to possible minor changes in data model
|
132
|
+
# since the attributes were saved.
|
133
|
+
# @param attrs [Hash] attributes read from Solr
|
134
|
+
# @return [Hash] the adapted attributes
|
135
|
+
def adapt_attributes(attrs)
|
136
|
+
self.class.attribute_names.each_with_object({}) do |attribute_name, new_attributes|
|
137
|
+
new_attributes[attribute_name] = adapt_attribute_value(attrs, attribute_name)
|
138
|
+
end
|
139
|
+
end
|
140
|
+
|
141
|
+
# Adapts a single attribute value from the given attributes hash to match
|
142
|
+
# minor changes in the data model.
|
143
|
+
# @param attrs [Hash] attributes read from Solr
|
144
|
+
# @param attribute_name [String] the name of the attribute to adapt
|
145
|
+
# @return [Object] the adapted value
|
146
|
+
def adapt_attribute_value(attrs, attribute_name)
|
147
|
+
reflection = self.class.reflect_on_property(attribute_name)
|
148
|
+
if !reflection
|
149
|
+
return attrs[attribute_name] # if this isn't a property, copy value verbatim
|
150
|
+
else
|
151
|
+
multiple = reflection.multiple?
|
152
|
+
if !attrs.key?(attribute_name)
|
153
|
+
# value is missing in attrs, add [] or nil
|
154
|
+
return multiple ? [] : nil
|
155
|
+
else
|
156
|
+
# convert an existing scalar to an array if needed
|
157
|
+
return multiple ? Array(attrs[attribute_name]) : attrs[attribute_name]
|
158
|
+
end
|
159
|
+
end
|
160
|
+
end
|
161
|
+
|
129
162
|
end
|
130
163
|
end
|
@@ -42,6 +42,22 @@ describe ActiveFedora::Base do
|
|
42
42
|
end
|
43
43
|
end
|
44
44
|
|
45
|
+
describe "#delete" do
|
46
|
+
context "when given items not in collection" do
|
47
|
+
it "should return an empty set" do
|
48
|
+
expect(library.books.delete(Book.new)).to eq []
|
49
|
+
end
|
50
|
+
it "should not act on it" do
|
51
|
+
b = Book.new
|
52
|
+
allow(b).to receive(:persisted?).and_return(true)
|
53
|
+
|
54
|
+
library.books.delete(b)
|
55
|
+
|
56
|
+
expect(b).not_to have_received(:persisted?)
|
57
|
+
end
|
58
|
+
end
|
59
|
+
end
|
60
|
+
|
45
61
|
describe "#destroy_all" do
|
46
62
|
it "should delete em" do
|
47
63
|
expect {
|
@@ -17,10 +17,14 @@ describe ActiveFedora::Base do
|
|
17
17
|
|
18
18
|
subject { Library.all }
|
19
19
|
|
20
|
-
it "
|
20
|
+
it "is a relation" do
|
21
21
|
expect(subject.class).to be ActiveFedora::Relation
|
22
22
|
end
|
23
23
|
|
24
|
+
it "is enumerable" do
|
25
|
+
expect(subject).to respond_to(:each_with_index)
|
26
|
+
end
|
27
|
+
|
24
28
|
context "when some records exist" do
|
25
29
|
before do
|
26
30
|
Library.create
|
@@ -87,12 +87,37 @@ describe ActiveFedora::SolrInstanceLoader do
|
|
87
87
|
end
|
88
88
|
end
|
89
89
|
|
90
|
-
context "when the model has
|
91
|
-
let(:profile) { { "foo"=>["baz"], "bar"=>"quix", "title"=>"My Title", "extra_value"=>"Bonus values!"}.to_json }
|
90
|
+
context "when the model has imperfect json" do
|
92
91
|
let(:doc) { { 'id' => 'test-123', 'has_model_ssim'=>['Foo'], 'object_profile_ssm' => profile } }
|
93
92
|
let(:loader) { ActiveFedora::SolrInstanceLoader.new(Foo, obj.id, doc) }
|
94
|
-
|
95
|
-
|
93
|
+
context "when the json has extra values in it" do
|
94
|
+
let(:profile) { { "foo"=>["baz"], "bar"=>"quix", "title"=>"My Title", "extra_value"=>"Bonus values!"}.to_json }
|
95
|
+
it "should load the object without trouble" do
|
96
|
+
expect(loader.object).to be_instance_of Foo
|
97
|
+
end
|
98
|
+
end
|
99
|
+
|
100
|
+
context "when the json is missing values" do
|
101
|
+
let(:profile) { { "foo"=>["baz"], "bar"=>"quix" }.to_json }
|
102
|
+
it "should load the object without trouble" do
|
103
|
+
expect(loader.object).to be_instance_of Foo
|
104
|
+
end
|
105
|
+
it "missing scalar should be nil" do
|
106
|
+
expect(loader.object.title).to be_nil
|
107
|
+
end
|
108
|
+
it "missing multi-value should be []" do
|
109
|
+
expect(loader.object.description).to eql( [] )
|
110
|
+
end
|
111
|
+
end
|
112
|
+
|
113
|
+
context "when the json has scalar where multi-value is expected" do
|
114
|
+
let(:profile) { { "foo"=>["baz"], "bar"=>"quix", "description"=>"test description" }.to_json }
|
115
|
+
it "should load the object without trouble" do
|
116
|
+
expect(loader.object).to be_instance_of Foo
|
117
|
+
end
|
118
|
+
it "should convert the scalar to an array" do
|
119
|
+
expect(loader.object.description).to eql( ["test description"] )
|
120
|
+
end
|
96
121
|
end
|
97
122
|
end
|
98
123
|
end
|
@@ -41,6 +41,11 @@ describe ActiveFedora::ChangeSet do
|
|
41
41
|
it "should have three elements" do
|
42
42
|
expect(subject.size).to eq 3
|
43
43
|
end
|
44
|
+
it "should not include URIs from other objects" do
|
45
|
+
base.resource << RDF::Statement.new(RDF::URI("http://wrong.com"), RDF::DC.title, "bad")
|
46
|
+
base.title = nil
|
47
|
+
expect(subject[RDF::DC.title].to_a).to eq []
|
48
|
+
end
|
44
49
|
end
|
45
50
|
|
46
51
|
it { is_expected.to_not be_empty }
|
data/spec/unit/file_spec.rb
CHANGED
@@ -1,39 +1,48 @@
|
|
1
1
|
require 'spec_helper'
|
2
2
|
|
3
|
-
describe ActiveFedora::
|
4
|
-
let(:
|
3
|
+
describe ActiveFedora::File do
|
4
|
+
let(:file) { described_class.new }
|
5
5
|
|
6
|
-
subject {
|
6
|
+
subject { file }
|
7
7
|
|
8
|
-
it {
|
8
|
+
it { is_expected.not_to be_metadata }
|
9
9
|
|
10
10
|
describe "#behaves_like_io?" do
|
11
|
-
subject {
|
11
|
+
subject { file.send(:behaves_like_io?, object) }
|
12
12
|
|
13
13
|
context "with a File" do
|
14
14
|
let(:object) { File.new __FILE__ }
|
15
|
-
it {
|
15
|
+
it { is_expected.to be true }
|
16
16
|
end
|
17
17
|
|
18
18
|
context "with a Tempfile" do
|
19
19
|
after { object.close; object.unlink }
|
20
20
|
let(:object) { Tempfile.new('foo') }
|
21
|
-
it {
|
21
|
+
it { is_expected.to be true }
|
22
22
|
end
|
23
23
|
|
24
24
|
context "with a StringIO" do
|
25
25
|
let(:object) { StringIO.new('foo') }
|
26
|
-
it {
|
26
|
+
it { is_expected.to be true }
|
27
27
|
end
|
28
28
|
end
|
29
29
|
|
30
30
|
describe "#uri" do
|
31
|
-
let(:parent) { ActiveFedora::Base.new(id: '1234') }
|
32
|
-
before { allow(Deprecation).to receive(:warn) }
|
33
|
-
subject { ActiveFedora::Datastream.new(parent, 'FOO1') }
|
34
31
|
|
35
|
-
|
36
|
-
|
32
|
+
subject { file.uri }
|
33
|
+
|
34
|
+
context "when the file is in an ldp:BasicContainer" do
|
35
|
+
let(:parent) { ActiveFedora::Base.new(id: '1234') }
|
36
|
+
before { allow(Deprecation).to receive(:warn) }
|
37
|
+
let(:file) { described_class.new(parent, 'FOO1') }
|
38
|
+
|
39
|
+
it "sets the uri using the parent as the base" do
|
40
|
+
expect(subject).to eq "#{ActiveFedora.fedora.host}#{ActiveFedora.fedora.base_path}/1234/FOO1"
|
41
|
+
end
|
42
|
+
end
|
43
|
+
|
44
|
+
context "when the file doesn't have a uri" do
|
45
|
+
it { is_expected.to eq ::RDF::URI(nil) }
|
37
46
|
end
|
38
47
|
end
|
39
48
|
|
@@ -64,7 +73,7 @@ describe ActiveFedora::Datastream do
|
|
64
73
|
end
|
65
74
|
|
66
75
|
describe '#persisted_size' do
|
67
|
-
it 'should load the
|
76
|
+
it 'should load the file size attribute from the fedora repository' do
|
68
77
|
expect(subject.size).to eq 9999
|
69
78
|
end
|
70
79
|
|
@@ -152,25 +161,25 @@ describe ActiveFedora::Datastream do
|
|
152
161
|
end
|
153
162
|
end
|
154
163
|
|
155
|
-
context "when the
|
164
|
+
context "when the file has local content" do
|
156
165
|
|
157
166
|
before do
|
158
|
-
|
159
|
-
|
167
|
+
file.uri = "http://localhost:8983/fedora/rest/test/1234/abcd"
|
168
|
+
file.content = "hi there"
|
160
169
|
end
|
161
170
|
|
162
171
|
describe "#inspect" do
|
163
|
-
subject {
|
164
|
-
it {
|
172
|
+
subject { file.inspect }
|
173
|
+
it { is_expected.to eq "#<ActiveFedora::File uri=\"http://localhost:8983/fedora/rest/test/1234/abcd\" >" }
|
165
174
|
end
|
166
175
|
end
|
167
176
|
|
168
177
|
context "original_name" do
|
169
|
-
subject {
|
178
|
+
subject { file.original_name }
|
170
179
|
|
171
|
-
context "on a new
|
180
|
+
context "on a new file" do
|
172
181
|
context "that has a name set locally" do
|
173
|
-
before {
|
182
|
+
before { file.original_name = "my_image.png" }
|
174
183
|
it { is_expected.to eq "my_image.png" }
|
175
184
|
end
|
176
185
|
|
@@ -204,10 +213,10 @@ describe ActiveFedora::Datastream do
|
|
204
213
|
end
|
205
214
|
|
206
215
|
context "digest" do
|
207
|
-
subject {
|
216
|
+
subject { file.digest }
|
208
217
|
|
209
|
-
context "on a new
|
210
|
-
it {
|
218
|
+
context "on a new file" do
|
219
|
+
it { is_expected.to be_empty }
|
211
220
|
end
|
212
221
|
|
213
222
|
context "when it's saved" do
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: active-fedora
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 9.2.
|
4
|
+
version: 9.2.1
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Matt Zumwalt
|
@@ -10,7 +10,7 @@ authors:
|
|
10
10
|
autorequire:
|
11
11
|
bindir: bin
|
12
12
|
cert_chain: []
|
13
|
-
date: 2015-07-
|
13
|
+
date: 2015-07-23 00:00:00.000000000 Z
|
14
14
|
dependencies:
|
15
15
|
- !ruby/object:Gem::Dependency
|
16
16
|
name: rsolr
|
@@ -603,7 +603,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
603
603
|
version: '0'
|
604
604
|
requirements: []
|
605
605
|
rubyforge_project:
|
606
|
-
rubygems_version: 2.4.
|
606
|
+
rubygems_version: 2.4.5
|
607
607
|
signing_key:
|
608
608
|
specification_version: 4
|
609
609
|
summary: A convenience libary for manipulating documents in the Fedora Repository.
|