active-fedora 9.1.1 → 9.1.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 +17 -0
- data/active-fedora.gemspec +0 -1
- data/lib/active_fedora.rb +0 -1
- data/lib/active_fedora/associations/collection_association.rb +10 -13
- data/lib/active_fedora/associations/has_many_association.rb +1 -1
- data/lib/active_fedora/change_set.rb +5 -0
- data/lib/active_fedora/file.rb +1 -1
- data/lib/active_fedora/indexing.rb +1 -1
- data/lib/active_fedora/version.rb +1 -1
- data/lib/active_fedora/with_metadata.rb +1 -1
- data/lib/active_fedora/with_metadata/metadata_node.rb +20 -2
- data/spec/integration/has_many_associations_spec.rb +11 -0
- data/spec/integration/with_metadata_spec.rb +48 -12
- data/spec/unit/file_spec.rb +10 -0
- data/spec/unit/with_metadata/metadata_node_spec.rb +45 -0
- metadata +4 -17
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: da18bdd03d130d9d80945cd2c2ce0cbbe6056831
|
4
|
+
data.tar.gz: 7709031721c4ccb85bf411d49d61731b097de430
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 3e685a07394f367818b44898dba0c8d059dfec46702534f915840cae1dabda372f50ebe60eb68962295186e588b76dced9624861b545e3611bb83fa89e60737c
|
7
|
+
data.tar.gz: 048eb130c747e5e96be4593b25c4ab51ccf7fee443df5aa8c67c91108f839f50b01dc8455c86a07cef1417a238e54385d4d2f092138abb17e1797a7a292b359c
|
data/History.txt
CHANGED
@@ -1,3 +1,20 @@
|
|
1
|
+
v9.1.2
|
2
|
+
2015-06-11: Remove unnecessary dependency on rdf-vocab [Justin Coyne]
|
3
|
+
|
4
|
+
2015-05-05: Track type as a changed attribute in MetadataNode [Justin Coyne]
|
5
|
+
|
6
|
+
2015-05-05: Don't try to save the metadata node if the file is unsaved [Justin
|
7
|
+
Coyne]
|
8
|
+
|
9
|
+
2015-05-05: File#save should return true if there is nothing to save Fixes #784
|
10
|
+
This parallels how ActiveRecord objects behave if there are no changes, e.g.:
|
11
|
+
[Justin Coyne]
|
12
|
+
|
13
|
+
2015-05-04: CollectionAssociation should generate a solr query lazily When a
|
14
|
+
CollectionAssociation is loaded before the owing object is saved the solr query
|
15
|
+
is produced without the id of the owner, so all the objects of the correct type
|
16
|
+
are returned. Ref #781 [Justin Coyne]
|
17
|
+
|
1
18
|
v9.1.0
|
2
19
|
2015-04-16: Use delegate_to instead of datastream in the options for property
|
3
20
|
Trying to reduce/elimnate the useage of "datastream" especially in the public
|
data/active-fedora.gemspec
CHANGED
data/lib/active_fedora.rb
CHANGED
@@ -8,7 +8,6 @@ require 'active_support/core_ext/object'
|
|
8
8
|
require 'active_support/core_ext/hash/indifferent_access'
|
9
9
|
require 'active_support/core_ext/hash/except'
|
10
10
|
require 'active_triples'
|
11
|
-
require 'rdf/ldp'
|
12
11
|
|
13
12
|
SOLR_DOCUMENT_ID = Solrizer.default_field_mapper.id_field unless defined?(SOLR_DOCUMENT_ID)
|
14
13
|
ENABLE_SOLR_UPDATES = true unless defined?(ENABLE_SOLR_UPDATES)
|
@@ -3,11 +3,6 @@ module ActiveFedora
|
|
3
3
|
class CollectionAssociation < Association #:nodoc:
|
4
4
|
attr_reader :proxy
|
5
5
|
|
6
|
-
def initialize(owner, reflection)
|
7
|
-
super
|
8
|
-
construct_query
|
9
|
-
end
|
10
|
-
|
11
6
|
# Implements the reader method, e.g. foo.items for Foo.has_many :items
|
12
7
|
# @param opts [Boolean, Hash] if true, force a reload
|
13
8
|
# @option opts [Symbol] :response_format can be ':solr' to return a solr result.
|
@@ -233,7 +228,7 @@ module ActiveFedora
|
|
233
228
|
# Count all records using solr. Construct options and pass them with
|
234
229
|
# scope to the target class's +count+.
|
235
230
|
def count(options = {})
|
236
|
-
@reflection.klass.count(:
|
231
|
+
@reflection.klass.count(conditions: construct_query)
|
237
232
|
end
|
238
233
|
|
239
234
|
# Sets the target of this proxy to <tt>\target</tt>, and the \loaded flag to +true+.
|
@@ -291,10 +286,11 @@ module ActiveFedora
|
|
291
286
|
|
292
287
|
# @param opts [Hash] Options that will be passed through to ActiveFedora::SolrService.query.
|
293
288
|
def load_from_solr(opts = Hash.new)
|
294
|
-
|
289
|
+
finder_query = construct_query
|
290
|
+
return [] if finder_query.empty?
|
295
291
|
rows = opts.delete(:rows) { count }
|
296
292
|
return [] if rows == 0
|
297
|
-
SolrService.query(
|
293
|
+
SolrService.query(finder_query, { rows: rows }.merge(opts))
|
298
294
|
end
|
299
295
|
|
300
296
|
def add_to_target(record, skip_callbacks = false)
|
@@ -330,11 +326,12 @@ module ActiveFedora
|
|
330
326
|
end
|
331
327
|
|
332
328
|
def construct_query
|
333
|
-
|
334
|
-
|
335
|
-
|
336
|
-
|
337
|
-
|
329
|
+
@solr_query ||= begin
|
330
|
+
#TODO use primary_key instead of id
|
331
|
+
clauses = { find_reflection => @owner.id }
|
332
|
+
clauses[:has_model] = @reflection.class_name.constantize.to_class_uri if @reflection.class_name && @reflection.class_name != 'ActiveFedora::Base'
|
333
|
+
ActiveFedora::SolrQueryBuilder.construct_query_for_rel(clauses)
|
334
|
+
end
|
338
335
|
end
|
339
336
|
|
340
337
|
|
@@ -17,7 +17,7 @@ module ActiveFedora
|
|
17
17
|
count = if loaded?
|
18
18
|
@target.size
|
19
19
|
else
|
20
|
-
@reflection.klass.count(:
|
20
|
+
@reflection.klass.count(conditions: construct_query)
|
21
21
|
end
|
22
22
|
|
23
23
|
# If there's nothing in the database and @target has no new records
|
@@ -17,6 +17,7 @@ module ActiveFedora
|
|
17
17
|
changes.empty?
|
18
18
|
end
|
19
19
|
|
20
|
+
# @return [Hash<RDF::URI, RDF::Queryable::Enumerator>] hash of predicate uris to statements
|
20
21
|
def changes
|
21
22
|
@changes ||= changed_attributes.each_with_object({}) do |key, result|
|
22
23
|
if object.respond_to?(:association) && object.association(key.to_sym).present?
|
@@ -25,6 +26,10 @@ module ActiveFedora
|
|
25
26
|
elsif object.class.properties.keys.include?(key)
|
26
27
|
predicate = graph.reflections.reflect_on_property(key).predicate
|
27
28
|
result[predicate] = graph.query(predicate: predicate)
|
29
|
+
elsif key == 'type'.freeze
|
30
|
+
# working around https://github.com/ActiveTriples/ActiveTriples/issues/122
|
31
|
+
predicate = ::RDF.type
|
32
|
+
result[predicate] = graph.query(predicate: predicate)
|
28
33
|
elsif object.local_attributes.include?(key)
|
29
34
|
raise "Unable to find a graph predicate corresponding to the attribute: \"#{key}\""
|
30
35
|
end
|
data/lib/active_fedora/file.rb
CHANGED
@@ -235,7 +235,7 @@ module ActiveFedora
|
|
235
235
|
end
|
236
236
|
|
237
237
|
def save(*)
|
238
|
-
return unless content_changed?
|
238
|
+
return true unless content_changed?
|
239
239
|
headers = { 'Content-Type'.freeze => mime_type, 'Content-Length'.freeze => content.size.to_s }
|
240
240
|
headers['Content-Disposition'.freeze] = "attachment; filename=\"#{URI.encode(@original_name)}\"" if @original_name
|
241
241
|
|
@@ -98,7 +98,7 @@ module ActiveFedora
|
|
98
98
|
# GET could be slow if it's a big resource, we're using HEAD to avoid this problem,
|
99
99
|
# but this causes more requests to Fedora.
|
100
100
|
return [] unless Ldp::Response.rdf_source?(resource.head)
|
101
|
-
immediate_descendant_uris = resource.graph.query(predicate: ::RDF::LDP.contains).map { |descendant| descendant.object.to_s }
|
101
|
+
immediate_descendant_uris = resource.graph.query(predicate: ::RDF::Vocab::LDP.contains).map { |descendant| descendant.object.to_s }
|
102
102
|
all_descendants_uris = [uri]
|
103
103
|
immediate_descendant_uris.each do |descendant_uri|
|
104
104
|
all_descendants_uris += descendant_uris(descendant_uri)
|
@@ -7,6 +7,10 @@ module ActiveFedora
|
|
7
7
|
def initialize(file)
|
8
8
|
@file = file
|
9
9
|
super(file.uri, ldp_source.graph)
|
10
|
+
if self.class.type && !self.type.include?(self.class.type)
|
11
|
+
# Workaround for https://github.com/ActiveTriples/ActiveTriples/issues/123
|
12
|
+
self.get_values(:type) << self.class.type
|
13
|
+
end
|
10
14
|
end
|
11
15
|
|
12
16
|
def metadata_uri= uri
|
@@ -37,12 +41,26 @@ module ActiveFedora
|
|
37
41
|
|
38
42
|
def save
|
39
43
|
raise "Save the file first" if file.new_record?
|
40
|
-
|
41
|
-
SparqlInsert.new(change_set.changes, ::RDF::URI.new(file.uri)).execute(metadata_uri)
|
44
|
+
SparqlInsert.new(changes_for_update, ::RDF::URI.new(file.uri)).execute(metadata_uri)
|
42
45
|
@ldp_source = nil
|
43
46
|
true
|
44
47
|
end
|
45
48
|
|
49
|
+
def changed_attributes
|
50
|
+
super.tap do |changed|
|
51
|
+
if type.present?
|
52
|
+
changed['type'] = true
|
53
|
+
end
|
54
|
+
end
|
55
|
+
end
|
56
|
+
|
57
|
+
private
|
58
|
+
|
59
|
+
def changes_for_update
|
60
|
+
ChangeSet.new(self, self, changed_attributes.keys).changes
|
61
|
+
end
|
62
|
+
|
63
|
+
|
46
64
|
class << self
|
47
65
|
def parent_class= parent
|
48
66
|
@parent_class = parent
|
@@ -25,6 +25,17 @@ describe "Collection members" do
|
|
25
25
|
expect(library.books.any?).to be false
|
26
26
|
end
|
27
27
|
end
|
28
|
+
|
29
|
+
context "loading the association prior to a save that affects the association" do
|
30
|
+
let(:library) { Library.new }
|
31
|
+
before do
|
32
|
+
Book.create
|
33
|
+
library.books
|
34
|
+
library.save
|
35
|
+
end
|
36
|
+
subject { library.books.size }
|
37
|
+
it { is_expected.to eq 0 }
|
38
|
+
end
|
28
39
|
end
|
29
40
|
|
30
41
|
describe "looking up has_many" do
|
@@ -2,10 +2,6 @@ require 'spec_helper'
|
|
2
2
|
|
3
3
|
describe ActiveFedora::WithMetadata do
|
4
4
|
before do
|
5
|
-
class Sample < ActiveFedora::Base
|
6
|
-
contains :file, class_name: 'SampleFile'
|
7
|
-
end
|
8
|
-
|
9
5
|
class SampleFile < ActiveFedora::File
|
10
6
|
include ActiveFedora::WithMetadata
|
11
7
|
|
@@ -17,11 +13,9 @@ describe ActiveFedora::WithMetadata do
|
|
17
13
|
|
18
14
|
after do
|
19
15
|
Object.send(:remove_const, :SampleFile)
|
20
|
-
Object.send(:remove_const, :Sample)
|
21
16
|
end
|
22
17
|
|
23
|
-
let(:
|
24
|
-
let(:file) { base.file }
|
18
|
+
let(:file) { SampleFile.new }
|
25
19
|
|
26
20
|
describe "properties" do
|
27
21
|
before do
|
@@ -38,15 +32,57 @@ describe ActiveFedora::WithMetadata do
|
|
38
32
|
|
39
33
|
describe "#save" do
|
40
34
|
before do
|
41
|
-
file.content = "Hey"
|
42
35
|
file.title = ["foo"]
|
43
|
-
base.save
|
44
|
-
base.reload
|
45
36
|
end
|
46
37
|
|
47
|
-
|
48
|
-
|
38
|
+
context "if the object saves (because it has content)" do
|
39
|
+
before do
|
40
|
+
file.content = "Hey"
|
41
|
+
file.save
|
42
|
+
end
|
43
|
+
|
44
|
+
let(:reloaded) { SampleFile.new(file.uri) }
|
45
|
+
|
46
|
+
it "should save the metadata too" do
|
47
|
+
expect(reloaded.title).to eq ['foo']
|
48
|
+
end
|
49
|
+
end
|
50
|
+
|
51
|
+
context "if the object is a new_record (didn't save)" do
|
52
|
+
it "doesn't save the metadata" do
|
53
|
+
expect(file.metadata_node).not_to receive(:save)
|
54
|
+
file.save
|
55
|
+
end
|
49
56
|
end
|
50
57
|
end
|
51
58
|
|
59
|
+
context "when RDF.type is set" do
|
60
|
+
let(:book) { RDF::URI.new("http://example.com/ns/Book") }
|
61
|
+
|
62
|
+
before do
|
63
|
+
class SampleBook < ActiveFedora::File
|
64
|
+
include ActiveFedora::WithMetadata
|
65
|
+
|
66
|
+
metadata do
|
67
|
+
configure type: RDF::URI.new("http://example.com/ns/Book")
|
68
|
+
end
|
69
|
+
end
|
70
|
+
|
71
|
+
file.content = 'foo'
|
72
|
+
file.save
|
73
|
+
end
|
74
|
+
|
75
|
+
after do
|
76
|
+
Object.send(:remove_const, :SampleBook)
|
77
|
+
end
|
78
|
+
|
79
|
+
let(:file) { SampleBook.new }
|
80
|
+
let(:reloaded_file) { SampleBook.new(file.uri) }
|
81
|
+
|
82
|
+
it "persists the configured type" do
|
83
|
+
expect(reloaded_file.metadata_node.query(predicate: ::RDF.type).map(&:object)).to include book
|
84
|
+
end
|
85
|
+
|
86
|
+
end
|
87
|
+
|
52
88
|
end
|
data/spec/unit/file_spec.rb
CHANGED
@@ -222,4 +222,14 @@ describe ActiveFedora::Datastream do
|
|
222
222
|
end
|
223
223
|
end
|
224
224
|
end
|
225
|
+
|
226
|
+
describe "#save" do
|
227
|
+
let(:file) { described_class.new }
|
228
|
+
context "when there is nothing to save" do
|
229
|
+
it "should not write" do
|
230
|
+
expect(file.ldp_source).not_to receive(:create)
|
231
|
+
expect(file.save).to be true
|
232
|
+
end
|
233
|
+
end
|
234
|
+
end
|
225
235
|
end
|
@@ -0,0 +1,45 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
describe ActiveFedora::WithMetadata::MetadataNode do
|
4
|
+
let(:generated_schema) { Class.new(described_class) }
|
5
|
+
|
6
|
+
let(:file) { ActiveFedora::File.new }
|
7
|
+
let(:node) { generated_schema.new(file) }
|
8
|
+
let(:book) { RDF::URI.new('http://example.com/ns/Book') }
|
9
|
+
|
10
|
+
describe "#changed_attributes" do
|
11
|
+
subject { node.changed_attributes }
|
12
|
+
|
13
|
+
context "when type is not set" do
|
14
|
+
it { is_expected.to eq({}) }
|
15
|
+
end
|
16
|
+
|
17
|
+
context "when type is set" do
|
18
|
+
before do
|
19
|
+
generated_schema.configure type: book
|
20
|
+
end
|
21
|
+
|
22
|
+
it { is_expected.to eq('type' => true) }
|
23
|
+
end
|
24
|
+
end
|
25
|
+
|
26
|
+
describe "changes_for_update" do
|
27
|
+
subject { node.send(:changes_for_update) }
|
28
|
+
|
29
|
+
context "when type is not set" do
|
30
|
+
it { is_expected.to eq({}) }
|
31
|
+
end
|
32
|
+
|
33
|
+
context "when type is set" do
|
34
|
+
before do
|
35
|
+
generated_schema.configure type: book
|
36
|
+
end
|
37
|
+
|
38
|
+
it "is expected to have the rdf type statement" do
|
39
|
+
expect(subject[::RDF.type]).to be_kind_of RDF::Queryable::Enumerator
|
40
|
+
end
|
41
|
+
end
|
42
|
+
end
|
43
|
+
|
44
|
+
|
45
|
+
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.1.
|
4
|
+
version: 9.1.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-
|
13
|
+
date: 2015-06-11 00:00:00.000000000 Z
|
14
14
|
dependencies:
|
15
15
|
- !ruby/object:Gem::Dependency
|
16
16
|
name: rsolr
|
@@ -138,20 +138,6 @@ dependencies:
|
|
138
138
|
- - "~>"
|
139
139
|
- !ruby/object:Gem::Version
|
140
140
|
version: 0.3.0
|
141
|
-
- !ruby/object:Gem::Dependency
|
142
|
-
name: rdf-ldp
|
143
|
-
requirement: !ruby/object:Gem::Requirement
|
144
|
-
requirements:
|
145
|
-
- - ">="
|
146
|
-
- !ruby/object:Gem::Version
|
147
|
-
version: '0'
|
148
|
-
type: :runtime
|
149
|
-
prerelease: false
|
150
|
-
version_requirements: !ruby/object:Gem::Requirement
|
151
|
-
requirements:
|
152
|
-
- - ">="
|
153
|
-
- !ruby/object:Gem::Version
|
154
|
-
version: '0'
|
155
141
|
- !ruby/object:Gem::Dependency
|
156
142
|
name: rdoc
|
157
143
|
requirement: !ruby/object:Gem::Requirement
|
@@ -555,6 +541,7 @@ files:
|
|
555
541
|
- spec/unit/solr_service_spec.rb
|
556
542
|
- spec/unit/sparql_insert_spec.rb
|
557
543
|
- spec/unit/validations_spec.rb
|
544
|
+
- spec/unit/with_metadata/metadata_node_spec.rb
|
558
545
|
homepage: https://github.com/projecthydra/active_fedora
|
559
546
|
licenses:
|
560
547
|
- APACHE2
|
@@ -575,7 +562,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
575
562
|
version: '0'
|
576
563
|
requirements: []
|
577
564
|
rubyforge_project:
|
578
|
-
rubygems_version: 2.4.
|
565
|
+
rubygems_version: 2.4.8
|
579
566
|
signing_key:
|
580
567
|
specification_version: 4
|
581
568
|
summary: A convenience libary for manipulating documents in the Fedora Repository.
|