active-fedora 9.4.1 → 9.4.2
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 +15 -0
- data/lib/active_fedora/file/attributes.rb +13 -1
- data/lib/active_fedora/fixity_service.rb +9 -1
- data/lib/active_fedora/indexing.rb +9 -1
- data/lib/active_fedora/indexing_service.rb +9 -4
- data/lib/active_fedora/nested_attributes.rb +18 -6
- data/lib/active_fedora/rdf/indexing_service.rb +6 -1
- data/lib/active_fedora/version.rb +1 -1
- data/spec/integration/nested_attribute_spec.rb +128 -87
- data/spec/unit/file_spec.rb +3 -1
- metadata +2 -2
checksums.yaml
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
---
|
|
2
2
|
SHA1:
|
|
3
|
-
metadata.gz:
|
|
4
|
-
data.tar.gz:
|
|
3
|
+
metadata.gz: 35b37e4ce4fb55f72c525f6868b769f60af55d98
|
|
4
|
+
data.tar.gz: 8705a17f008927df6c005fe327825c70479b1abe
|
|
5
5
|
SHA512:
|
|
6
|
-
metadata.gz:
|
|
7
|
-
data.tar.gz:
|
|
6
|
+
metadata.gz: 4a534d6c9f2710b9ec7f5802bff389f3fbe8d42152a15d9494eb1c1003acc92d66b9d6727cf2c56986b7ada339ef8e7b5871fe26dcd6fee1bd7b115aee0a58ee
|
|
7
|
+
data.tar.gz: 6ee26660bc33f7c8bd21f2c2618f3e0b3bc74355ae022b55bd201da6a85304509a577cd28710995442e78969251a7946ba2fdfd162b810330b5beacd398e3251
|
data/History.txt
CHANGED
|
@@ -1,3 +1,18 @@
|
|
|
1
|
+
v9.4.2
|
|
2
|
+
2015-09-25: Refactor nested_attribute test for easier reading [Justin Coyne]
|
|
3
|
+
|
|
4
|
+
2015-09-25: Don't skip reject_if when _destroy is passed [Justin Coyne]
|
|
5
|
+
|
|
6
|
+
2015-09-24: Don't use Fcrepo digest predicate from rdf-vocab [Justin Coyne]
|
|
7
|
+
|
|
8
|
+
2015-09-24: Updating documentation of Indexing Service [Jeremy Friesen]
|
|
9
|
+
|
|
10
|
+
2015-09-24: Moving a method to protected [Jeremy Friesen]
|
|
11
|
+
|
|
12
|
+
2015-09-23: Add high-level comment for Indexing module. [Anna Headley]
|
|
13
|
+
|
|
14
|
+
2015-09-18: Refactor nested_attribute_spec [Justin Coyne]
|
|
15
|
+
|
|
1
16
|
v9.4.1
|
|
2
17
|
2015-09-18: Update ldp gem to 0.4.0. [Justin Coyne]
|
|
3
18
|
|
|
@@ -17,7 +17,7 @@ module ActiveFedora::File::Attributes
|
|
|
17
17
|
def digest
|
|
18
18
|
response = metadata.ldp_source.graph.query(predicate: RDF::Vocab::PREMIS.hasMessageDigest)
|
|
19
19
|
# fallback on old predicate for checksum
|
|
20
|
-
response = metadata.ldp_source.graph.query(predicate:
|
|
20
|
+
response = metadata.ldp_source.graph.query(predicate: fallback_digest_predicate) if response.empty?
|
|
21
21
|
response.map(&:object)
|
|
22
22
|
end
|
|
23
23
|
|
|
@@ -43,6 +43,18 @@ module ActiveFedora::File::Attributes
|
|
|
43
43
|
|
|
44
44
|
private
|
|
45
45
|
|
|
46
|
+
# Fcrepo4.digest was used by Fedora < 4.3, but it was removed
|
|
47
|
+
# from the 2015-07-24 version of the fedora 4 ontology
|
|
48
|
+
# http://fedora.info/definitions/v4/2015/07/24/repository and
|
|
49
|
+
# from rdf-vocab in version 0.8.5
|
|
50
|
+
def fallback_digest_predicate
|
|
51
|
+
@fallback_digest ||= if RDF::Vocab::Fcrepo4.respond_to? :digest
|
|
52
|
+
RDF::Vocab::Fcrepo4.digest
|
|
53
|
+
else
|
|
54
|
+
::RDF::URI("http://fedora.info/definitions/v4/repository#digest")
|
|
55
|
+
end
|
|
56
|
+
end
|
|
57
|
+
|
|
46
58
|
def links
|
|
47
59
|
@links ||= Ldp::Response.links(ldp_source.head)
|
|
48
60
|
end
|
|
@@ -18,11 +18,19 @@ module ActiveFedora
|
|
|
18
18
|
end
|
|
19
19
|
|
|
20
20
|
def status
|
|
21
|
-
fixity_graph.query(predicate:
|
|
21
|
+
fixity_graph.query(predicate: status_predicate).map(&:object).first.to_s
|
|
22
22
|
end
|
|
23
23
|
|
|
24
24
|
private
|
|
25
25
|
|
|
26
|
+
# Fcrepo4.status was used by Fedora < 4.3, but it was removed
|
|
27
|
+
# from the 2015-07-24 version of the fedora 4 ontology
|
|
28
|
+
# http://fedora.info/definitions/v4/2015/07/24/repository and
|
|
29
|
+
# from rdf-vocab in version 0.8.5
|
|
30
|
+
def status_predicate
|
|
31
|
+
::RDF::URI("http://fedora.info/definitions/v4/repository#status")
|
|
32
|
+
end
|
|
33
|
+
|
|
26
34
|
def get_fixity_response_from_fedora
|
|
27
35
|
uri = target + "/fcr:fixity"
|
|
28
36
|
ActiveFedora.fedora.connection.get(encoded_url(uri))
|
|
@@ -1,4 +1,12 @@
|
|
|
1
1
|
module ActiveFedora
|
|
2
|
+
# Mix in this module to update Solr on save.
|
|
3
|
+
# Assign a new indexer at the class level where this is mixed in
|
|
4
|
+
# (or define an #indexing_service method)
|
|
5
|
+
# to change the document contents sent to solr
|
|
6
|
+
#
|
|
7
|
+
# Example indexing services are:
|
|
8
|
+
# @see ActiveFedora::IndexingService
|
|
9
|
+
# @see ActiveFedora::RDF::IndexingService
|
|
2
10
|
module Indexing
|
|
3
11
|
extend ActiveSupport::Concern
|
|
4
12
|
extend ActiveSupport::Autoload
|
|
@@ -10,7 +18,7 @@ module ActiveFedora
|
|
|
10
18
|
# Return a Hash representation of this object where keys in the hash are appropriate Solr field names.
|
|
11
19
|
# @param [Hash] solr_doc (optional) Hash to insert the fields into
|
|
12
20
|
# @param [Hash] opts (optional)
|
|
13
|
-
# If opts[:model_only] == true, the base object metadata and the RELS-EXT datastream will be omitted. This is mainly to support shelver, which calls
|
|
21
|
+
# If opts[:model_only] == true, the base object metadata and the RELS-EXT datastream will be omitted. This is mainly to support shelver, which calls #to_solr for each model an object subscribes to.
|
|
14
22
|
def to_solr(solr_doc = Hash.new, opts={})
|
|
15
23
|
indexing_service.generate_solr_document
|
|
16
24
|
end
|
|
@@ -1,4 +1,9 @@
|
|
|
1
1
|
module ActiveFedora
|
|
2
|
+
# Responsible for generating the solr document (via #generate_solr_document) of the
|
|
3
|
+
# given object.
|
|
4
|
+
#
|
|
5
|
+
# @see ActiveFedora::Indexing
|
|
6
|
+
# @see ActiveFedora::RDF::IndexingService
|
|
2
7
|
class IndexingService
|
|
3
8
|
attr_reader :object
|
|
4
9
|
|
|
@@ -14,10 +19,6 @@ module ActiveFedora
|
|
|
14
19
|
@profile_solr_name ||= ActiveFedora::SolrQueryBuilder.solr_name("object_profile", :displayable)
|
|
15
20
|
end
|
|
16
21
|
|
|
17
|
-
def profile_service
|
|
18
|
-
ProfileIndexingService
|
|
19
|
-
end
|
|
20
|
-
|
|
21
22
|
def rdf_service
|
|
22
23
|
RDF::IndexingService
|
|
23
24
|
end
|
|
@@ -43,6 +44,10 @@ module ActiveFedora
|
|
|
43
44
|
|
|
44
45
|
protected
|
|
45
46
|
|
|
47
|
+
def profile_service
|
|
48
|
+
ProfileIndexingService
|
|
49
|
+
end
|
|
50
|
+
|
|
46
51
|
def c_time
|
|
47
52
|
c_time = object.create_date.present? ? object.create_date : DateTime.now
|
|
48
53
|
c_time = DateTime.parse(c_time) unless c_time.is_a?(DateTime)
|
|
@@ -148,7 +148,9 @@ module ActiveFedora
|
|
|
148
148
|
attributes = attributes.with_indifferent_access
|
|
149
149
|
|
|
150
150
|
if attributes['id'].blank?
|
|
151
|
-
|
|
151
|
+
unless reject_new_record?(association_name, attributes)
|
|
152
|
+
association.build(attributes.except(*UNASSIGNABLE_KEYS))
|
|
153
|
+
end
|
|
152
154
|
|
|
153
155
|
elsif existing_record = existing_records.detect { |record| record.id.to_s == attributes['id'].to_s }
|
|
154
156
|
association.send(:add_record_to_target_with_callbacks, existing_record) if !association.loaded? && !call_reject_if(association_name, attributes)
|
|
@@ -176,22 +178,32 @@ module ActiveFedora
|
|
|
176
178
|
["1", "true"].include?(hash['_destroy'].to_s)
|
|
177
179
|
end
|
|
178
180
|
|
|
181
|
+
# Determines if a new record should be rejected by checking
|
|
182
|
+
# has_destroy_flag? or if a <tt>:reject_if</tt> proc exists for this
|
|
183
|
+
# association and evaluates to +true+.
|
|
184
|
+
def reject_new_record?(association_name, attributes)
|
|
185
|
+
has_destroy_flag?(attributes) || call_reject_if(association_name, attributes)
|
|
186
|
+
end
|
|
187
|
+
|
|
179
188
|
def raise_nested_attributes_record_not_found(association_name, record_id)
|
|
180
189
|
reflection = self.class.reflect_on_association(association_name)
|
|
181
190
|
raise ObjectNotFoundError, "Couldn't find #{reflection.klass.name} with ID=#{record_id} for #{self.class.name} with ID=#{id}"
|
|
182
191
|
end
|
|
183
192
|
|
|
193
|
+
# Determines if a record with the particular +attributes+ should be
|
|
194
|
+
# rejected by calling the reject_if Symbol or Proc (if defined).
|
|
195
|
+
# The reject_if option is defined by +accepts_nested_attributes_for+.
|
|
196
|
+
#
|
|
197
|
+
# Returns false if there is a +destroy_flag+ on the attributes.
|
|
184
198
|
def call_reject_if(association_name, attributes)
|
|
185
|
-
|
|
186
|
-
|
|
199
|
+
opts = self.nested_attributes_options[association_name]
|
|
200
|
+
return false if has_destroy_flag?(attributes) && opts[:allow_destroy]
|
|
201
|
+
case callback = opts[:reject_if]
|
|
187
202
|
when Symbol
|
|
188
203
|
method(callback).arity == 0 ? send(callback) : send(callback, attributes)
|
|
189
204
|
when Proc
|
|
190
205
|
callback.call(attributes)
|
|
191
206
|
end
|
|
192
207
|
end
|
|
193
|
-
|
|
194
208
|
end
|
|
195
209
|
end
|
|
196
|
-
|
|
197
|
-
|
|
@@ -1,4 +1,9 @@
|
|
|
1
1
|
module ActiveFedora::RDF
|
|
2
|
+
# Responsible for generating the solr document (via #generate_solr_document) of the
|
|
3
|
+
# given object.
|
|
4
|
+
#
|
|
5
|
+
# @see ActiveFedora::Indexing
|
|
6
|
+
# @see ActiveFedora::IndexingService
|
|
2
7
|
class IndexingService
|
|
3
8
|
include Solrizer::Common
|
|
4
9
|
attr_reader :object
|
|
@@ -70,7 +75,7 @@ module ActiveFedora::RDF
|
|
|
70
75
|
|
|
71
76
|
# returns the field map instance
|
|
72
77
|
def fields
|
|
73
|
-
field_map_class.new do |field_map|
|
|
78
|
+
field_map_class.new do |field_map|
|
|
74
79
|
index_config.each { |name, index_field_config| field_map.insert(name, index_field_config, object) }
|
|
75
80
|
end
|
|
76
81
|
end
|
|
@@ -4,128 +4,169 @@ describe "NestedAttribute behavior" do
|
|
|
4
4
|
before do
|
|
5
5
|
class Bar < ActiveFedora::Base
|
|
6
6
|
belongs_to :car, predicate: ActiveFedora::RDF::Fcrepo::RelsExt.hasMember
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
m.field "dos", :string
|
|
10
|
-
end
|
|
11
|
-
Deprecation.silence(ActiveFedora::Attributes) do
|
|
12
|
-
has_attributes :uno, :dos, datastream: 'someData', multiple: false
|
|
13
|
-
end
|
|
7
|
+
property :uno, predicate: ::RDF::URI('http://example.com/uno'), multiple: false
|
|
8
|
+
property :dos, predicate: ::RDF::URI('http://example.com/dos'), multiple: false
|
|
14
9
|
end
|
|
15
10
|
|
|
16
11
|
# base Car class, used in test for association updates and :allow_destroy flag
|
|
17
12
|
class Car < ActiveFedora::Base
|
|
18
13
|
has_many :bars, predicate: ActiveFedora::RDF::Fcrepo::RelsExt.hasMember
|
|
19
|
-
accepts_nested_attributes_for :bars, :
|
|
20
|
-
end
|
|
21
|
-
|
|
22
|
-
# class used in test for :reject_if=>:all_blank
|
|
23
|
-
class CarAllBlank < Car
|
|
24
|
-
accepts_nested_attributes_for :bars, :reject_if=>:all_blank
|
|
25
|
-
end
|
|
26
|
-
|
|
27
|
-
# class used in test for :reject_if with proc object
|
|
28
|
-
class CarProc < Car
|
|
29
|
-
accepts_nested_attributes_for :bars, :reject_if=>proc { |attributes| attributes['uno'].blank? }
|
|
30
|
-
end
|
|
31
|
-
|
|
32
|
-
# class used in test for :reject_if with method name as symbol
|
|
33
|
-
class CarSymbol < Car
|
|
34
|
-
accepts_nested_attributes_for :bars, :reject_if=>:uno_blank
|
|
35
|
-
|
|
36
|
-
def uno_blank(attributes)
|
|
37
|
-
attributes['uno'].blank?
|
|
38
|
-
end
|
|
39
|
-
end
|
|
40
|
-
|
|
41
|
-
# class used in test for :limit
|
|
42
|
-
class CarWithLimit < Car
|
|
43
|
-
accepts_nested_attributes_for :bars, :limit => 1
|
|
14
|
+
accepts_nested_attributes_for :bars, allow_destroy: true
|
|
44
15
|
end
|
|
45
16
|
end
|
|
46
17
|
after do
|
|
47
18
|
Object.send(:remove_const, :Bar)
|
|
48
|
-
Object.send(:remove_const, :CarAllBlank)
|
|
49
|
-
Object.send(:remove_const, :CarProc)
|
|
50
|
-
Object.send(:remove_const, :CarSymbol)
|
|
51
|
-
Object.send(:remove_const, :CarWithLimit)
|
|
52
19
|
Object.send(:remove_const, :Car)
|
|
53
20
|
end
|
|
54
21
|
|
|
22
|
+
let(:car_class) { Car }
|
|
23
|
+
let(:car) { car_class.create }
|
|
24
|
+
let(:bar1) { Bar.create(car: car) }
|
|
25
|
+
let(:bar2) { Bar.create(car: car) }
|
|
26
|
+
|
|
27
|
+
|
|
55
28
|
it "should have _destroy" do
|
|
56
29
|
expect(Bar.new._destroy).to be_nil
|
|
57
30
|
end
|
|
58
31
|
|
|
59
32
|
it "should update the child objects" do
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
@car.update bars_attributes: [{id: @bar1.id, uno: "bar1 uno"}, {uno: "newbar uno"}, {id: @bar2.id, _destroy: '1', uno: 'bar2 uno'}]
|
|
63
|
-
expect(Bar.find(@bar1.id).uno).to eq 'bar1 uno'
|
|
64
|
-
expect(Bar.where(:id => @bar2.id).first).to be_nil
|
|
65
|
-
expect(Bar.where(:uno => "newbar uno").first).to_not be_nil
|
|
33
|
+
car.update bars_attributes: [{id: bar1.id, uno: "bar1 uno"}, {uno: "newbar uno"}, {id: bar2.id, _destroy: '1', uno: 'bar2 uno'}]
|
|
34
|
+
expect(Bar.all.map(&:uno)).to match_array ['bar1 uno', 'newbar uno']
|
|
66
35
|
|
|
67
|
-
bars =
|
|
68
|
-
expect(bars).to include(
|
|
69
|
-
expect(bars).to_not include(
|
|
36
|
+
bars = car.bars(true)
|
|
37
|
+
expect(bars).to include(bar1)
|
|
38
|
+
expect(bars).to_not include(bar2)
|
|
70
39
|
end
|
|
71
40
|
|
|
72
|
-
|
|
73
|
-
|
|
41
|
+
context "when reject_if: :all_blank" do
|
|
42
|
+
before do
|
|
43
|
+
class CarAllBlank < Car
|
|
44
|
+
accepts_nested_attributes_for :bars, reject_if: :all_blank
|
|
45
|
+
end
|
|
46
|
+
end
|
|
47
|
+
|
|
48
|
+
let(:car_class) { CarAllBlank }
|
|
49
|
+
after { Object.send(:remove_const, :CarAllBlank) }
|
|
50
|
+
let(:car) { car_class.create }
|
|
51
|
+
let!(:bar1) { Bar.create(car: car) }
|
|
52
|
+
let!(:bar2) { Bar.create(car: car) }
|
|
74
53
|
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
54
|
+
it "should reject attributes when all blank" do
|
|
55
|
+
expect(car.bars.count).to eq 2
|
|
56
|
+
car.update bars_attributes: [{}, {id: bar1.id, uno: "bar1 uno"}]
|
|
57
|
+
expect(car.bars(true).count).to eq 2
|
|
78
58
|
|
|
79
|
-
|
|
80
|
-
|
|
59
|
+
bar1.reload
|
|
60
|
+
expect(bar1.uno).to eq "bar1 uno"
|
|
61
|
+
end
|
|
81
62
|
end
|
|
82
63
|
|
|
83
|
-
|
|
84
|
-
|
|
64
|
+
context "when reject_if attribute is supplied with a proc" do
|
|
65
|
+
before do
|
|
66
|
+
class CarProc < Car
|
|
67
|
+
accepts_nested_attributes_for :bars, reject_if: ->(attributes) { attributes['uno'].blank? }
|
|
68
|
+
end
|
|
69
|
+
end
|
|
85
70
|
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
71
|
+
after { Object.send(:remove_const, :CarProc) }
|
|
72
|
+
let(:car_class) { CarProc }
|
|
73
|
+
|
|
74
|
+
context "and the reject_if proc evaluates to false" do
|
|
75
|
+
before do
|
|
76
|
+
car.update bars_attributes: [{}, { id: bar1.id, uno: "bar1 uno" }]
|
|
77
|
+
end
|
|
78
|
+
it "updates attributes" do
|
|
79
|
+
expect(bar1.reload.uno).to eq "bar1 uno"
|
|
80
|
+
end
|
|
81
|
+
end
|
|
82
|
+
|
|
83
|
+
context "and the reject_if proc evaluates to true" do
|
|
84
|
+
before do
|
|
85
|
+
car.update bars_attributes: [{}, { id: bar1.id, dos: "bar1 uno" }]
|
|
86
|
+
end
|
|
87
|
+
it "rejects attributes" do
|
|
88
|
+
expect(bar1.reload.dos).to be_nil
|
|
89
|
+
end
|
|
90
|
+
end
|
|
92
91
|
|
|
93
|
-
|
|
94
|
-
|
|
92
|
+
context "and `allow_destroy: false`" do
|
|
93
|
+
context "and the reject_if proc evaluates to true" do
|
|
94
|
+
before do
|
|
95
|
+
car.update bars_attributes: [{}, { id: bar1.id, dos: "bar1 uno", _destroy: "1" }]
|
|
96
|
+
end
|
|
97
|
+
it "rejects attributes (_destroy doesn't affect the outcome)" do
|
|
98
|
+
expect(bar1.reload.dos).to be_nil
|
|
99
|
+
end
|
|
100
|
+
end
|
|
95
101
|
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
102
|
+
context "a record with the destroy flag and without an id" do
|
|
103
|
+
it "creates a new record" do
|
|
104
|
+
expect {
|
|
105
|
+
car.update bars_attributes: [{ uno: "bar1 uno", _destroy: "1" }]
|
|
106
|
+
}.not_to change { car.bars(true).count }
|
|
107
|
+
end
|
|
108
|
+
end
|
|
109
|
+
end
|
|
101
110
|
end
|
|
102
111
|
|
|
103
|
-
|
|
104
|
-
|
|
112
|
+
describe "reject_if: with a symbol" do
|
|
113
|
+
before do
|
|
114
|
+
# class used in test for reject_if: with method name as symbol
|
|
115
|
+
class CarSymbol < Car
|
|
116
|
+
accepts_nested_attributes_for :bars, reject_if: :uno_blank
|
|
105
117
|
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
118
|
+
def uno_blank(attributes)
|
|
119
|
+
attributes['uno'].blank?
|
|
120
|
+
end
|
|
121
|
+
end
|
|
122
|
+
end
|
|
109
123
|
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
124
|
+
after { Object.send(:remove_const, :CarSymbol) }
|
|
125
|
+
let(:car_class) { CarSymbol }
|
|
126
|
+
|
|
127
|
+
it "rejects attributes based on method name" do
|
|
128
|
+
car.update bars_attributes: [{}, {id: bar1.id, uno: "bar1 uno"}, {id: bar2.id, dos: "bar2 dos"}]
|
|
129
|
+
bar1.reload
|
|
130
|
+
bar2.reload
|
|
131
|
+
expect(bar1.uno).to eq "bar1 uno"
|
|
132
|
+
expect(bar2.dos).to be_nil
|
|
133
|
+
end
|
|
113
134
|
end
|
|
114
135
|
|
|
115
|
-
|
|
136
|
+
describe "allow_destroy: true" do
|
|
137
|
+
before do
|
|
138
|
+
class CarDestroy < Car
|
|
139
|
+
accepts_nested_attributes_for :bars, allow_destroy: true
|
|
140
|
+
end
|
|
141
|
+
end
|
|
116
142
|
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
# @param car_class [class] class for new `car` object, default Car
|
|
120
|
-
# @param bar_class [class] class for new `bar` object, default Bar
|
|
121
|
-
#
|
|
122
|
-
# @return [car,bar,bar] returns 1 Car and 2 Bars
|
|
123
|
-
def create_car_with_bars(car_class = Car, bar_class = Bar)
|
|
124
|
-
car = car_class.new; car.save!
|
|
143
|
+
let(:car_class) { CarDestroy }
|
|
144
|
+
after { Object.send(:remove_const, :CarDestroy) }
|
|
125
145
|
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
146
|
+
it "doesn't create a new record if _destroy is set" do
|
|
147
|
+
expect {
|
|
148
|
+
car.update bars_attributes: [{ uno: "new uno", _destroy: "1" }]
|
|
149
|
+
}.not_to change { car.bars(true).count }
|
|
150
|
+
end
|
|
129
151
|
end
|
|
130
152
|
|
|
153
|
+
describe "limit" do
|
|
154
|
+
before do
|
|
155
|
+
class CarWithLimit < Car
|
|
156
|
+
accepts_nested_attributes_for :bars, limit: 1
|
|
157
|
+
end
|
|
158
|
+
end
|
|
159
|
+
after { Object.send(:remove_const, :CarWithLimit) }
|
|
160
|
+
|
|
161
|
+
let(:car_class) { CarWithLimit }
|
|
162
|
+
it "should throw TooManyRecords" do
|
|
163
|
+
expect {
|
|
164
|
+
car.attributes = {bars_attributes: [{}]}
|
|
165
|
+
}.to_not raise_exception
|
|
166
|
+
|
|
167
|
+
expect {
|
|
168
|
+
car.attributes = {bars_attributes: [{}, {}]}
|
|
169
|
+
}.to raise_exception(ActiveFedora::NestedAttributes::TooManyRecords)
|
|
170
|
+
end
|
|
171
|
+
end
|
|
131
172
|
end
|
data/spec/unit/file_spec.rb
CHANGED
|
@@ -232,8 +232,10 @@ describe ActiveFedora::File do
|
|
|
232
232
|
end
|
|
233
233
|
context "with pre-4.3.0 predicate" do
|
|
234
234
|
before do
|
|
235
|
+
predicate = ::RDF::URI("http://fedora.info/definitions/v4/repository#digest")
|
|
236
|
+
object = RDF::URI.new("urn:sha1:f1d2d2f924e986ac86fdf7b36c94bcdf32beec15")
|
|
235
237
|
graph = ActiveTriples::Resource.new
|
|
236
|
-
graph << RDF::Statement.new(file.uri,
|
|
238
|
+
graph << RDF::Statement.new(file.uri, predicate, object)
|
|
237
239
|
allow(file).to receive_message_chain(:metadata, :ldp_source, :graph).and_return(graph)
|
|
238
240
|
end
|
|
239
241
|
it "falls back on fedora:digest if premis:hasMessageDigest is not present" 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.4.
|
|
4
|
+
version: 9.4.2
|
|
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-09-
|
|
13
|
+
date: 2015-09-25 00:00:00.000000000 Z
|
|
14
14
|
dependencies:
|
|
15
15
|
- !ruby/object:Gem::Dependency
|
|
16
16
|
name: rsolr
|