active-fedora 9.0.0.beta7 → 9.0.0.beta8
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 -0
- data/lib/active_fedora.rb +2 -1
- data/lib/active_fedora/attributes.rb +3 -1
- data/lib/active_fedora/attributes/property_builder.rb +3 -1
- data/lib/active_fedora/errors.rb +14 -0
- data/lib/active_fedora/indexing_service.rb +5 -1
- data/lib/active_fedora/loadable_from_json.rb +1 -1
- data/lib/active_fedora/profile_indexing_service.rb +11 -0
- data/lib/active_fedora/version.rb +1 -1
- data/lib/active_fedora/versionable.rb +6 -2
- data/lib/active_fedora/versions_graph.rb +2 -1
- data/spec/integration/solr_instance_loader_spec.rb +9 -0
- data/spec/spec_helper.rb +1 -0
- data/spec/unit/attributes_spec.rb +11 -0
- data/spec/unit/forbidden_attributes_protection_spec.rb +52 -0
- metadata +4 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: c24dde2e32be3f35bb1d77501279572cb2695ca4
|
4
|
+
data.tar.gz: 87e6796cd6ae6aac4bf464e11b2a2739f3a803fa
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 43b3dbe69386c97045ea8652f286c872bd3874d9c95b11b28f99203e357a7445f0287d27daefcb5c74fca1a6fab6d8f9af33389300033ff5f45218e582af8fda
|
7
|
+
data.tar.gz: b6f025e13de2def11b8361663ae55510989a25e38e8fe3cf9ccc7e99ed89a87f4fef380fead464a6a13ed0ad8146a2c5b55ffab1b490aeabd223425d696371d3
|
data/.travis.yml
CHANGED
data/lib/active_fedora.rb
CHANGED
@@ -69,8 +69,9 @@ module ActiveFedora #:nodoc:
|
|
69
69
|
autoload :NomDatastream
|
70
70
|
autoload :NullRelation
|
71
71
|
autoload :OmDatastream
|
72
|
-
autoload :Property
|
73
72
|
autoload :Persistence
|
73
|
+
autoload :ProfileIndexingService
|
74
|
+
autoload :Property
|
74
75
|
autoload :QualifiedDublinCoreDatastream
|
75
76
|
autoload :Querying
|
76
77
|
autoload :QueryResultBuilder
|
@@ -1,7 +1,9 @@
|
|
1
|
+
require 'active_model/forbidden_attributes_protection'
|
1
2
|
module ActiveFedora
|
2
3
|
module Attributes
|
3
4
|
extend ActiveSupport::Concern
|
4
5
|
include ActiveModel::Dirty
|
6
|
+
include ActiveModel::ForbiddenAttributesProtection
|
5
7
|
|
6
8
|
included do
|
7
9
|
include Serializers
|
@@ -15,7 +17,7 @@ module ActiveFedora
|
|
15
17
|
end
|
16
18
|
|
17
19
|
def attributes=(properties)
|
18
|
-
properties.each do |k, v|
|
20
|
+
sanitize_for_mass_assignment(properties).each do |k, v|
|
19
21
|
respond_to?(:"#{k}=") ? send(:"#{k}=", v) : raise(UnknownAttributeError, "#{self.class} does not have an attribute `#{k}'")
|
20
22
|
end
|
21
23
|
end
|
@@ -27,7 +27,9 @@ module ActiveFedora::Attributes
|
|
27
27
|
def self.define_singular_readers(mixin, name)
|
28
28
|
mixin.class_eval <<-CODE, __FILE__, __LINE__ + 1
|
29
29
|
def #{name}(*args)
|
30
|
-
get_values(:#{name})
|
30
|
+
vals = get_values(:#{name})
|
31
|
+
raise ActiveFedora::ConstraintError, "Expected \\"#{name}\\" to have 0-1 statements, but there are \#{vals.size}" if vals.size > 1
|
32
|
+
vals.first
|
31
33
|
end
|
32
34
|
CODE
|
33
35
|
end
|
data/lib/active_fedora/errors.rb
CHANGED
@@ -54,6 +54,20 @@ module ActiveFedora #:nodoc:
|
|
54
54
|
class IllegalOperation < ActiveFedoraError
|
55
55
|
end
|
56
56
|
|
57
|
+
# Raised when the data has more than one statement for a predicate, but our constraints say it's singular
|
58
|
+
# This helps to prevent overwriting multiple values with a single value when round tripping:
|
59
|
+
# class Book < ActiveFedora::Base
|
60
|
+
# property :title, predicate: RDF::DC.title, multiple: false
|
61
|
+
# end
|
62
|
+
#
|
63
|
+
# b = Book.new
|
64
|
+
# b.resource.title = ['foo', 'bar']
|
65
|
+
# b.title # Raises ConstraintError
|
66
|
+
# # which prevents us from doing:
|
67
|
+
# b.title = b.title
|
68
|
+
class ConstraintError < ActiveFedoraError
|
69
|
+
end
|
70
|
+
|
57
71
|
# Used to rollback a transaction in a deliberate way without raising an exception.
|
58
72
|
# Transactions are currently incomplete
|
59
73
|
class Rollback < ActiveFedoraError
|
@@ -20,6 +20,10 @@ module ActiveFedora
|
|
20
20
|
@profile_solr_name ||= ActiveFedora::SolrQueryBuilder.solr_name("object_profile", :displayable)
|
21
21
|
end
|
22
22
|
|
23
|
+
def profile_service
|
24
|
+
ProfileIndexingService
|
25
|
+
end
|
26
|
+
|
23
27
|
|
24
28
|
def generate_solr_document
|
25
29
|
solr_doc = {}
|
@@ -28,7 +32,7 @@ module ActiveFedora
|
|
28
32
|
Solrizer.set_field(solr_doc, 'active_fedora_model', object.class.inspect, :stored_sortable)
|
29
33
|
solr_doc.merge!(QueryResultBuilder::HAS_MODEL_SOLR_FIELD => object.has_model)
|
30
34
|
solr_doc.merge!(SOLR_DOCUMENT_ID.to_sym => object.id)
|
31
|
-
solr_doc.merge!(self.class.profile_solr_name => object.
|
35
|
+
solr_doc.merge!(self.class.profile_solr_name => profile_service.new(object).export)
|
32
36
|
object.attached_files.each do |name, file|
|
33
37
|
solr_doc.merge! file.to_solr(solr_doc, name: name.to_s)
|
34
38
|
end
|
@@ -103,7 +103,7 @@ module ActiveFedora
|
|
103
103
|
attached_files[key] = SolrBackedMetadataFile.new
|
104
104
|
end
|
105
105
|
@resource = SolrBackedResource.new(self.class)
|
106
|
-
self.attributes = attrs.
|
106
|
+
self.attributes = attrs.slice(*self.class.attribute_names)
|
107
107
|
# TODO Should we clear the change tracking, or make this object Read-only?
|
108
108
|
|
109
109
|
run_callbacks :find
|
@@ -22,8 +22,12 @@ module ActiveFedora
|
|
22
22
|
|
23
23
|
# Returns an array of ActiveFedora::VersionsGraph::ResourceVersion objects.
|
24
24
|
# Excludes auto-snapshot versions from Fedora.
|
25
|
-
def versions
|
26
|
-
|
25
|
+
def versions(reload=false)
|
26
|
+
if reload
|
27
|
+
@versions = ActiveFedora::VersionsGraph.new << ::RDF::Reader.for(:ttl).new(versions_request)
|
28
|
+
else
|
29
|
+
@versions ||= ActiveFedora::VersionsGraph.new << ::RDF::Reader.for(:ttl).new(versions_request)
|
30
|
+
end
|
27
31
|
end
|
28
32
|
|
29
33
|
def create_version
|
@@ -83,4 +83,13 @@ describe ActiveFedora::SolrInstanceLoader do
|
|
83
83
|
expect(subject.title).to eq 'My Title'
|
84
84
|
end
|
85
85
|
end
|
86
|
+
|
87
|
+
context "when the model has extra values in its json" do
|
88
|
+
let(:profile) { { "foo"=>["baz"], "bar"=>"quix", "title"=>"My Title", "extra_value"=>"Bonus values!"}.to_json }
|
89
|
+
let(:doc) { { 'id' => 'test-123', 'has_model_ssim'=>['Foo'], 'object_profile_ssm' => profile } }
|
90
|
+
let(:loader) { ActiveFedora::SolrInstanceLoader.new(Foo, obj.id, doc) }
|
91
|
+
it "should load the object without trouble" do
|
92
|
+
expect(loader.object).to be_instance_of Foo
|
93
|
+
end
|
94
|
+
end
|
86
95
|
end
|
data/spec/spec_helper.rb
CHANGED
@@ -418,6 +418,17 @@ describe ActiveFedora::Base do
|
|
418
418
|
expect(subject[:abstract]).to be_nil
|
419
419
|
end
|
420
420
|
|
421
|
+
context "when there are two assertions for the predicate" do
|
422
|
+
before do
|
423
|
+
subject.resource[:abstract] = ['foo', 'bar']
|
424
|
+
end
|
425
|
+
it "should raise an error if just returning the first value would cause data loss" do
|
426
|
+
expect { subject[:abstract] }.to raise_error ActiveFedora::ConstraintError, "Expected \"abstract\" to have 0-1 statements, but there are 2"
|
427
|
+
end
|
428
|
+
end
|
429
|
+
end
|
430
|
+
|
431
|
+
context "multiple values" do
|
421
432
|
it "should return values" do
|
422
433
|
expect(subject[:title]).to eq ['test1']
|
423
434
|
end
|
@@ -0,0 +1,52 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
describe "Mass assignment protection" do
|
4
|
+
before(:all) do
|
5
|
+
class ProtectedParams < ActiveSupport::HashWithIndifferentAccess
|
6
|
+
attr_accessor :permitted
|
7
|
+
alias :permitted? :permitted
|
8
|
+
|
9
|
+
def initialize(attributes)
|
10
|
+
super(attributes)
|
11
|
+
@permitted = false
|
12
|
+
end
|
13
|
+
|
14
|
+
def permit!
|
15
|
+
@permitted = true
|
16
|
+
self
|
17
|
+
end
|
18
|
+
|
19
|
+
def dup
|
20
|
+
super.tap do |duplicate|
|
21
|
+
duplicate.instance_variable_set :@permitted, @permitted
|
22
|
+
end
|
23
|
+
end
|
24
|
+
end
|
25
|
+
|
26
|
+
class Person < ActiveFedora::Base
|
27
|
+
property :first_name, predicate: ::RDF::FOAF.firstName, multiple: false
|
28
|
+
property :gender, predicate: ::RDF::FOAF.gender, multiple: false
|
29
|
+
end
|
30
|
+
end
|
31
|
+
|
32
|
+
after(:all) do
|
33
|
+
Object.send(:remove_const, :ProtectedParams)
|
34
|
+
Object.send(:remove_const, :Person)
|
35
|
+
end
|
36
|
+
|
37
|
+
|
38
|
+
context "forbidden attributes" do
|
39
|
+
let(:params) { ProtectedParams.new(first_name: 'Guille', gender: 'm') }
|
40
|
+
it "cannot be used for mass assignment" do
|
41
|
+
expect { Person.new(params) }.to raise_error ActiveModel::ForbiddenAttributesError
|
42
|
+
end
|
43
|
+
end
|
44
|
+
|
45
|
+
context "permitted attributes" do
|
46
|
+
let(:params) { ProtectedParams.new(first_name: 'Guille', gender: 'm').permit! }
|
47
|
+
it "cannot be used for mass assignment" do
|
48
|
+
expect { Person.new(params) }.not_to raise_error
|
49
|
+
end
|
50
|
+
end
|
51
|
+
|
52
|
+
end
|
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.beta8
|
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-19 00:00:00.000000000 Z
|
14
14
|
dependencies:
|
15
15
|
- !ruby/object:Gem::Dependency
|
16
16
|
name: rsolr
|
@@ -347,6 +347,7 @@ files:
|
|
347
347
|
- lib/active_fedora/om_datastream.rb
|
348
348
|
- lib/active_fedora/persistence.rb
|
349
349
|
- lib/active_fedora/predicates.rb
|
350
|
+
- lib/active_fedora/profile_indexing_service.rb
|
350
351
|
- lib/active_fedora/property.rb
|
351
352
|
- lib/active_fedora/qualified_dublin_core_datastream.rb
|
352
353
|
- lib/active_fedora/query_result_builder.rb
|
@@ -496,6 +497,7 @@ files:
|
|
496
497
|
- spec/unit/file_spec.rb
|
497
498
|
- spec/unit/files_hash_spec.rb
|
498
499
|
- spec/unit/fixity_service_spec.rb
|
500
|
+
- spec/unit/forbidden_attributes_protection_spec.rb
|
499
501
|
- spec/unit/has_and_belongs_to_many_association_spec.rb
|
500
502
|
- spec/unit/has_many_association_spec.rb
|
501
503
|
- spec/unit/indexing_service_spec.rb
|