active-fedora 9.7.0 → 9.7.1
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/.rubocop.yml +4 -9
- data/History.txt +9 -0
- data/lib/active_fedora.rb +2 -2
- data/lib/active_fedora/association_hash.rb +2 -2
- data/lib/active_fedora/associations/builder/collection_association.rb +1 -1
- data/lib/active_fedora/associations/builder/has_many.rb +1 -1
- data/lib/active_fedora/associations/collection_association.rb +1 -1
- data/lib/active_fedora/associations/collection_proxy.rb +4 -4
- data/lib/active_fedora/associations/directly_contains_one_association.rb +3 -7
- data/lib/active_fedora/associations/has_many_association.rb +22 -29
- data/lib/active_fedora/associations/indirectly_contains_association.rb +1 -1
- data/lib/active_fedora/autosave_association.rb +1 -1
- data/lib/active_fedora/base.rb +1 -1
- data/lib/active_fedora/callbacks.rb +1 -1
- data/lib/active_fedora/change_set.rb +1 -2
- data/lib/active_fedora/datastreams/nokogiri_datastreams.rb +6 -6
- data/lib/active_fedora/file.rb +5 -4
- data/lib/active_fedora/file_configurator.rb +6 -11
- data/lib/active_fedora/fixity_service.rb +1 -1
- data/lib/active_fedora/indexing_service.rb +3 -3
- data/lib/active_fedora/ldp_cache.rb +1 -1
- data/lib/active_fedora/model.rb +9 -10
- data/lib/active_fedora/nested_attributes.rb +1 -1
- data/lib/active_fedora/nom_datastream.rb +5 -5
- data/lib/active_fedora/om_datastream.rb +2 -2
- data/lib/active_fedora/persistence.rb +2 -2
- data/lib/active_fedora/qualified_dublin_core_datastream.rb +1 -1
- data/lib/active_fedora/rdf/fcrepo.rb +6 -0
- data/lib/active_fedora/rdf/persistence.rb +2 -2
- data/lib/active_fedora/rdf/rdf_datastream.rb +1 -1
- data/lib/active_fedora/reflection.rb +3 -3
- data/lib/active_fedora/relation.rb +2 -2
- data/lib/active_fedora/solr_query_builder.rb +93 -91
- data/lib/active_fedora/solr_service.rb +2 -2
- data/lib/active_fedora/version.rb +1 -1
- data/lib/active_fedora/versionable.rb +14 -12
- data/lib/active_fedora/versions_graph.rb +1 -1
- data/spec/integration/full_featured_model_spec.rb +1 -1
- data/spec/integration/scoped_query_spec.rb +2 -2
- data/spec/integration/versionable_spec.rb +1 -3
- data/spec/unit/forbidden_attributes_protection_spec.rb +1 -1
- data/spec/unit/ntriples_datastream_spec.rb +1 -1
- data/spec/unit/persistence_spec.rb +1 -1
- data/spec/unit/predicates_spec.rb +1 -1
- data/spec/unit/qualified_dublin_core_datastream_spec.rb +1 -1
- data/spec/unit/solr_config_options_spec.rb +3 -3
- 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: b84c2ad365e0934c1c9a6900e855dad6e3e0fb89
|
4
|
+
data.tar.gz: 138dc99577501a383818150e1e3ce25622312d90
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 045396d2d76fc88b5f1ceb99340cb5dfebf6b0af631c13f2ae22d15c5de243758aeaf0717221cb202f310b846b2541f588e941741a081e8f16a71577c214ef76
|
7
|
+
data.tar.gz: 42aa7a98b66b0dcc517aa67ec26889b84850bc195d2f7d6b444520f0de9afc890a5144e553906982e6181542a129d616f8d9cfec36bd02f49d8a54d0d84a2a68
|
data/.rubocop.yml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
require: rubocop-rspec
|
2
2
|
|
3
3
|
AllCops:
|
4
|
-
|
4
|
+
TargetRubyVersion: 2.2
|
5
5
|
DisplayCopNames: true
|
6
6
|
Include:
|
7
7
|
- '**/Rakefile'
|
@@ -9,10 +9,6 @@ AllCops:
|
|
9
9
|
- 'script/**/*'
|
10
10
|
- 'vendor/**/*'
|
11
11
|
|
12
|
-
Lint/RescueException:
|
13
|
-
Exclude:
|
14
|
-
- 'lib/active_fedora/ldp_cache.rb'
|
15
|
-
|
16
12
|
Lint/HandleExceptions:
|
17
13
|
Exclude:
|
18
14
|
- 'spec/unit/**/*'
|
@@ -184,9 +180,6 @@ Style/ClassAndModuleChildren:
|
|
184
180
|
Style/Documentation:
|
185
181
|
Enabled: false
|
186
182
|
|
187
|
-
Style/HashSyntax:
|
188
|
-
Exclude:
|
189
|
-
|
190
183
|
Style/GlobalVars:
|
191
184
|
Exclude:
|
192
185
|
- 'spec/**/*'
|
@@ -210,6 +203,9 @@ Style/FileName:
|
|
210
203
|
- 'lib/active-fedora.rb'
|
211
204
|
- 'spec/samples/hydra-mods_article_datastream.rb'
|
212
205
|
|
206
|
+
Rails:
|
207
|
+
Enabled: true
|
208
|
+
|
213
209
|
Rails/Output:
|
214
210
|
Exclude:
|
215
211
|
- 'lib/generators/**/*'
|
@@ -242,4 +238,3 @@ RSpec/DescribeClass:
|
|
242
238
|
RSpec/DescribedClass:
|
243
239
|
Exclude:
|
244
240
|
- 'spec/unit/finder_methods_spec.rb'
|
245
|
-
|
data/History.txt
CHANGED
@@ -1,3 +1,12 @@
|
|
1
|
+
v9.7.1
|
2
|
+
2016-01-22 : The jcr/mix versionable predicate is no longer used [Adam Wead]
|
3
|
+
|
4
|
+
2016-01-22 : Add detail to SolrQueryBuilder.construct_query_for_pids deprecation warning [David Chandek-Stark]
|
5
|
+
|
6
|
+
2016-01-21 : Updating to the latest Rubocop [Michael J. Giarlo]
|
7
|
+
|
8
|
+
2015-12-04 : Adds :PID property to ActiveFedora::RDF::Fcrepo::Model vocab [David Chandek-Stark]
|
9
|
+
|
1
10
|
v9.7.0
|
2
11
|
2015-11-25 : Allowing access to the gone? method from outside the object [Carolyn Cole]
|
3
12
|
|
data/lib/active_fedora.rb
CHANGED
@@ -209,9 +209,9 @@ module ActiveFedora #:nodoc:
|
|
209
209
|
return config_options[:environment]
|
210
210
|
elsif defined?(Rails.env) && !Rails.env.nil?
|
211
211
|
return Rails.env.to_s
|
212
|
-
elsif defined?(ENV['environment']) && !
|
212
|
+
elsif defined?(ENV['environment']) && !ENV['environment'].nil?
|
213
213
|
return ENV['environment']
|
214
|
-
elsif defined?(ENV['RAILS_ENV']) && !
|
214
|
+
elsif defined?(ENV['RAILS_ENV']) && !ENV['RAILS_ENV'].nil?
|
215
215
|
raise "You're depending on RAILS_ENV for setting your environment. Please use ENV['environment'] for non-rails environment setting: 'rake foo:bar environment=test'"
|
216
216
|
else
|
217
217
|
ENV['environment'] = 'development'
|
@@ -44,8 +44,8 @@ module ActiveFedora
|
|
44
44
|
def key?(key)
|
45
45
|
keys.include?(key) || keys.map(&:to_s).include?(key)
|
46
46
|
end
|
47
|
-
|
48
|
-
|
47
|
+
alias include? key?
|
48
|
+
alias has_key? key?
|
49
49
|
|
50
50
|
def values
|
51
51
|
keys.map { |k| self[k] }
|
@@ -1,7 +1,7 @@
|
|
1
1
|
require 'active_fedora/associations'
|
2
2
|
module ActiveFedora::Associations::Builder
|
3
3
|
class CollectionAssociation < Association #:nodoc:
|
4
|
-
CALLBACKS = [:before_add, :after_add, :before_remove, :after_remove]
|
4
|
+
CALLBACKS = [:before_add, :after_add, :before_remove, :after_remove].freeze
|
5
5
|
|
6
6
|
self.valid_options += [
|
7
7
|
:before_add, :after_add, :before_remove, :after_remove
|
@@ -52,7 +52,7 @@ module ActiveFedora::Associations::Builder
|
|
52
52
|
send(name).delete_all
|
53
53
|
end
|
54
54
|
end
|
55
|
-
|
55
|
+
alias define_nullify_dependency_method define_delete_all_dependency_method
|
56
56
|
|
57
57
|
def define_restrict_dependency_method
|
58
58
|
name = self.name
|
@@ -835,7 +835,7 @@ module ActiveFedora
|
|
835
835
|
@association.include?(record)
|
836
836
|
end
|
837
837
|
|
838
|
-
|
838
|
+
alias new build
|
839
839
|
|
840
840
|
def proxy_association
|
841
841
|
@association
|
@@ -845,17 +845,17 @@ module ActiveFedora
|
|
845
845
|
def scope
|
846
846
|
@association.scope
|
847
847
|
end
|
848
|
-
|
848
|
+
alias spawn scope
|
849
849
|
|
850
850
|
def to_ary
|
851
851
|
load_target.dup
|
852
852
|
end
|
853
|
-
|
853
|
+
alias to_a to_ary
|
854
854
|
|
855
855
|
def <<(*records)
|
856
856
|
proxy_association.concat(records) && self
|
857
857
|
end
|
858
|
-
|
858
|
+
alias push <<
|
859
859
|
|
860
860
|
def clear
|
861
861
|
delete_all
|
@@ -98,13 +98,9 @@ module ActiveFedora
|
|
98
98
|
# Returns the RDF node that contains metadata like RDF.type assertions for the record
|
99
99
|
# Sometimes this is the record, other times it's record.metadata_node
|
100
100
|
def metadata_node_for_record(record)
|
101
|
-
if record.respond_to?(:type) && record.respond_to?(:set_value)
|
102
|
-
|
103
|
-
|
104
|
-
return record.metadata_node
|
105
|
-
else
|
106
|
-
raise ArgumentError, "record must either have a metadata node or must respond to .type"
|
107
|
-
end
|
101
|
+
return record if record.respond_to?(:type) && record.respond_to?(:set_value)
|
102
|
+
return record.metadata_node if record.respond_to?(:metadata_node)
|
103
|
+
raise ArgumentError, "record must either have a metadata node or must respond to .type"
|
108
104
|
end
|
109
105
|
end
|
110
106
|
end
|
@@ -69,40 +69,33 @@ module ActiveFedora
|
|
69
69
|
|
70
70
|
# Deletes the records according to the <tt>:dependent</tt> option.
|
71
71
|
def delete_records(records, method)
|
72
|
-
if method == :destroy
|
73
|
-
|
74
|
-
|
75
|
-
|
76
|
-
# keys = records.map { |r| r[reflection.association_primary_key] }
|
77
|
-
# scope = scoped.where(reflection.association_primary_key => keys)
|
72
|
+
return records.each(&:destroy) if method == :destroy
|
73
|
+
# Find all the records that point to this and nullify them
|
74
|
+
# keys = records.map { |r| r[reflection.association_primary_key] }
|
75
|
+
# scope = scoped.where(reflection.association_primary_key => keys)
|
78
76
|
|
79
|
-
|
80
|
-
raise "Not Implemented"
|
81
|
-
# update_counter(-scope.delete_all)
|
82
|
-
else
|
77
|
+
raise "Not Implemented" if method == :delete_all # update_counter(-scope.delete_all)
|
83
78
|
|
84
|
-
|
85
|
-
|
86
|
-
|
87
|
-
|
88
|
-
|
89
|
-
|
90
|
-
|
91
|
-
|
92
|
-
|
93
|
-
|
94
|
-
|
95
|
-
|
96
|
-
end
|
97
|
-
# Check to see if the object still exists (may be already deleted).
|
98
|
-
# In Rails, they do this with an update_all to avoid callbacks and validations, we may need the same.
|
99
|
-
record.save! if record.class.exists?(record.id)
|
100
|
-
end
|
79
|
+
if reflection.inverse_of # Can't get an inverse when class_name: 'ActiveFedora::Base' is supplied
|
80
|
+
inverse = reflection.inverse_of
|
81
|
+
records.each do |record|
|
82
|
+
next unless record.persisted?
|
83
|
+
if inverse.collection?
|
84
|
+
# Remove from a has_and_belongs_to_many
|
85
|
+
record.association(inverse.name).delete(@owner)
|
86
|
+
elsif inverse.klass == ActiveFedora::Base
|
87
|
+
record[inverse.foreign_key] = nil
|
88
|
+
else
|
89
|
+
# Remove from a belongs_to
|
90
|
+
record[reflection.foreign_key] = nil
|
101
91
|
end
|
102
|
-
|
103
|
-
#
|
92
|
+
# Check to see if the object still exists (may be already deleted).
|
93
|
+
# In Rails, they do this with an update_all to avoid callbacks and validations, we may need the same.
|
94
|
+
record.save! if record.class.exists?(record.id)
|
104
95
|
end
|
105
96
|
end
|
97
|
+
|
98
|
+
# update_counter(-scope.update_all(reflection.foreign_key => nil))
|
106
99
|
end
|
107
100
|
end
|
108
101
|
end
|
@@ -75,7 +75,7 @@ module ActiveFedora
|
|
75
75
|
module AutosaveAssociation
|
76
76
|
extend ActiveSupport::Concern
|
77
77
|
|
78
|
-
ASSOCIATION_TYPES = %w( HasMany BelongsTo HasAndBelongsToMany DirectlyContains IndirectlyContains)
|
78
|
+
ASSOCIATION_TYPES = %w( HasMany BelongsTo HasAndBelongsToMany DirectlyContains IndirectlyContains).freeze
|
79
79
|
|
80
80
|
module AssociationBuilderExtension #:nodoc:
|
81
81
|
def self.included(base)
|
data/lib/active_fedora/base.rb
CHANGED
@@ -1,4 +1,4 @@
|
|
1
|
-
SOLR_DOCUMENT_ID = "id" unless defined?(SOLR_DOCUMENT_ID) && !SOLR_DOCUMENT_ID.nil?
|
1
|
+
SOLR_DOCUMENT_ID = "id".freeze unless defined?(SOLR_DOCUMENT_ID) && !SOLR_DOCUMENT_ID.nil?
|
2
2
|
ENABLE_SOLR_UPDATES = true unless defined?(ENABLE_SOLR_UPDATES)
|
3
3
|
require 'active_support/descendants_tracker'
|
4
4
|
require 'active_fedora/errors'
|
@@ -216,7 +216,7 @@ module ActiveFedora
|
|
216
216
|
:before_save, :around_save, :after_save, :before_create, :around_create,
|
217
217
|
:after_create, :before_update, :around_update, :after_update,
|
218
218
|
:before_destroy, :around_destroy, :after_destroy
|
219
|
-
]
|
219
|
+
].freeze
|
220
220
|
|
221
221
|
included do
|
222
222
|
extend ActiveModel::Callbacks
|
@@ -59,8 +59,7 @@ module ActiveFedora
|
|
59
59
|
end
|
60
60
|
|
61
61
|
def internal?
|
62
|
-
value.object.to_s.start_with?("http://www.jcp.org") ||
|
63
|
-
value.object.to_s.start_with?("http://fedora.info") ||
|
62
|
+
value.object.to_s.start_with?("http://www.jcp.org", "http://fedora.info") ||
|
64
63
|
value.predicate.to_s.start_with?("http://fedora.info")
|
65
64
|
end
|
66
65
|
end
|
@@ -15,12 +15,12 @@ module ActiveFedora
|
|
15
15
|
|
16
16
|
def ng_xml
|
17
17
|
@ng_xml ||= begin
|
18
|
-
if new_record?
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
|
18
|
+
xml = if new_record?
|
19
|
+
## Load up the template
|
20
|
+
self.class.xml_template
|
21
|
+
else
|
22
|
+
Nokogiri::XML::Document.parse(remote_content)
|
23
|
+
end
|
24
24
|
self.class.decorate_ng_xml xml
|
25
25
|
end
|
26
26
|
end
|
data/lib/active_fedora/file.rb
CHANGED
@@ -188,6 +188,11 @@ module ActiveFedora
|
|
188
188
|
false
|
189
189
|
end
|
190
190
|
|
191
|
+
def self.relation
|
192
|
+
FileRelation.new(self)
|
193
|
+
end
|
194
|
+
private_class_method :relation
|
195
|
+
|
191
196
|
protected
|
192
197
|
|
193
198
|
# The string to prefix all solr fields with. Override this method if you want
|
@@ -198,10 +203,6 @@ module ActiveFedora
|
|
198
203
|
|
199
204
|
private
|
200
205
|
|
201
|
-
def self.relation
|
202
|
-
FileRelation.new(self)
|
203
|
-
end
|
204
|
-
|
205
206
|
# Rack::Test::UploadedFile is often set via content=, however it's not an IO, though it wraps an io object.
|
206
207
|
def behaves_like_io?(obj)
|
207
208
|
[IO, Tempfile, StringIO].any? { |klass| obj.is_a? klass } || (defined?(Rack) && obj.is_a?(Rack::Test::UploadedFile))
|
@@ -149,14 +149,12 @@ module ActiveFedora
|
|
149
149
|
# Given the solr_config that's been loaded for this environment,
|
150
150
|
# determine which solr url to use
|
151
151
|
def solr_url(solr_config)
|
152
|
+
return solr_config[:url] if solr_config.key?(:url)
|
153
|
+
return solr_config['url'] if solr_config.key?('url')
|
152
154
|
if @index_full_text == true && solr_config.key?(:fulltext) && solr_config[:fulltext].key?('url')
|
153
|
-
|
155
|
+
solr_config[:fulltext]['url']
|
154
156
|
elsif solr_config.key?(:default) && solr_config[:default].key?('url')
|
155
|
-
|
156
|
-
elsif solr_config.key?('url')
|
157
|
-
return solr_config['url']
|
158
|
-
elsif solr_config.key?(:url)
|
159
|
-
return solr_config[:url]
|
157
|
+
solr_config[:default]['url']
|
160
158
|
else
|
161
159
|
raise URI::InvalidURIError
|
162
160
|
end
|
@@ -208,11 +206,8 @@ module ActiveFedora
|
|
208
206
|
# Checks the existing fedora_config.path to see if there is a solr.yml there
|
209
207
|
def check_fedora_path_for_solr
|
210
208
|
path = ::File.dirname(self.path) + "/solr.yml"
|
211
|
-
|
212
|
-
|
213
|
-
else
|
214
|
-
return nil
|
215
|
-
end
|
209
|
+
return unless ::File.file? path
|
210
|
+
path
|
216
211
|
end
|
217
212
|
|
218
213
|
def predicate_config
|
@@ -39,9 +39,9 @@ module ActiveFedora
|
|
39
39
|
Solrizer.set_field(solr_doc, 'system_create', c_time, :stored_sortable)
|
40
40
|
Solrizer.set_field(solr_doc, 'system_modified', m_time, :stored_sortable)
|
41
41
|
Solrizer.set_field(solr_doc, 'active_fedora_model', object.class.inspect, :stored_sortable)
|
42
|
-
solr_doc
|
43
|
-
solr_doc
|
44
|
-
solr_doc
|
42
|
+
solr_doc[QueryResultBuilder::HAS_MODEL_SOLR_FIELD] = object.has_model
|
43
|
+
solr_doc[SOLR_DOCUMENT_ID.to_sym] = object.id
|
44
|
+
solr_doc[self.class.profile_solr_name] = profile_service.new(object).export
|
45
45
|
object.declared_attached_files.each do |name, file|
|
46
46
|
solr_doc.merge! file.to_solr(solr_doc, name: name.to_s)
|
47
47
|
end
|
data/lib/active_fedora/model.rb
CHANGED
@@ -1,4 +1,4 @@
|
|
1
|
-
SOLR_DOCUMENT_ID = "id" unless defined?(SOLR_DOCUMENT_ID)
|
1
|
+
SOLR_DOCUMENT_ID = "id".freeze unless defined?(SOLR_DOCUMENT_ID)
|
2
2
|
|
3
3
|
module ActiveFedora
|
4
4
|
# = ActiveFedora
|
@@ -17,14 +17,13 @@ module ActiveFedora
|
|
17
17
|
ActiveFedora.class_from_string(model_value)
|
18
18
|
end
|
19
19
|
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
|
24
|
-
|
25
|
-
|
26
|
-
|
27
|
-
|
28
|
-
end
|
20
|
+
def self.class_exists?(class_name)
|
21
|
+
return false if class_name.empty?
|
22
|
+
klass = class_name.constantize
|
23
|
+
return klass.is_a?(Class)
|
24
|
+
rescue NameError
|
25
|
+
return false
|
26
|
+
end
|
27
|
+
private_class_method :class_exists?
|
29
28
|
end
|
30
29
|
end
|
@@ -113,7 +113,7 @@ module ActiveFedora
|
|
113
113
|
|
114
114
|
# Attribute hash keys that should not be assigned as normal attributes.
|
115
115
|
# These hash keys are nested attributes implementation details.
|
116
|
-
UNASSIGNABLE_KEYS = %w( id _destroy )
|
116
|
+
UNASSIGNABLE_KEYS = %w( id _destroy ).freeze
|
117
117
|
|
118
118
|
def assign_nested_attributes_for_collection_association(association_name, attributes_collection)
|
119
119
|
options = nested_attributes_options[association_name]
|
@@ -34,11 +34,11 @@ module ActiveFedora
|
|
34
34
|
term.values.each do |v|
|
35
35
|
Array(term.options[:index]).each do |index_as|
|
36
36
|
solr_doc[index_as] ||= []
|
37
|
-
if v.is_a? Nokogiri::XML::Node
|
38
|
-
|
39
|
-
|
40
|
-
|
41
|
-
|
37
|
+
solr_doc[index_as] << if v.is_a? Nokogiri::XML::Node
|
38
|
+
v.text
|
39
|
+
else
|
40
|
+
v
|
41
|
+
end
|
42
42
|
end
|
43
43
|
end
|
44
44
|
end
|
@@ -13,8 +13,8 @@ module ActiveFedora
|
|
13
13
|
include OM::XML::TerminologyBasedSolrizer # this adds support for calling .to_solr
|
14
14
|
include Datastreams::NokogiriDatastreams
|
15
15
|
|
16
|
-
|
17
|
-
|
16
|
+
alias om_term_values term_values unless method_defined?(:om_term_values)
|
17
|
+
alias om_update_values update_values unless method_defined?(:om_update_values)
|
18
18
|
|
19
19
|
def default_mime_type
|
20
20
|
'text/xml'
|
@@ -37,7 +37,7 @@ module ActiveFedora
|
|
37
37
|
save
|
38
38
|
end
|
39
39
|
|
40
|
-
|
40
|
+
alias update_attributes update
|
41
41
|
|
42
42
|
# Deletes an object from Fedora and deletes the indexed record from Solr.
|
43
43
|
# Delete does not run any callbacks, so consider using _destroy_ instead.
|
@@ -186,7 +186,7 @@ module ActiveFedora
|
|
186
186
|
end
|
187
187
|
|
188
188
|
def base_path_for_resource
|
189
|
-
init_root_path if
|
189
|
+
init_root_path if has_uri_prefix?
|
190
190
|
root_resource_path
|
191
191
|
end
|
192
192
|
|
@@ -157,6 +157,12 @@ module ActiveFedora::RDF
|
|
157
157
|
comment: %(indicates the owner of an object).freeze,
|
158
158
|
label: "ownerId".freeze,
|
159
159
|
type: "rdf:Property".freeze
|
160
|
+
property :PID,
|
161
|
+
comment: %(the Fedora 3 PID for an object).freeze,
|
162
|
+
label: "PID".freeze,
|
163
|
+
domain: "info:fedora/fedora-system:def/model#FedoraObject".freeze,
|
164
|
+
range: "xsd:string".freeze,
|
165
|
+
type: "rdf:Property".freeze
|
160
166
|
property :state,
|
161
167
|
comment: %(indicates the state of the object or datastream).freeze,
|
162
168
|
label: "state".freeze,
|
@@ -10,7 +10,7 @@ module ActiveFedora
|
|
10
10
|
module Persistence
|
11
11
|
extend ActiveSupport::Concern
|
12
12
|
|
13
|
-
BASE_URI = 'info:fedora/'
|
13
|
+
BASE_URI = 'info:fedora/'.freeze
|
14
14
|
|
15
15
|
included do
|
16
16
|
configure base_uri: BASE_URI unless base_uri
|
@@ -25,7 +25,7 @@ module ActiveFedora
|
|
25
25
|
|
26
26
|
# Overrides ActiveTriples::Resource
|
27
27
|
def persisted?
|
28
|
-
@persisted ||=
|
28
|
+
@persisted ||= !datastream.new_record?
|
29
29
|
end
|
30
30
|
end
|
31
31
|
end
|
@@ -217,7 +217,7 @@ module ActiveFedora
|
|
217
217
|
[self]
|
218
218
|
end
|
219
219
|
|
220
|
-
|
220
|
+
alias source_macro macro
|
221
221
|
|
222
222
|
def has_inverse?
|
223
223
|
inverse_name
|
@@ -265,8 +265,8 @@ module ActiveFedora
|
|
265
265
|
end
|
266
266
|
end
|
267
267
|
|
268
|
-
VALID_AUTOMATIC_INVERSE_MACROS = [:has_many, :has_and_belongs_to_many, :belongs_to]
|
269
|
-
INVALID_AUTOMATIC_INVERSE_OPTIONS = [:conditions, :through, :polymorphic, :foreign_key]
|
268
|
+
VALID_AUTOMATIC_INVERSE_MACROS = [:has_many, :has_and_belongs_to_many, :belongs_to].freeze
|
269
|
+
INVALID_AUTOMATIC_INVERSE_OPTIONS = [:conditions, :through, :polymorphic, :foreign_key].freeze
|
270
270
|
|
271
271
|
private
|
272
272
|
|
@@ -5,7 +5,7 @@ module ActiveFedora
|
|
5
5
|
|
6
6
|
attr_reader :loaded
|
7
7
|
attr_accessor :default_scoped
|
8
|
-
|
8
|
+
alias loaded? loaded
|
9
9
|
|
10
10
|
attr_accessor :values, :klass
|
11
11
|
|
@@ -129,7 +129,7 @@ module ActiveFedora
|
|
129
129
|
|
130
130
|
private
|
131
131
|
|
132
|
-
VALID_FIND_OPTIONS = [:order, :limit, :start, :conditions, :cast]
|
132
|
+
VALID_FIND_OPTIONS = [:order, :limit, :start, :conditions, :cast].freeze
|
133
133
|
|
134
134
|
def apply_finder_options(options)
|
135
135
|
relation = clone
|
@@ -2,114 +2,116 @@ module ActiveFedora
|
|
2
2
|
module SolrQueryBuilder
|
3
3
|
PARSED_SUFFIX = '_tesim'.freeze
|
4
4
|
|
5
|
-
|
6
|
-
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
|
5
|
+
class << self
|
6
|
+
# Construct a solr query for a list of ids
|
7
|
+
# This is used to get a solr response based on the list of ids in an object's RELS-EXT relationhsips
|
8
|
+
# If the id_array is empty, defaults to a query of "id:NEVER_USE_THIS_ID", which will return an empty solr response
|
9
|
+
# @param [Array] id_array the ids that you want included in the query
|
10
|
+
def construct_query_for_ids(id_array)
|
11
|
+
ids = id_array.reject(&:blank?)
|
12
|
+
return "id:NEVER_USE_THIS_ID" if ids.empty?
|
13
|
+
"{!terms f=#{SOLR_DOCUMENT_ID}}#{ids.join(',')}"
|
14
|
+
end
|
14
15
|
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
|
16
|
+
# Create a raw query clause suitable for sending to solr as an fq element
|
17
|
+
# @param [String] key
|
18
|
+
# @param [String] value
|
19
|
+
def raw_query(key, value)
|
20
|
+
"_query_:\"{!raw f=#{key}}#{value.gsub('"', '\"')}\""
|
21
|
+
end
|
21
22
|
|
22
|
-
|
23
|
-
|
24
|
-
|
23
|
+
def solr_name(*args)
|
24
|
+
Solrizer.default_field_mapper.solr_name(*args)
|
25
|
+
end
|
25
26
|
|
26
|
-
|
27
|
-
|
28
|
-
|
29
|
-
|
30
|
-
|
31
|
-
|
32
|
-
|
33
|
-
|
34
|
-
|
35
|
-
|
36
|
-
|
37
|
-
|
27
|
+
# Create a query with a clause for each key, value
|
28
|
+
# @param [Hash, Array<Array<String>>] field_pairs key is the predicate, value is the target_uri
|
29
|
+
# @param [String] join_with ('AND') the value we're joining the clauses with
|
30
|
+
# @example
|
31
|
+
# construct_query_for_rel [[:has_model, "info:fedora/afmodel:ComplexCollection"], [:has_model, "info:fedora/afmodel:ActiveFedora_Base"]], 'OR'
|
32
|
+
# # => _query_:"{!raw f=has_model_ssim}info:fedora/afmodel:ComplexCollection" OR _query_:"{!raw f=has_model_ssim}info:fedora/afmodel:ActiveFedora_Base"
|
33
|
+
#
|
34
|
+
# construct_query_for_rel [[Book.reflect_on_association(:library), "foo/bar/baz"]]
|
35
|
+
def construct_query_for_rel(field_pairs, join_with = ' AND ')
|
36
|
+
field_pairs = field_pairs.to_a if field_pairs.is_a? Hash
|
37
|
+
construct_query(property_values_to_solr(field_pairs), join_with)
|
38
|
+
end
|
38
39
|
|
39
|
-
|
40
|
-
|
41
|
-
|
42
|
-
|
43
|
-
|
44
|
-
|
45
|
-
|
46
|
-
|
47
|
-
|
48
|
-
|
40
|
+
# Construct a solr query from a list of pairs (e.g. [field name, values])
|
41
|
+
# @param [Array<Array>] field_pairs a list of pairs of property name and values
|
42
|
+
# @param [String] join_with ('AND') the value we're joining the clauses with
|
43
|
+
# @return [String] a solr query
|
44
|
+
# @example
|
45
|
+
# construct_query([['library_id_ssim', '123'], ['owner_ssim', 'Fred']])
|
46
|
+
# # => "_query_:\"{!raw f=library_id_ssim}123\" AND _query_:\"{!raw f=owner_ssim}Fred\""
|
47
|
+
def construct_query(field_pairs, join_with = ' AND ')
|
48
|
+
pairs_to_clauses(field_pairs).join(join_with)
|
49
|
+
end
|
49
50
|
|
50
|
-
|
51
|
+
private
|
51
52
|
|
52
|
-
|
53
|
-
|
54
|
-
|
55
|
-
|
56
|
-
|
53
|
+
# @param [Array<Array>] pairs a list of (key, value) pairs. The value itself may
|
54
|
+
# @return [Array] a list of solr clauses
|
55
|
+
def pairs_to_clauses(pairs)
|
56
|
+
pairs.flat_map do |field, value|
|
57
|
+
condition_to_clauses(field, value)
|
58
|
+
end
|
57
59
|
end
|
58
|
-
end
|
59
60
|
|
60
|
-
|
61
|
-
|
62
|
-
|
63
|
-
|
64
|
-
|
65
|
-
|
66
|
-
|
67
|
-
|
68
|
-
|
69
|
-
|
70
|
-
|
61
|
+
# @param [String] field
|
62
|
+
# @param [String, Array<String>] values
|
63
|
+
# @return [Array<String>]
|
64
|
+
def condition_to_clauses(field, values)
|
65
|
+
values = Array(values)
|
66
|
+
values << nil if values.empty?
|
67
|
+
values.map do |value|
|
68
|
+
if value.present?
|
69
|
+
if parsed?(field)
|
70
|
+
# If you do a raw query on a parsed field you won't get the matches you expect.
|
71
|
+
"#{field}:#{solr_escape(value)}"
|
72
|
+
else
|
73
|
+
raw_query(field, value)
|
74
|
+
end
|
71
75
|
else
|
72
|
-
|
76
|
+
# Check that the field is not present. In SQL: "WHERE field IS NULL"
|
77
|
+
"-#{field}:[* TO *]"
|
73
78
|
end
|
74
|
-
else
|
75
|
-
# Check that the field is not present. In SQL: "WHERE field IS NULL"
|
76
|
-
"-#{field}:[* TO *]"
|
77
79
|
end
|
78
80
|
end
|
79
|
-
end
|
80
81
|
|
81
|
-
|
82
|
-
|
83
|
-
|
82
|
+
def parsed?(field)
|
83
|
+
field.end_with?(PARSED_SUFFIX)
|
84
|
+
end
|
84
85
|
|
85
|
-
|
86
|
-
|
87
|
-
|
88
|
-
|
89
|
-
|
86
|
+
# Adds esaping for spaces which are not handled by RSolr.solr_escape
|
87
|
+
# See rsolr/rsolr#101
|
88
|
+
def solr_escape(terms)
|
89
|
+
RSolr.solr_escape(terms).gsub(/\s+/, "\\ ")
|
90
|
+
end
|
90
91
|
|
91
|
-
|
92
|
-
|
93
|
-
|
94
|
-
|
95
|
-
|
96
|
-
|
97
|
-
|
98
|
-
|
99
|
-
|
100
|
-
|
92
|
+
# Given a list of pairs (e.g. [field name, values]), convert the field names
|
93
|
+
# to solr names
|
94
|
+
# @param [Array<Array>] pairs a list of pairs of property name and values
|
95
|
+
# @return [Hash] map of solr fields to values
|
96
|
+
# @example
|
97
|
+
# property_values_to_solr([['library_id', '123'], ['owner', 'Fred']])
|
98
|
+
# # => [['library_id_ssim', '123'], ['owner_ssim', 'Fred']]
|
99
|
+
def property_values_to_solr(pairs)
|
100
|
+
pairs.each_with_object([]) do |(property, value), list|
|
101
|
+
list << [solr_field(property), value]
|
102
|
+
end
|
101
103
|
end
|
102
|
-
end
|
103
104
|
|
104
|
-
|
105
|
-
|
106
|
-
|
107
|
-
|
108
|
-
|
109
|
-
|
110
|
-
|
111
|
-
|
105
|
+
# @param [String, ActiveFedora::Relation] field
|
106
|
+
# @return [String] the corresponding solr field for the string
|
107
|
+
def solr_field(field)
|
108
|
+
case field
|
109
|
+
when ActiveFedora::Reflection::AssociationReflection
|
110
|
+
field.solr_key
|
111
|
+
else
|
112
|
+
solr_name(field, :symbol)
|
113
|
+
end
|
112
114
|
end
|
113
|
-
|
115
|
+
end
|
114
116
|
end
|
115
117
|
end
|
@@ -10,7 +10,7 @@ module ActiveFedora
|
|
10
10
|
def initialize(host, args)
|
11
11
|
host = 'http://localhost:8080/solr' unless host
|
12
12
|
args = { read_timeout: 120, open_timeout: 120 }.merge(args.dup)
|
13
|
-
args
|
13
|
+
args[:url] = host
|
14
14
|
@conn = RSolr.connect args
|
15
15
|
end
|
16
16
|
|
@@ -71,7 +71,7 @@ module ActiveFedora
|
|
71
71
|
end
|
72
72
|
|
73
73
|
def construct_query_for_pids(id_array)
|
74
|
-
Deprecation.warn SolrService, "construct_query_for_pids is deprecated
|
74
|
+
Deprecation.warn SolrService, "SolrService.construct_query_for_pids is deprecated. Use SolrQueryBuilder.construct_query_for_ids instead. This will be removed in active-fedora 10.0"
|
75
75
|
SolrQueryBuilder.construct_query_for_ids(id_array)
|
76
76
|
end
|
77
77
|
|
@@ -15,7 +15,7 @@ module ActiveFedora
|
|
15
15
|
end
|
16
16
|
|
17
17
|
def model_type
|
18
|
-
if
|
18
|
+
if respond_to?(:metadata)
|
19
19
|
metadata.ldp_source.graph.query(predicate: ::RDF.type).objects
|
20
20
|
else
|
21
21
|
resource.query(subject: resource.rdf_subject, predicate: ::RDF.type).objects
|
@@ -50,23 +50,17 @@ module ActiveFedora
|
|
50
50
|
resp = ActiveFedora.fedora.connection.patch(versions.with_label(label).uri, nil)
|
51
51
|
@versions = nil
|
52
52
|
reload
|
53
|
-
refresh_attributes if
|
53
|
+
refresh_attributes if respond_to?("refresh_attributes")
|
54
54
|
resp.success?
|
55
55
|
end
|
56
56
|
|
57
57
|
private
|
58
58
|
|
59
59
|
def versions_request
|
60
|
-
|
61
|
-
|
62
|
-
|
63
|
-
|
64
|
-
end
|
65
|
-
if !resp.success?
|
66
|
-
raise "unexpected return value #{resp.status} for when getting datastream content at #{uri}\n\t#{resp.body}"
|
67
|
-
elsif resp.headers['content-type'] != 'text/turtle'
|
68
|
-
raise "unknown response format. got '#{resp.headers['content-type']}', but was expecting 'text/turtle'"
|
69
|
-
end
|
60
|
+
return '' unless has_versions?
|
61
|
+
resp = ActiveFedora.fedora.connection.get(versions_uri)
|
62
|
+
raise ActiveFedoraError, status_message(resp) unless resp.success?
|
63
|
+
raise ActiveFedoraError, bad_headers(resp) unless resp.headers['content-type'] == 'text/turtle'
|
70
64
|
resp.body
|
71
65
|
end
|
72
66
|
|
@@ -81,5 +75,13 @@ module ActiveFedora
|
|
81
75
|
"version" + (versions.all.count + 1).to_s
|
82
76
|
end
|
83
77
|
end
|
78
|
+
|
79
|
+
def status_message(response)
|
80
|
+
"Unexpected return value #{response.status} when retrieving datastream content at #{uri}\n\t#{response.body}"
|
81
|
+
end
|
82
|
+
|
83
|
+
def bad_headers(response)
|
84
|
+
"Unknown response format. Got '#{response.headers['content-type']}', but was expecting 'text/turtle'"
|
85
|
+
end
|
84
86
|
end
|
85
87
|
end
|
@@ -3,7 +3,7 @@ module ActiveFedora
|
|
3
3
|
def all(opts = {})
|
4
4
|
versions = fedora_versions
|
5
5
|
unless opts[:include_auto_save]
|
6
|
-
versions.reject! { |version| version.label
|
6
|
+
versions.reject! { |version| version.label =~ /auto/ }
|
7
7
|
end
|
8
8
|
versions.sort_by { |version| DateTime.parse(version.created) }
|
9
9
|
rescue ArgumentError, NoMethodError
|
@@ -140,7 +140,7 @@ describe ActiveFedora::Base do
|
|
140
140
|
|
141
141
|
@dublin_core_sample_values.each_pair do |field, value|
|
142
142
|
next if [:format, :type].include?(field) # format and type are methods declared on Object
|
143
|
-
expect(dublin_core_ds.send(
|
143
|
+
expect(dublin_core_ds.send(field.to_s)).to eq [value]
|
144
144
|
end
|
145
145
|
end
|
146
146
|
|
@@ -40,7 +40,7 @@ describe ActiveFedora::Querying do
|
|
40
40
|
expect(result).to be_instance_of(Array)
|
41
41
|
# this test is meaningless if the array length is zero
|
42
42
|
expect(result.length > 0).to be true
|
43
|
-
expect(result).to all(be_an
|
43
|
+
expect(result).to all(be_an(ModelIntegrationSpec::Basic))
|
44
44
|
end
|
45
45
|
end
|
46
46
|
|
@@ -90,7 +90,7 @@ describe ActiveFedora::Querying do
|
|
90
90
|
first_condition = { ActiveFedora::SolrQueryBuilder.solr_name('bar', type: :string) => 'Peanuts' }
|
91
91
|
second_condition = "foo_tesim:bar"
|
92
92
|
where_values = ModelIntegrationSpec::Basic.where(first_condition)
|
93
|
-
|
93
|
+
.where(second_condition).where_values
|
94
94
|
expect(where_values).to eq ["bar_tesim:Peanuts",
|
95
95
|
"(foo_tesim:bar)"]
|
96
96
|
end
|
@@ -75,9 +75,7 @@ describe ActiveFedora::Versionable do
|
|
75
75
|
subject.create_version
|
76
76
|
end
|
77
77
|
|
78
|
-
it
|
79
|
-
expect(subject.reload.model_type).to include ::RDF::URI.new('http://www.jcp.org/jcr/mix/1.0versionable')
|
80
|
-
end
|
78
|
+
it { is_expected.to have_versions }
|
81
79
|
|
82
80
|
it "has one version" do
|
83
81
|
expect(subject.versions).to be_kind_of ActiveFedora::VersionsGraph
|
@@ -4,7 +4,7 @@ describe ActiveFedora::Attributes, ".new" do
|
|
4
4
|
before(:all) do
|
5
5
|
class ProtectedParams < ActiveSupport::HashWithIndifferentAccess
|
6
6
|
attr_accessor :permitted
|
7
|
-
|
7
|
+
alias permitted? permitted
|
8
8
|
|
9
9
|
def initialize(attributes)
|
10
10
|
super(attributes)
|
@@ -12,7 +12,7 @@ describe ActiveFedora::NtriplesRDFDatastream do
|
|
12
12
|
property :based_near, predicate: ::RDF::FOAF.based_near
|
13
13
|
property :related_url, predicate: ::RDF::RDFS.seeAlso
|
14
14
|
end
|
15
|
-
@subject = MyDatastream.new(ActiveFedora::Base.id_to_uri
|
15
|
+
@subject = MyDatastream.new(ActiveFedora::Base.id_to_uri('/test:1/descMetadata'))
|
16
16
|
@subject.content = File.new('spec/fixtures/mixed_rdf_descMetadata.nt').read
|
17
17
|
end
|
18
18
|
after do
|
@@ -19,7 +19,7 @@ describe ActiveFedora::Persistence do
|
|
19
19
|
context 'when a block is provided' do
|
20
20
|
it 'passes the block to initialize' do
|
21
21
|
expect_any_instance_of(ActiveFedora::Base).to receive(:save)
|
22
|
-
expect { |b| ActiveFedora::Base.create(&b) }.to yield_with_args(an_instance_of
|
22
|
+
expect { |b| ActiveFedora::Base.create(&b) }.to yield_with_args(an_instance_of(ActiveFedora::Base))
|
23
23
|
end
|
24
24
|
end
|
25
25
|
end
|
@@ -77,7 +77,7 @@ describe ActiveFedora::Predicates do
|
|
77
77
|
expect(described_class.predicate_lookup(:is_part_of)).to eq "isPartOf"
|
78
78
|
expect(described_class.predicate_lookup(:is_member_of)).to eq "isMemberOf"
|
79
79
|
expect(described_class.predicate_lookup("isPartOfCollection")).to eq "isPartOfCollection"
|
80
|
-
described_class.predicate_config[:predicate_mapping]
|
80
|
+
described_class.predicate_config[:predicate_mapping]["some_namespace"] = { has_foo: "hasFOO" }
|
81
81
|
expect(described_class.find_predicate(:has_foo)).to eq ["hasFOO", "some_namespace"]
|
82
82
|
expect(described_class.predicate_lookup(:has_foo, "some_namespace")).to eq "hasFOO"
|
83
83
|
expect(lambda { described_class.predicate_lookup(:has_foo) }).to raise_error ActiveFedora::UnregisteredPredicateError
|
@@ -1,7 +1,7 @@
|
|
1
1
|
require 'spec_helper'
|
2
2
|
|
3
3
|
describe ActiveFedora::QualifiedDublinCoreDatastream do
|
4
|
-
DC_ELEMENTS = [:contributor, :coverage, :creator, :date, :description, :identifier, :language, :publisher, :relation, :rights, :source]
|
4
|
+
DC_ELEMENTS = [:contributor, :coverage, :creator, :date, :description, :identifier, :language, :publisher, :relation, :rights, :source].freeze
|
5
5
|
|
6
6
|
let(:sample_xml) do "<dc xmlns:xsi='http://www.w3.org/2001/XMLSchema-instance' xmlns:dcterms='http://purl.org/dc/terms/'>
|
7
7
|
<dcterms:type xsi:type='DCMITYPE'>sound</dcterms:type>
|
@@ -14,14 +14,14 @@ describe ActiveFedora do
|
|
14
14
|
|
15
15
|
describe "SOLR_DOCUMENT_ID" do
|
16
16
|
before(:all) do
|
17
|
-
SOLR_DOCUMENT_ID = "MY_SAMPLE_ID"
|
17
|
+
SOLR_DOCUMENT_ID = "MY_SAMPLE_ID".freeze
|
18
18
|
end
|
19
19
|
after(:all) do
|
20
|
-
SOLR_DOCUMENT_ID = "id"
|
20
|
+
SOLR_DOCUMENT_ID = "id".freeze
|
21
21
|
end
|
22
22
|
it "is used by ActiveFedora::Base.to_solr" do
|
23
23
|
allow(@test_object).to receive(:id).and_return('changeme:123')
|
24
|
-
SOLR_DOCUMENT_ID = "MY_SAMPLE_ID"
|
24
|
+
SOLR_DOCUMENT_ID = "MY_SAMPLE_ID".freeze
|
25
25
|
expect(@test_object.to_solr[SOLR_DOCUMENT_ID.to_sym]).to eq 'changeme:123'
|
26
26
|
expect(@test_object.to_solr[:id]).to be_nil
|
27
27
|
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.7.
|
4
|
+
version: 9.7.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:
|
13
|
+
date: 2016-01-29 00:00:00.000000000 Z
|
14
14
|
dependencies:
|
15
15
|
- !ruby/object:Gem::Dependency
|
16
16
|
name: rsolr
|
@@ -638,7 +638,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
638
638
|
version: '0'
|
639
639
|
requirements: []
|
640
640
|
rubyforge_project:
|
641
|
-
rubygems_version: 2.
|
641
|
+
rubygems_version: 2.5.1
|
642
642
|
signing_key:
|
643
643
|
specification_version: 4
|
644
644
|
summary: A convenience libary for manipulating documents in the Fedora Repository.
|