active-fedora 9.0.0.beta3 → 9.0.0.beta4
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/active-fedora.gemspec +1 -1
- data/lib/active_fedora.rb +2 -1
- data/lib/active_fedora/attributes.rb +6 -3
- data/lib/active_fedora/attributes/property_builder.rb +33 -0
- data/lib/active_fedora/fedora.rb +1 -0
- data/lib/active_fedora/loadable_from_json.rb +1 -1
- data/lib/active_fedora/rdf/fcrepo4.rb +2 -0
- data/lib/active_fedora/version.rb +1 -1
- data/lib/active_fedora/versionable.rb +9 -24
- data/lib/active_fedora/versions_graph.rb +58 -0
- data/lib/tasks/active_fedora_dev.rake +1 -2
- data/spec/integration/attributes_spec.rb +5 -8
- data/spec/integration/solr_instance_loader_spec.rb +3 -8
- data/spec/integration/versionable_spec.rb +54 -38
- data/spec/unit/attributes_spec.rb +20 -4
- data/spec/unit/base_spec.rb +1 -1
- metadata +6 -4
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 868c4057e2767f632105de888a5b5ca519ddf483
|
4
|
+
data.tar.gz: a40dfbdc7a7e9047413c4cec194cbfa66969677d
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 9736c5cd63546aa1cf1d82119ab84d0376e6d06a8507026bce1c474ef340fb193149e352107ebbf6c215b74a110d095e2e126f0e95fa9186a3ba3b8143ac15f9
|
7
|
+
data.tar.gz: 05a30a175532f659499d94d3362b18b89a025f2610aa462b0de0860b21b87690d9ba7c74a2fc153a0da574d0607b9aecba3074623a92438ed91e6b953fe98339
|
data/active-fedora.gemspec
CHANGED
@@ -22,7 +22,7 @@ Gem::Specification.new do |s|
|
|
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.0
|
25
|
+
s.add_dependency "ldp", '~> 0.1.0'
|
26
26
|
s.add_dependency "rdf-ldp"
|
27
27
|
|
28
28
|
s.add_development_dependency "rdoc"
|
data/lib/active_fedora.rb
CHANGED
@@ -102,6 +102,7 @@ module ActiveFedora #:nodoc:
|
|
102
102
|
autoload :Predicates
|
103
103
|
autoload :Validations
|
104
104
|
autoload :Versionable
|
105
|
+
autoload :VersionsGraph
|
105
106
|
autoload :WithMetadata
|
106
107
|
end
|
107
108
|
|
@@ -121,6 +122,7 @@ module ActiveFedora #:nodoc:
|
|
121
122
|
eager_autoload do
|
122
123
|
autoload :Serializers
|
123
124
|
autoload :PrimaryKey
|
125
|
+
autoload :PropertyBuilder
|
124
126
|
end
|
125
127
|
end
|
126
128
|
|
@@ -157,7 +159,6 @@ module ActiveFedora #:nodoc:
|
|
157
159
|
SolrService.reset!
|
158
160
|
Predicates.predicate_config = nil
|
159
161
|
configurator.init(options)
|
160
|
-
fedora.init_base_path
|
161
162
|
end
|
162
163
|
|
163
164
|
def config
|
@@ -168,10 +168,13 @@ module ActiveFedora
|
|
168
168
|
delegated_attributes[field].multiple
|
169
169
|
end
|
170
170
|
|
171
|
-
|
172
|
-
def property name, properties
|
171
|
+
def property name, properties={}, &block
|
173
172
|
find_or_create_defined_attribute(name, nil, {multiple: true}.merge(properties))
|
174
|
-
|
173
|
+
raise ArgumentError, "#{name} is a keyword and not an acceptable property name." if protected_property_name? name
|
174
|
+
properties = properties.merge(multivalue: false) if properties[:multiple] == false
|
175
|
+
reflection = ActiveFedora::Attributes::PropertyBuilder.build(self, name, properties.except(:multiple), &block)
|
176
|
+
# reflection = ActiveTriple::PropertyBuilder.build(self, name, properties, &block)
|
177
|
+
ActiveTriples::Reflection.add_reflection self, name, reflection
|
175
178
|
end
|
176
179
|
|
177
180
|
private
|
@@ -0,0 +1,33 @@
|
|
1
|
+
module ActiveFedora::Attributes
|
2
|
+
class PropertyBuilder < ActiveTriples::PropertyBuilder #:nodoc:
|
3
|
+
|
4
|
+
def self.define_accessors(model, reflection)
|
5
|
+
mixin = model.generated_property_methods
|
6
|
+
name = reflection.term
|
7
|
+
define_readers(mixin, name)
|
8
|
+
reflection.multivalue ? define_writers(mixin, name) : define_singular_writers(mixin, name)
|
9
|
+
end
|
10
|
+
|
11
|
+
def self.define_writers(mixin, name)
|
12
|
+
mixin.class_eval <<-CODE, __FILE__, __LINE__ + 1
|
13
|
+
def #{name}=(value)
|
14
|
+
if value.present? && !value.respond_to?(:each)
|
15
|
+
raise ArgumentError, "You attempted to set the property `#{name}' to a scalar value. However, this property is declared as being multivalued."
|
16
|
+
end
|
17
|
+
set_value(:#{name}, value)
|
18
|
+
end
|
19
|
+
CODE
|
20
|
+
end
|
21
|
+
|
22
|
+
def self.define_singular_writers(mixin, name)
|
23
|
+
mixin.class_eval <<-CODE, __FILE__, __LINE__ + 1
|
24
|
+
def #{name}=(value)
|
25
|
+
if value.respond_to?(:each) # singular
|
26
|
+
raise ArgumentError, "You attempted to set the property `#{name}' to an enumerable value. However, this property is declared as singular."
|
27
|
+
end
|
28
|
+
set_value(:#{name}, value)
|
29
|
+
end
|
30
|
+
CODE
|
31
|
+
end
|
32
|
+
end
|
33
|
+
end
|
data/lib/active_fedora/fedora.rb
CHANGED
@@ -20,19 +20,15 @@ module ActiveFedora
|
|
20
20
|
end
|
21
21
|
end
|
22
22
|
|
23
|
-
# Returns an array of
|
23
|
+
# Returns an array of ActiveFedora::VersionsGraph::ResourceVersion objects.
|
24
|
+
# Excludes auto-snapshot versions from Fedora.
|
24
25
|
def versions
|
25
|
-
|
26
|
-
numbered_versions(results).map { |v| version_uri(v.to_s) }
|
27
|
-
end
|
28
|
-
|
29
|
-
def versions_graph
|
30
|
-
@versions_graph ||= ::RDF::Graph.new << ::RDF::Reader.for(:ttl).new(versions_request)
|
26
|
+
@versions ||= ActiveFedora::VersionsGraph.new << ::RDF::Reader.for(:ttl).new(versions_request)
|
31
27
|
end
|
32
28
|
|
33
29
|
def create_version
|
34
30
|
resp = ActiveFedora.fedora.connection.post(versions_uri, nil, {slug: version_name})
|
35
|
-
@
|
31
|
+
@versions = nil
|
36
32
|
resp.success?
|
37
33
|
end
|
38
34
|
|
@@ -46,8 +42,8 @@ module ActiveFedora
|
|
46
42
|
end
|
47
43
|
|
48
44
|
def restore_version label
|
49
|
-
resp = ActiveFedora.fedora.connection.patch(
|
50
|
-
@
|
45
|
+
resp = ActiveFedora.fedora.connection.patch(versions.with_label(label).uri, nil)
|
46
|
+
@versions = nil
|
51
47
|
reload
|
52
48
|
refresh_attributes if self.respond_to?("refresh_attributes")
|
53
49
|
resp.success?
|
@@ -71,25 +67,14 @@ module ActiveFedora
|
|
71
67
|
|
72
68
|
def versions_uri
|
73
69
|
uri + '/fcr:versions'
|
74
|
-
end
|
75
|
-
|
76
|
-
def version_uri label
|
77
|
-
versions_uri + '/' + label
|
78
|
-
end
|
70
|
+
end
|
79
71
|
|
80
72
|
def version_name
|
81
|
-
if versions.empty?
|
73
|
+
if versions.all.empty?
|
82
74
|
"version1"
|
83
75
|
else
|
84
|
-
"version" + (versions.count + 1).to_s
|
85
|
-
end
|
86
|
-
end
|
87
|
-
|
88
|
-
def numbered_versions statements, literals = Array.new
|
89
|
-
statements.each do |statement|
|
90
|
-
literals << statement.object unless statement.object.to_s.match("auto-snapshot")
|
76
|
+
"version" + (versions.all.count + 1).to_s
|
91
77
|
end
|
92
|
-
return literals
|
93
78
|
end
|
94
79
|
|
95
80
|
end
|
@@ -0,0 +1,58 @@
|
|
1
|
+
module ActiveFedora
|
2
|
+
class VersionsGraph < ::RDF::Graph
|
3
|
+
|
4
|
+
def all opts={}
|
5
|
+
if opts[:include_auto_save]
|
6
|
+
fedora_versions
|
7
|
+
else
|
8
|
+
fedora_versions.reject { |v| v.label.match("auto") }
|
9
|
+
end
|
10
|
+
end
|
11
|
+
|
12
|
+
def first
|
13
|
+
all.first
|
14
|
+
end
|
15
|
+
|
16
|
+
def last
|
17
|
+
all.last
|
18
|
+
end
|
19
|
+
|
20
|
+
def with_label label
|
21
|
+
all.each do |version|
|
22
|
+
return version if version.label == label
|
23
|
+
end
|
24
|
+
end
|
25
|
+
|
26
|
+
def resources
|
27
|
+
query(predicate: ActiveFedora::RDF::Fcrepo4.hasVersion)
|
28
|
+
end
|
29
|
+
|
30
|
+
private
|
31
|
+
|
32
|
+
class ResourceVersion
|
33
|
+
attr_accessor :uri, :label, :created
|
34
|
+
end
|
35
|
+
|
36
|
+
def version_from_resource statement
|
37
|
+
version = ResourceVersion.new
|
38
|
+
version.uri = statement.object.to_s.gsub(/\/fcr:metadata$/,"")
|
39
|
+
version.label = label_query(statement)
|
40
|
+
version.created = created_query(statement)
|
41
|
+
return version
|
42
|
+
end
|
43
|
+
|
44
|
+
def label_query statement
|
45
|
+
query(subject: statement.object).query(predicate: ActiveFedora::RDF::Fcrepo4.hasVersionLabel).first.object.to_s
|
46
|
+
end
|
47
|
+
|
48
|
+
def created_query statement
|
49
|
+
query(subject: statement.object).query(predicate: ActiveFedora::RDF::Fcrepo4.created).first.object.to_s
|
50
|
+
end
|
51
|
+
|
52
|
+
def fedora_versions
|
53
|
+
resources.map { |statement| version_from_resource(statement) }
|
54
|
+
end
|
55
|
+
|
56
|
+
end
|
57
|
+
|
58
|
+
end
|
@@ -1,8 +1,7 @@
|
|
1
1
|
APP_ROOT = File.expand_path("#{File.dirname(__FILE__)}/../../")
|
2
2
|
|
3
3
|
require 'jettywrapper'
|
4
|
-
|
5
|
-
Jettywrapper.url = "https://github.com/projecthydra/hydra-jetty/archive/#{JETTY_ZIP_BASENAME}.zip"
|
4
|
+
Jettywrapper.hydra_jetty_version = "v8.1.1"
|
6
5
|
|
7
6
|
namespace :active_fedora do
|
8
7
|
# Use yard to build docs
|
@@ -24,6 +24,7 @@ describe "delegating attributes" do
|
|
24
24
|
end
|
25
25
|
end
|
26
26
|
end
|
27
|
+
|
27
28
|
after :all do
|
28
29
|
Object.send(:remove_const, :TitledObject)
|
29
30
|
Object.send(:remove_const, :RdfObject)
|
@@ -57,7 +58,7 @@ describe "delegating attributes" do
|
|
57
58
|
|
58
59
|
before do
|
59
60
|
subject.depositor = "foo"
|
60
|
-
subject.resource_type = "bar"
|
61
|
+
subject.resource_type = ["bar"]
|
61
62
|
subject.save
|
62
63
|
end
|
63
64
|
|
@@ -69,21 +70,20 @@ describe "delegating attributes" do
|
|
69
70
|
expect(subject[:depositor]).to eql("foo")
|
70
71
|
expect(subject[:resource_type]).to eql(["bar"])
|
71
72
|
end
|
72
|
-
|
73
73
|
end
|
74
74
|
|
75
75
|
describe "setting attributes" do
|
76
|
-
|
77
76
|
specify "using strings for keys" do
|
78
77
|
subject["depositor"] = "foo"
|
79
|
-
subject["resource_type"] = "bar"
|
78
|
+
subject["resource_type"] = ["bar"]
|
80
79
|
subject.save
|
81
80
|
expect(subject.depositor).to eql("foo")
|
82
81
|
expect(subject.resource_type).to eql(["bar"])
|
83
82
|
end
|
83
|
+
|
84
84
|
specify "using symbols for keys" do
|
85
85
|
subject[:depositor] = "foo"
|
86
|
-
subject[:resource_type] = "bar"
|
86
|
+
subject[:resource_type] = ["bar"]
|
87
87
|
subject.save
|
88
88
|
expect(subject.depositor).to eql("foo")
|
89
89
|
expect(subject.resource_type).to eql(["bar"])
|
@@ -102,9 +102,6 @@ describe "delegating attributes" do
|
|
102
102
|
expect(subject.wrangler).to eql(["bar"])
|
103
103
|
end
|
104
104
|
end
|
105
|
-
|
106
105
|
end
|
107
|
-
|
108
106
|
end
|
109
107
|
end
|
110
|
-
|
@@ -9,13 +9,9 @@ describe ActiveFedora::SolrInstanceLoader do
|
|
9
9
|
end
|
10
10
|
has_attributes :foo, datastream: 'descMetadata', multiple: true
|
11
11
|
has_attributes :bar, datastream: 'descMetadata', multiple: false
|
12
|
-
property :title, predicate: ::RDF::DC.title
|
12
|
+
property :title, predicate: ::RDF::DC.title, multiple: false
|
13
13
|
property :description, predicate: ::RDF::DC.description
|
14
14
|
belongs_to :another, predicate: ActiveFedora::RDF::RelsExt.isPartOf, class_name: 'Foo'
|
15
|
-
|
16
|
-
def title
|
17
|
-
super.first
|
18
|
-
end
|
19
15
|
end
|
20
16
|
end
|
21
17
|
|
@@ -28,7 +24,6 @@ describe ActiveFedora::SolrInstanceLoader do
|
|
28
24
|
Object.send(:remove_const, :Foo)
|
29
25
|
end
|
30
26
|
|
31
|
-
|
32
27
|
context "without a solr doc" do
|
33
28
|
subject { loader.object }
|
34
29
|
|
@@ -59,7 +54,7 @@ describe ActiveFedora::SolrInstanceLoader do
|
|
59
54
|
expect(object.foo).to eq ['baz'] # datastream assertion
|
60
55
|
|
61
56
|
# and it's frozen
|
62
|
-
expect { object.title =
|
57
|
+
expect { object.title = 'changed' }.to raise_error ActiveFedora::ReadOnlyRecord
|
63
58
|
expect(object.title).to eq 'My Title'
|
64
59
|
|
65
60
|
expect { object.foo = ['changed'] }.to raise_error ActiveFedora::ReadOnlyRecord
|
@@ -77,7 +72,7 @@ describe ActiveFedora::SolrInstanceLoader do
|
|
77
72
|
end
|
78
73
|
|
79
74
|
context "with a solr doc" do
|
80
|
-
let(:profile) { { "foo"=>["baz"], "bar"=>"quix", "title"=>
|
75
|
+
let(:profile) { { "foo"=>["baz"], "bar"=>"quix", "title"=>"My Title"}.to_json }
|
81
76
|
let(:doc) { { 'id' => 'test-123', 'has_model_ssim'=>['Foo'], 'object_profile_ssm' => profile } }
|
82
77
|
let(:loader) { ActiveFedora::SolrInstanceLoader.new(Foo, obj.id, doc) }
|
83
78
|
|
@@ -14,11 +14,13 @@ describe "a versionable class" do
|
|
14
14
|
|
15
15
|
subject { WithVersions.new }
|
16
16
|
|
17
|
+
let(:current_year) { DateTime.now.year.to_s }
|
18
|
+
|
17
19
|
it { is_expected.to be_versionable }
|
18
20
|
|
19
21
|
context "after saving" do
|
20
22
|
before do
|
21
|
-
subject.title = "Greetings Earthlings"
|
23
|
+
subject.title = ["Greetings Earthlings"]
|
22
24
|
subject.save
|
23
25
|
subject.create_version
|
24
26
|
end
|
@@ -28,22 +30,24 @@ describe "a versionable class" do
|
|
28
30
|
end
|
29
31
|
|
30
32
|
it "should have one version" do
|
31
|
-
expect(subject.versions
|
32
|
-
expect(subject.versions.first).to be_kind_of
|
33
|
-
expect(subject.versions.first).to
|
33
|
+
expect(subject.versions).to be_kind_of ActiveFedora::VersionsGraph
|
34
|
+
expect(subject.versions.all.first).to be_kind_of ActiveFedora::VersionsGraph::ResourceVersion
|
35
|
+
expect(subject.versions.all.first.label).to eql "version1"
|
36
|
+
expect(subject.versions.all.first.created).to start_with current_year
|
34
37
|
end
|
35
38
|
|
36
39
|
context "two times" do
|
37
40
|
before do
|
38
|
-
subject.title = "Surrender and prepare to be boarded"
|
41
|
+
subject.title = ["Surrender and prepare to be boarded"]
|
39
42
|
subject.save
|
40
43
|
subject.create_version
|
41
44
|
end
|
42
45
|
|
43
46
|
it "should have two versions" do
|
44
|
-
expect(subject.versions.size).to eq 2
|
45
|
-
subject.versions.each_index do |index|
|
46
|
-
expect(subject.versions[index]).to end_with "version"+(index+1).to_s
|
47
|
+
expect(subject.versions.all.size).to eq 2
|
48
|
+
subject.versions.all.each_index do |index|
|
49
|
+
expect(subject.versions.all[index].label).to end_with "version"+(index+1).to_s
|
50
|
+
expect(subject.versions.all[index].created).to start_with current_year
|
47
51
|
end
|
48
52
|
end
|
49
53
|
|
@@ -59,13 +63,13 @@ describe "a versionable class" do
|
|
59
63
|
|
60
64
|
context "and creating additional versions" do
|
61
65
|
before do
|
62
|
-
subject.title = "Now, surrender and prepare to be boarded"
|
66
|
+
subject.title = ["Now, surrender and prepare to be boarded"]
|
63
67
|
subject.save!
|
64
68
|
subject.create_version
|
65
69
|
end
|
66
70
|
|
67
71
|
it "should have three versions" do
|
68
|
-
expect(subject.versions.size).to eq 3
|
72
|
+
expect(subject.versions.all.size).to eq 3
|
69
73
|
expect(subject.title).to eql(["Now, surrender and prepare to be boarded"])
|
70
74
|
end
|
71
75
|
|
@@ -98,6 +102,8 @@ describe "a versionable rdf datastream" do
|
|
98
102
|
|
99
103
|
subject { test_object.descMetadata }
|
100
104
|
|
105
|
+
let(:current_year) { DateTime.now.year.to_s }
|
106
|
+
|
101
107
|
context "that exists in the repository" do
|
102
108
|
let(:test_object) { MockAFBase.create }
|
103
109
|
|
@@ -127,7 +133,7 @@ describe "a versionable rdf datastream" do
|
|
127
133
|
end
|
128
134
|
|
129
135
|
it "should have one version" do
|
130
|
-
expect(subject.versions.first).to
|
136
|
+
expect(subject.versions.first.label).to eql "version1"
|
131
137
|
end
|
132
138
|
|
133
139
|
it "should have a title" do
|
@@ -146,9 +152,10 @@ describe "a versionable rdf datastream" do
|
|
146
152
|
end
|
147
153
|
|
148
154
|
it "should have two versions" do
|
149
|
-
expect(subject.versions.size).to eq 2
|
150
|
-
subject.versions.each_index do |index|
|
151
|
-
expect(subject.versions[index]).to end_with "version"+(index+1).to_s
|
155
|
+
expect(subject.versions.all.size).to eq 2
|
156
|
+
subject.versions.all.each_index do |index|
|
157
|
+
expect(subject.versions.all[index].label).to end_with "version"+(index+1).to_s
|
158
|
+
expect(subject.versions.all[index].created).to start_with current_year
|
152
159
|
end
|
153
160
|
end
|
154
161
|
|
@@ -168,7 +175,7 @@ describe "a versionable rdf datastream" do
|
|
168
175
|
end
|
169
176
|
|
170
177
|
it "should have two unique versions" do
|
171
|
-
expect(subject.versions.size).to eq 2
|
178
|
+
expect(subject.versions.all.size).to eq 2
|
172
179
|
end
|
173
180
|
|
174
181
|
it "should load the restored datastream's content" do
|
@@ -187,7 +194,7 @@ describe "a versionable rdf datastream" do
|
|
187
194
|
end
|
188
195
|
|
189
196
|
it "should have three unique versions" do
|
190
|
-
expect(subject.versions.size).to eq 3
|
197
|
+
expect(subject.versions.all.size).to eq 3
|
191
198
|
end
|
192
199
|
|
193
200
|
it "should have a new title" do
|
@@ -227,6 +234,8 @@ describe "a versionable OM datastream" do
|
|
227
234
|
|
228
235
|
subject { test_object.descMetadata }
|
229
236
|
|
237
|
+
let(:current_year) { DateTime.now.year.to_s }
|
238
|
+
|
230
239
|
context "that exists in the repository" do
|
231
240
|
let(:test_object) { MockAFBase.create }
|
232
241
|
|
@@ -256,7 +265,8 @@ describe "a versionable OM datastream" do
|
|
256
265
|
end
|
257
266
|
|
258
267
|
it "should have one version" do
|
259
|
-
expect(subject.versions.first).to
|
268
|
+
expect(subject.versions.first.label).to eql "version1"
|
269
|
+
expect(subject.versions.first.created).to start_with current_year
|
260
270
|
end
|
261
271
|
|
262
272
|
it "should have a title" do
|
@@ -276,9 +286,10 @@ describe "a versionable OM datastream" do
|
|
276
286
|
end
|
277
287
|
|
278
288
|
it "should have two unique versions" do
|
279
|
-
expect(subject.versions.size).to eq 2
|
280
|
-
subject.versions.each_index do |index|
|
281
|
-
expect(subject.versions[index]).to end_with "version"+(index+1).to_s
|
289
|
+
expect(subject.versions.all.size).to eq 2
|
290
|
+
subject.versions.all.each_index do |index|
|
291
|
+
expect(subject.versions.all[index].label).to end_with "version"+(index+1).to_s
|
292
|
+
expect(subject.versions.all[index].created).to start_with current_year
|
282
293
|
end
|
283
294
|
end
|
284
295
|
|
@@ -298,7 +309,7 @@ describe "a versionable OM datastream" do
|
|
298
309
|
end
|
299
310
|
|
300
311
|
it "should still have two unique versions" do
|
301
|
-
expect(subject.versions.size).to eq 2
|
312
|
+
expect(subject.versions.all.size).to eq 2
|
302
313
|
end
|
303
314
|
|
304
315
|
it "should load the restored datastream's content" do
|
@@ -317,7 +328,7 @@ describe "a versionable OM datastream" do
|
|
317
328
|
end
|
318
329
|
|
319
330
|
it "should have three unique versions" do
|
320
|
-
expect(subject.versions.size).to eq 3
|
331
|
+
expect(subject.versions.all.size).to eq 3
|
321
332
|
end
|
322
333
|
|
323
334
|
it "should have a new title" do
|
@@ -353,6 +364,8 @@ describe "a versionable binary datastream" do
|
|
353
364
|
|
354
365
|
subject { test_object.content }
|
355
366
|
|
367
|
+
let(:current_year) { DateTime.now.year.to_s }
|
368
|
+
|
356
369
|
context "that exists in the repository" do
|
357
370
|
let(:test_object) { MockAFBase.create }
|
358
371
|
|
@@ -381,10 +394,11 @@ describe "a versionable binary datastream" do
|
|
381
394
|
end
|
382
395
|
|
383
396
|
it "should have one version" do
|
384
|
-
expect(subject.versions.size).to eq 1
|
397
|
+
expect(subject.versions.all.size).to eq 1
|
385
398
|
expect(subject.original_name).to eql(first_name)
|
386
399
|
expect(subject.content.size).to eq first_file.size
|
387
|
-
expect(subject.versions.first).to
|
400
|
+
expect(subject.versions.first.label).to eql "version1"
|
401
|
+
expect(subject.versions.first.created).to start_with current_year
|
388
402
|
end
|
389
403
|
|
390
404
|
context "two times" do
|
@@ -398,19 +412,20 @@ describe "a versionable binary datastream" do
|
|
398
412
|
end
|
399
413
|
|
400
414
|
it "should have two unique versions" do
|
401
|
-
expect(subject.versions.size).to eq 2
|
415
|
+
expect(subject.versions.all.size).to eq 2
|
402
416
|
expect(subject.original_name).to eql(second_name)
|
403
417
|
expect(subject.content.size).to eq second_file.size
|
404
|
-
subject.versions.each_index do |index|
|
405
|
-
expect(subject.versions[index]).to end_with "version"+(index+1).to_s
|
418
|
+
subject.versions.all.each_index do |index|
|
419
|
+
expect(subject.versions.all[index].label).to end_with "version"+(index+1).to_s
|
420
|
+
expect(subject.versions.all[index].created).to start_with current_year
|
406
421
|
end
|
407
422
|
end
|
408
423
|
|
409
424
|
context "with fixity checking" do
|
410
425
|
let(:results) do
|
411
426
|
results = Array.new
|
412
|
-
subject.versions.each do |
|
413
|
-
results << ActiveFedora::FixityService.new(uri).check
|
427
|
+
subject.versions.all.each do |version|
|
428
|
+
results << ActiveFedora::FixityService.new(version.uri).check
|
414
429
|
end
|
415
430
|
return results
|
416
431
|
end
|
@@ -429,7 +444,7 @@ describe "a versionable binary datastream" do
|
|
429
444
|
end
|
430
445
|
|
431
446
|
it "should still have two unique versions" do
|
432
|
-
expect(subject.versions.size).to eq 2
|
447
|
+
expect(subject.versions.all.size).to eq 2
|
433
448
|
end
|
434
449
|
|
435
450
|
it "should load the restored datastream's content" do
|
@@ -449,11 +464,12 @@ describe "a versionable binary datastream" do
|
|
449
464
|
end
|
450
465
|
|
451
466
|
it "should have three unique versions" do
|
452
|
-
expect(subject.versions.size).to eq 3
|
467
|
+
expect(subject.versions.all.size).to eq 3
|
453
468
|
expect(subject.original_name).to eql(first_name)
|
454
469
|
expect(subject.content.size).to eq first_file.size
|
455
|
-
subject.versions.each_index do |index|
|
456
|
-
expect(subject.versions[index]).to end_with "version"+(index+1).to_s
|
470
|
+
subject.versions.all.each_index do |index|
|
471
|
+
expect(subject.versions.all[index].label).to end_with "version"+(index+1).to_s
|
472
|
+
expect(subject.versions.all[index].created).to start_with current_year
|
457
473
|
end
|
458
474
|
end
|
459
475
|
|
@@ -464,10 +480,10 @@ describe "a versionable binary datastream" do
|
|
464
480
|
end
|
465
481
|
end
|
466
482
|
|
467
|
-
describe "a non-versionable resource" do
|
483
|
+
describe "a non-versionable resource" do
|
468
484
|
before(:all) do
|
469
485
|
class NotVersionableWithVersions < ActiveFedora::Base
|
470
|
-
# explicitly don't call has_many_versions
|
486
|
+
# explicitly don't call has_many_versions
|
471
487
|
property :title, predicate: ::RDF::DC.title
|
472
488
|
end
|
473
489
|
end
|
@@ -480,16 +496,16 @@ describe "a non-versionable resource" do
|
|
480
496
|
|
481
497
|
context "saved with no versions" do
|
482
498
|
it "should not have versions" do
|
483
|
-
subject.update(title: "Greetings Earthlings")
|
499
|
+
subject.update(title: ["Greetings Earthlings"])
|
484
500
|
expect(subject).not_to have_versions
|
485
501
|
end
|
486
502
|
end
|
487
503
|
|
488
504
|
context "saved with versions" do
|
489
505
|
it "should have versions" do
|
490
|
-
subject.update(title: "Greetings Earthlings")
|
506
|
+
subject.update(title: ["Greetings Earthlings"])
|
491
507
|
subject.create_version
|
492
508
|
expect(subject).to have_versions
|
493
509
|
end
|
494
510
|
end
|
495
|
-
end
|
511
|
+
end
|
@@ -146,13 +146,14 @@ describe ActiveFedora::Base do
|
|
146
146
|
expect(subject.fubar(1)).to eq ['two']
|
147
147
|
end
|
148
148
|
|
149
|
-
describe "
|
149
|
+
describe "assigning wrong cardinality" do
|
150
150
|
it "should not allow passing a string to a multiple attribute writer" do
|
151
151
|
expect { subject.fubar = "Quack" }.to raise_error ArgumentError
|
152
152
|
expect { subject.fubar = ["Quack"] }.not_to raise_error
|
153
153
|
expect { subject.fubar = nil }.not_to raise_error
|
154
154
|
end
|
155
|
-
|
155
|
+
|
156
|
+
it "should not allow passing an enumerable to a unique attribute writer" do
|
156
157
|
expect { subject.cow = "Low" }.not_to raise_error
|
157
158
|
expect { subject.cow = ["Low"]
|
158
159
|
}.to raise_error ArgumentError, "You attempted to set the attribute `cow' on `BarHistory2' to an enumerable value. However, this attribute is declared as being singular."
|
@@ -160,7 +161,6 @@ describe ActiveFedora::Base do
|
|
160
161
|
end
|
161
162
|
end
|
162
163
|
|
163
|
-
|
164
164
|
it "should return an array if marked as multiple" do
|
165
165
|
subject.horse=["neigh", "whinny"]
|
166
166
|
expect(subject.horse).to eq ["neigh", "whinny"]
|
@@ -185,7 +185,7 @@ describe ActiveFedora::Base do
|
|
185
185
|
end
|
186
186
|
end
|
187
187
|
|
188
|
-
describe "
|
188
|
+
describe "hash getters and setters" do
|
189
189
|
it "should accept symbol keys" do
|
190
190
|
subject[:duck]= ["Cluck", "Gobble"]
|
191
191
|
expect(subject[:duck]).to eq ["Cluck", "Gobble"]
|
@@ -394,6 +394,7 @@ describe ActiveFedora::Base do
|
|
394
394
|
property :title, predicate: ::RDF::DC.title do |index|
|
395
395
|
index.as :symbol
|
396
396
|
end
|
397
|
+
property :abstract, predicate: ::RDF::DC.abstract, multiple: false
|
397
398
|
end
|
398
399
|
end
|
399
400
|
|
@@ -415,6 +416,21 @@ describe ActiveFedora::Base do
|
|
415
416
|
expect(solr_doc['title_ssim']).to eq ['test1']
|
416
417
|
end
|
417
418
|
end
|
419
|
+
|
420
|
+
describe "when an object of the wrong cardinality is set" do
|
421
|
+
it "should not allow passing a string to a multiple property writer" do
|
422
|
+
expect { subject.title = "Quack" }.to raise_error ArgumentError
|
423
|
+
expect { subject.title = ["Quack"] }.not_to raise_error
|
424
|
+
expect { subject.title = nil }.not_to raise_error
|
425
|
+
end
|
426
|
+
|
427
|
+
it "should not allow an enumerable to a unique attribute writer" do
|
428
|
+
expect { subject.abstract = "Low" }.not_to raise_error
|
429
|
+
expect { subject.abstract = ["Low"]
|
430
|
+
}.to raise_error ArgumentError, "You attempted to set the property `abstract' to an enumerable value. However, this property is declared as singular."
|
431
|
+
expect { subject.abstract = nil }.not_to raise_error
|
432
|
+
end
|
433
|
+
end
|
418
434
|
end
|
419
435
|
end
|
420
436
|
|
data/spec/unit/base_spec.rb
CHANGED
@@ -213,7 +213,7 @@ describe ActiveFedora::Base do
|
|
213
213
|
end
|
214
214
|
|
215
215
|
context "and the object has properties" do
|
216
|
-
let(:test_object) { WithProperty.new(title: 'foo') }
|
216
|
+
let(:test_object) { WithProperty.new(title: ['foo']) }
|
217
217
|
before do
|
218
218
|
class WithProperty < ActiveFedora::Base
|
219
219
|
property :title, predicate: ::RDF::DC.title
|
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.0.0.
|
4
|
+
version: 9.0.0.beta4
|
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: 2014-12-
|
13
|
+
date: 2014-12-05 00:00:00.000000000 Z
|
14
14
|
dependencies:
|
15
15
|
- !ruby/object:Gem::Dependency
|
16
16
|
name: rsolr
|
@@ -130,14 +130,14 @@ dependencies:
|
|
130
130
|
requirements:
|
131
131
|
- - "~>"
|
132
132
|
- !ruby/object:Gem::Version
|
133
|
-
version: 0.0
|
133
|
+
version: 0.1.0
|
134
134
|
type: :runtime
|
135
135
|
prerelease: false
|
136
136
|
version_requirements: !ruby/object:Gem::Requirement
|
137
137
|
requirements:
|
138
138
|
- - "~>"
|
139
139
|
- !ruby/object:Gem::Version
|
140
|
-
version: 0.0
|
140
|
+
version: 0.1.0
|
141
141
|
- !ruby/object:Gem::Dependency
|
142
142
|
name: rdf-ldp
|
143
143
|
requirement: !ruby/object:Gem::Requirement
|
@@ -313,6 +313,7 @@ files:
|
|
313
313
|
- lib/active_fedora/attribute_methods/write.rb
|
314
314
|
- lib/active_fedora/attributes.rb
|
315
315
|
- lib/active_fedora/attributes/primary_key.rb
|
316
|
+
- lib/active_fedora/attributes/property_builder.rb
|
316
317
|
- lib/active_fedora/attributes/serializers.rb
|
317
318
|
- lib/active_fedora/autosave_association.rb
|
318
319
|
- lib/active_fedora/base.rb
|
@@ -387,6 +388,7 @@ files:
|
|
387
388
|
- lib/active_fedora/validations.rb
|
388
389
|
- lib/active_fedora/version.rb
|
389
390
|
- lib/active_fedora/versionable.rb
|
391
|
+
- lib/active_fedora/versions_graph.rb
|
390
392
|
- lib/active_fedora/with_metadata.rb
|
391
393
|
- lib/active_fedora/with_metadata/metadata_node.rb
|
392
394
|
- lib/generators/active_fedora/config/USAGE
|