active_fedora_finders 0.4.0 → 0.5.0
Sign up to get free protection for your applications and to get access to all the features.
- data/README.textile +9 -5
- data/active_fedora_finders.gemspec +3 -3
- data/lib/active_fedora_finders.rb +16 -113
- data/lib/active_fedora_finders/relation.rb +152 -0
- data/lib/active_fedora_finders/version.rb +2 -2
- data/spec/finders_spec.rb +102 -27
- data/spec/spec_helper.rb +1 -2
- metadata +8 -8
data/README.textile
CHANGED
@@ -14,16 +14,20 @@ SUPPORTED_ALTS = [:cdate, :create_date, :mdate, :modified_date, :owner_id]
|
|
14
14
|
Example:
|
15
15
|
|
16
16
|
class MyModel < ActiveFedora::Base
|
17
|
-
include ActiveFedora::
|
17
|
+
include ActiveFedora::RepositoryQuerying
|
18
18
|
end
|
19
19
|
|
20
|
-
obj = MyModel.
|
20
|
+
obj = MyModel.search_repo(pid: "fedora-system:ContentModel-3.0").first!
|
21
21
|
|
22
22
|
**
|
23
23
|
|
24
24
|
Roadmap:
|
25
25
|
|
26
26
|
0.1: dynamic finders, bang support
|
27
|
-
0.2
|
28
|
-
0.3:
|
29
|
-
0.4:
|
27
|
+
0.2 rubydora 1.x
|
28
|
+
0.3: Rubydora 1.0...2.0
|
29
|
+
0.4: AF 6.7+
|
30
|
+
0.5: Rails 4 and Hydra 7
|
31
|
+
0.6: support or_create|initialize
|
32
|
+
0.7: support _all and _last
|
33
|
+
0.8: support scopes
|
@@ -9,12 +9,12 @@ Gem::Specification.new do |s|
|
|
9
9
|
s.authors = ["Benjamin Armintor"]
|
10
10
|
s.email = ["armintor@gmail.com"]
|
11
11
|
s.homepage = %q{https://github.com/barmintor/active_fedora_finders}
|
12
|
-
s.summary = %q{A library for adding ActiveRecord-style
|
13
|
-
s.description = %q{A mixin library for ActiveFedora.
|
12
|
+
s.summary = %q{A library for adding ActiveRecord-style relations to ActiveFedora::Base subclasses.}
|
13
|
+
s.description = %q{A mixin library for ActiveFedora. Realtion methods operating against the FCRepo object search terms (DCES elements and object properties).}
|
14
14
|
|
15
15
|
s.rubygems_version = %q{1.3.7}
|
16
16
|
|
17
|
-
s.add_dependency('active-fedora', '>=
|
17
|
+
s.add_dependency('active-fedora', '>=7.0.0')
|
18
18
|
s.add_dependency('activerecord')
|
19
19
|
s.add_dependency('nokogiri')
|
20
20
|
s.add_development_dependency("yard")
|
@@ -1,119 +1,22 @@
|
|
1
|
-
require '
|
1
|
+
require 'active_fedora'
|
2
2
|
require 'active_support'
|
3
|
+
require 'active_support/deprecation'
|
3
4
|
require 'active_record'
|
4
5
|
require 'active_record/errors' # RecordNotFound is not autoloaded, and ActiveRecord::Base not referenced
|
5
|
-
module ActiveFedora
|
6
|
-
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
SYSTEM_FIELDS = [:ownerId].concat(SINGLE_VALUE_FIELDS)
|
13
|
-
DC_FIELDS = [:contributor, :coverage, :creator, :date, :description, :format,
|
14
|
-
:identifier, :language, :publisher, :relation, :rights, :source,
|
15
|
-
:subject, :title, :type ]
|
16
|
-
SUPPORTED_ALTS = [:cdate, :create_date, :mdate, :modified_date, :owner_id]
|
17
|
-
ALL_FIELDS = [].concat(SYSTEM_FIELDS).concat(DC_FIELDS)
|
18
|
-
FIELD_KEYS = begin
|
19
|
-
fk = Hash[ALL_FIELDS.map {|a| [a.to_s, a]}]
|
20
|
-
fk["cdate"] = :cDate
|
21
|
-
fk["create_date"] = :cDate
|
22
|
-
fk["mdate"] = :mDate
|
23
|
-
fk["modified_date"] = :mDate
|
24
|
-
fk["owner_id"] = :ownerId
|
25
|
-
fk
|
26
|
-
end
|
27
|
-
|
28
|
-
module ClassMethods
|
29
|
-
|
30
|
-
# modeled after ActiveRecord::FinderMethods.find_by_attributes
|
31
|
-
def find_by_attributes(match, attribute_names, *args)
|
32
|
-
conditions = Hash[attribute_names.map {|a| [a, args[attribute_names.index(a)]]}]
|
33
|
-
result = fcrepo_find(match, conditions)
|
34
|
-
if match.bang? && result.blank?
|
35
|
-
raise ActiveRecord::RecordNotFound, "Couldn't find #{self.name} with #{conditions.to_a.collect {|p| p.join(' = ')}.join(', ')}"
|
36
|
-
else
|
37
|
-
yield(result) if block_given?
|
38
|
-
result
|
39
|
-
end
|
40
|
-
end
|
41
|
-
|
42
|
-
def fcrepo_find(match, args)
|
43
|
-
parms = args.dup
|
44
|
-
maxResults = (match.nil? or match.finder == :first) ? 1 : 25 # find_all and find_last not yet supported
|
45
|
-
query = ""
|
46
|
-
parms.each { |key, val|
|
47
|
-
if SINGLE_VALUE_FIELDS.include? key
|
48
|
-
query.concat "#{key.to_s}=#{val.to_s} "
|
49
|
-
else
|
50
|
-
query.concat "#{key.to_s}~#{val.to_s} "
|
51
|
-
end
|
52
|
-
}
|
53
|
-
query.strip!
|
54
|
-
results = []
|
55
|
-
if ActiveFedora.config.sharded?
|
56
|
-
(0...ActiveFedora.config.credentials.length).each {|ix|
|
57
|
-
ActiveFedora::Base.fedora_connection[ix] ||= ActiveFedora::RubydoraConnection.new(ActiveFedora.config.credentials[ix])
|
58
|
-
rubydora = ActiveFedora::Base.fedora_connection[ix].connection
|
59
|
-
if results.length <= maxResults
|
60
|
-
results.concat process_results(rubydora.find_objects(:query=>query,:pid=>'true', :maxResults=>maxResults))
|
61
|
-
end
|
62
|
-
}
|
63
|
-
else
|
64
|
-
ActiveFedora::Base.fedora_connection[0] ||= ActiveFedora::RubydoraConnection.new(ActiveFedora.config.credentials)
|
65
|
-
rubydora = ActiveFedora::Base.fedora_connection[0].connection
|
66
|
-
results.concat process_results(rubydora.find_objects(:query=>query,:pid=>'true', :maxResults=>maxResults))
|
67
|
-
end
|
68
|
-
return (maxResults == 1) ? results[0] : results
|
69
|
-
end
|
70
|
-
|
71
|
-
def process_results(results)
|
72
|
-
results = Nokogiri::XML.parse(results)
|
73
|
-
results = results.xpath('/f:result/f:resultList/f:objectFields/f:pid',{'f'=>"http://www.fedora.info/definitions/1/0/types/"})
|
74
|
-
results.collect { |result| find_one(result.text) }
|
75
|
-
end
|
76
|
-
|
77
|
-
# this method is patterned after an analog in ActiveRecord::DynamicMatchers
|
78
|
-
def all_attributes_exists?(attribute_names)
|
79
|
-
attribute_names.reduce(true) {|result, att| ALL_FIELDS.include? att or SUPPORTED_ALTS.include? att}
|
80
|
-
end
|
81
|
-
|
82
|
-
def normalize_attribute_names!(attribute_names)
|
83
|
-
field_keys = attribute_names.map {|val| FIELD_KEYS[val] or val}
|
84
|
-
attribute_names.replace field_keys
|
85
|
-
end
|
86
|
-
|
87
|
-
# adapted from ActiveRecord::DynamicMatchers
|
88
|
-
def method_missing(method_id, *arguments, &block)
|
89
|
-
if match = (ActiveRecord::DynamicFinderMatch.match(method_id) || ActiveRecord::DynamicScopeMatch.match(method_id))
|
90
|
-
attribute_names = match.attribute_names
|
91
|
-
normalize_attribute_names!(attribute_names)
|
92
|
-
super unless all_attributes_exists?(attribute_names)
|
93
|
-
if !(match.is_a?(ActiveRecord::DynamicFinderMatch) && match.instantiator? && arguments.first.is_a?(Hash)) && arguments.size < attribute_names.size
|
94
|
-
method_trace = "#{__FILE__}:#{__LINE__}:in `#{method_id}'"
|
95
|
-
backtrace = [method_trace] + caller
|
96
|
-
raise ArgumentError, "wrong number of arguments (#{arguments.size} for #{attribute_names.size})", backtrace
|
97
|
-
end
|
98
|
-
if match.respond_to?(:scope?) && match.scope?
|
99
|
-
self.class_eval <<-METHOD, __FILE__, __LINE__ + 1
|
100
|
-
def self.#{method_id}(*args) # def self.scoped_by_user_name_and_password(*args)
|
101
|
-
attributes = Hash[[:#{attribute_names.join(',:')}].zip(args)] # attributes = Hash[[:user_name, :password].zip(args)]
|
102
|
-
#
|
103
|
-
scoped(:conditions => attributes) # scoped(:conditions => attributes)
|
104
|
-
end # end
|
105
|
-
METHOD
|
106
|
-
send(method_id, *arguments)
|
107
|
-
elsif match.finder?
|
108
|
-
find_by_attributes(match, attribute_names, *arguments, &block)
|
109
|
-
elsif match.instantiator?
|
110
|
-
find_or_instantiator_by_attributes(match, attribute_names, *arguments, &block)
|
111
|
-
end
|
112
|
-
else
|
113
|
-
super
|
114
|
-
end
|
115
|
-
end
|
116
|
-
|
6
|
+
module ActiveFedora::FinderMethods::RepositoryMethods
|
7
|
+
autoload :Version, 'active_fedora_finders/version'
|
8
|
+
autoload :Relation, 'active_fedora_finders/relation'
|
9
|
+
extend ActiveSupport::Concern
|
10
|
+
module ClassMethods
|
11
|
+
def search_repo(conditions={})
|
12
|
+
Relation.new(self).where!(conditions)
|
117
13
|
end
|
118
14
|
end
|
15
|
+
end
|
16
|
+
module ActiveFedora::Finders
|
17
|
+
extend ActiveSupport::Concern
|
18
|
+
included do
|
19
|
+
ActiveSupport::Deprecation.warn("ActiveFedora::Finders will be removed in favor of ActiveFedora::FinderMethods::RepositoryMethods")
|
20
|
+
include ActiveFedora::FinderMethods::RepositoryMethods
|
21
|
+
end
|
119
22
|
end
|
@@ -0,0 +1,152 @@
|
|
1
|
+
require 'active_record/errors'
|
2
|
+
module ActiveFedora::FinderMethods::RepositoryMethods
|
3
|
+
class Relation
|
4
|
+
|
5
|
+
SINGLE_VALUE_FIELDS = [:pid, :cDate, :mDate, :label]
|
6
|
+
SYSTEM_FIELDS = [:ownerId].concat(SINGLE_VALUE_FIELDS)
|
7
|
+
DC_FIELDS = [:contributor, :coverage, :creator, :date, :description, :format,
|
8
|
+
:identifier, :language, :publisher, :relation, :rights, :source,
|
9
|
+
:subject, :title, :type ]
|
10
|
+
SUPPORTED_ALTS = [:cdate, :create_date, :mdate, :modified_date, :owner_id]
|
11
|
+
ALL_FIELDS = [].concat(SYSTEM_FIELDS).concat(DC_FIELDS)
|
12
|
+
FIELD_KEYS = begin
|
13
|
+
fk = Hash[ALL_FIELDS.map {|a| [a.to_s, a]}]
|
14
|
+
fk["cdate"] = :cDate
|
15
|
+
fk["create_date"] = :cDate
|
16
|
+
fk["mdate"] = :mDate
|
17
|
+
fk["modified_date"] = :mDate
|
18
|
+
fk["owner_id"] = :ownerId
|
19
|
+
fk
|
20
|
+
end
|
21
|
+
|
22
|
+
attr_reader :loaded
|
23
|
+
attr_accessor :default_scoped
|
24
|
+
alias :loaded? :loaded
|
25
|
+
|
26
|
+
def initialize(klass, values = nil)
|
27
|
+
@klass = klass
|
28
|
+
@loaded = false
|
29
|
+
@values = values || {}
|
30
|
+
end
|
31
|
+
|
32
|
+
def reset
|
33
|
+
spawn.reset!
|
34
|
+
end
|
35
|
+
|
36
|
+
def reset!
|
37
|
+
@values.delete_if {|k,v| true}
|
38
|
+
@loaded = false
|
39
|
+
@records = nil
|
40
|
+
self
|
41
|
+
end
|
42
|
+
|
43
|
+
def spawn
|
44
|
+
self.class.new(@klass, @values.dup)
|
45
|
+
end
|
46
|
+
|
47
|
+
def where(conditions={})
|
48
|
+
spawn.where!(conditions)
|
49
|
+
end
|
50
|
+
|
51
|
+
def where!(conditions={})
|
52
|
+
query = (@values[:query] ||= {})
|
53
|
+
conditions.each do |k,v|
|
54
|
+
k = FIELD_KEYS[k.to_s]
|
55
|
+
v = Array(v)
|
56
|
+
if query[k] and not SINGLE_VALUE_FIELDS.include?(k)
|
57
|
+
query[k] = (Array(query[k]) + v).uniq
|
58
|
+
else
|
59
|
+
query[k] = v[1] ? v : v.first
|
60
|
+
end
|
61
|
+
end
|
62
|
+
self
|
63
|
+
end
|
64
|
+
|
65
|
+
def limit(limit_value)
|
66
|
+
spawn.limit!(limit_value)
|
67
|
+
end
|
68
|
+
|
69
|
+
def limit!(limit_value)
|
70
|
+
@values[:maxResults] = limit_value
|
71
|
+
self
|
72
|
+
end
|
73
|
+
|
74
|
+
def to_a
|
75
|
+
load
|
76
|
+
@records
|
77
|
+
end
|
78
|
+
|
79
|
+
def load
|
80
|
+
@records = fcrepo_find(@values)
|
81
|
+
@loaded = true
|
82
|
+
end
|
83
|
+
|
84
|
+
def first
|
85
|
+
if loaded?
|
86
|
+
@records.first
|
87
|
+
else
|
88
|
+
@first ||= limit(1).to_a[0]
|
89
|
+
end
|
90
|
+
end
|
91
|
+
|
92
|
+
def first!
|
93
|
+
r = first()
|
94
|
+
raise ActiveRecord::RecordNotFound.new(@values.inspect) unless r
|
95
|
+
r
|
96
|
+
end
|
97
|
+
|
98
|
+
def find_by(conditions={})
|
99
|
+
where(conditions).to_a.first
|
100
|
+
end
|
101
|
+
|
102
|
+
def find_by!(conditions={})
|
103
|
+
r = find_by(conditions)
|
104
|
+
raise ActiveRecord::RecordNotFound.new(conditions.inspect) unless r
|
105
|
+
r
|
106
|
+
end
|
107
|
+
|
108
|
+
private
|
109
|
+
def fcrepo_find(args)
|
110
|
+
parms = args.dup
|
111
|
+
parms[:query] ||= {}
|
112
|
+
if parms[:query][:pid] and parms[:query].size == 1
|
113
|
+
return [@klass.find(parms[:query][:pid], cast: false)]
|
114
|
+
end
|
115
|
+
maxResults = parms[:maxResults] || 25 # find_all and find_last not yet supported
|
116
|
+
|
117
|
+
query = ""
|
118
|
+
parms.fetch(:query, {}).each { |key, val|
|
119
|
+
if SINGLE_VALUE_FIELDS.include? key
|
120
|
+
query.concat "#{key.to_s}=#{val.to_s} "
|
121
|
+
else
|
122
|
+
Array(val).each do |v|
|
123
|
+
query.concat "#{key.to_s}~#{v.to_s} "
|
124
|
+
end
|
125
|
+
end
|
126
|
+
}
|
127
|
+
query.strip!
|
128
|
+
results = []
|
129
|
+
if ActiveFedora.config.sharded?
|
130
|
+
(0...ActiveFedora.config.credentials.length).each {|ix|
|
131
|
+
ActiveFedora::Base.fedora_connection[ix] ||= ActiveFedora::RubydoraConnection.new(ActiveFedora.config.credentials[ix])
|
132
|
+
rubydora = ActiveFedora::Base.fedora_connection[ix].connection
|
133
|
+
if results.length <= maxResults
|
134
|
+
results.concat process_results(rubydora.find_objects(:query=>query,:pid=>'true', :maxResults=>maxResults))
|
135
|
+
end
|
136
|
+
}
|
137
|
+
else
|
138
|
+
ActiveFedora::Base.fedora_connection[0] ||= ActiveFedora::RubydoraConnection.new(ActiveFedora.config.credentials)
|
139
|
+
rubydora = ActiveFedora::Base.fedora_connection[0].connection
|
140
|
+
results.concat process_results(rubydora.find_objects(:query=>query,:pid=>'true', :maxResults=>maxResults))
|
141
|
+
end
|
142
|
+
return results
|
143
|
+
end
|
144
|
+
|
145
|
+
def process_results(results)
|
146
|
+
results = Nokogiri::XML.parse(results)
|
147
|
+
results = results.xpath('/f:result/f:resultList/f:objectFields/f:pid',{'f'=>"http://www.fedora.info/definitions/1/0/types/"})
|
148
|
+
results.collect { |result| @klass.find(result.text, cast: false) }
|
149
|
+
end
|
150
|
+
|
151
|
+
end
|
152
|
+
end
|
data/spec/finders_spec.rb
CHANGED
@@ -2,53 +2,128 @@ require 'spec_helper'
|
|
2
2
|
require 'config_helper'
|
3
3
|
|
4
4
|
describe ActiveFedora::Finders do
|
5
|
-
|
6
|
-
|
5
|
+
before( :all) do
|
6
|
+
class SpecModel < ::ActiveFedora::Base
|
7
|
+
include ActiveFedora::Finders
|
8
|
+
end
|
9
|
+
expect(SpecModel.new).to be_kind_of ActiveFedora::Base
|
10
|
+
expect(SpecModel).to respond_to :find
|
11
|
+
end
|
12
|
+
after(:all) do
|
13
|
+
Object.send(:remove_const, :SpecModel)
|
7
14
|
end
|
15
|
+
|
8
16
|
FCREPO_ID = 'fedora-system:ContentModel-3.0'
|
9
17
|
FCREPO_DATE = '2012-06-01T12:34:56.000Z'
|
10
18
|
|
11
19
|
describe "finder methods" do
|
20
|
+
let(:connection) { double('ActiveFedora::RubydoraConnection') }
|
21
|
+
let(:rubydora) { double('Rubydora::Connection') }
|
22
|
+
before :each do
|
23
|
+
connection.stub(:connect) { rubydora }
|
24
|
+
connection.stub(:connection) { rubydora }
|
25
|
+
ActiveFedora::Base.fedora_connection[0]= connection
|
26
|
+
end
|
27
|
+
|
12
28
|
describe "default find method" do
|
13
29
|
it "should call the normal find method when passed a string" do
|
14
|
-
|
15
|
-
|
30
|
+
all = double('ActiveFedora::Relation')
|
31
|
+
SpecModel.stub(:all) {all}
|
32
|
+
all.should_receive(:find).with(FCREPO_ID).and_return(SpecModel.new)
|
33
|
+
SpecModel.find(FCREPO_ID)
|
16
34
|
end
|
17
35
|
end
|
36
|
+
|
18
37
|
describe "dynamic finder methods" do
|
19
|
-
it "should
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
|
38
|
+
it "should shortcut if only given a PID" do
|
39
|
+
SpecModel.should_receive(:find).with(FCREPO_ID, :cast=>false).and_return(SpecModel.new)
|
40
|
+
expect(SpecModel.search_repo.where(:pid => FCREPO_ID).first).to be_a SpecModel
|
41
|
+
end
|
42
|
+
it "should call .find_objects with correct attributes" do
|
43
|
+
rubydora.should_receive(:find_objects).with(hash_including(query: "identifier~#{FCREPO_ID}")).and_return(fixture('find_one.xml'))
|
44
|
+
SpecModel.should_receive(:find).with(FCREPO_ID, cast: false).and_return(SpecModel.new)
|
45
|
+
SpecModel.search_repo.where(:identifier => FCREPO_ID).load
|
46
|
+
end
|
47
|
+
it "should call .find_objects with multiple attributes" do
|
48
|
+
rubydora.should_receive(:find_objects).with(hash_including(query: "cDate=#{FCREPO_DATE} date~#{FCREPO_DATE} identifier~#{FCREPO_ID}")).and_return(fixture('find_one.xml'))
|
49
|
+
SpecModel.should_receive(:find).with(FCREPO_ID, cast: false).and_return(SpecModel.new)
|
50
|
+
SpecModel.search_repo.where(create_date: FCREPO_DATE).where(date: FCREPO_DATE, identifier: FCREPO_ID).load
|
24
51
|
end
|
25
52
|
it "should return an ActiveFedora::Base when there is a single result" do
|
26
|
-
|
27
|
-
|
28
|
-
|
29
|
-
ActiveFedora::Base.fedora_connection = [stubfedora]
|
30
|
-
TestBase.find_by_identifier(FCREPO_ID).should be_a TestBase
|
53
|
+
rubydora.stub(:find_objects =>fixture('find_one.xml'))
|
54
|
+
SpecModel.should_receive(:find).with(FCREPO_ID, cast: false).and_return SpecModel.new(:pid=>FCREPO_ID)
|
55
|
+
expect(SpecModel.search_repo.find_by(:identifier => FCREPO_ID)).to be_a SpecModel
|
31
56
|
end
|
32
57
|
it "should return an array when there are multiple results" do
|
33
|
-
|
34
|
-
|
35
|
-
|
36
|
-
|
37
|
-
|
38
|
-
|
39
|
-
|
40
|
-
|
41
|
-
|
42
|
-
|
43
|
-
|
44
|
-
|
58
|
+
SpecModel.stub(:find).with(FCREPO_ID, cast: false) {SpecModel.new(:pid=>FCREPO_ID)}
|
59
|
+
SpecModel.stub(:find).with("demo:1", cast: false) {SpecModel.new(:pid=>"demo:1")}
|
60
|
+
rubydora.should_receive(:find_objects).with(query: "source~test", pid: "true", maxResults: 25).and_return(fixture('find_multiple.xml'))
|
61
|
+
expect(SpecModel.search_repo.where(source: "test").to_a).to be_a Array
|
62
|
+
end
|
63
|
+
end
|
64
|
+
describe "#first" do
|
65
|
+
let(:pid) {'dummy:1'}
|
66
|
+
it "should return nil when no results" do
|
67
|
+
rubydora.stub(:find_objects) {fixture('find_none.xml')}
|
68
|
+
expect(SpecModel.search_repo.where(:identifier =>pid).first).to be_nil
|
69
|
+
end
|
70
|
+
it "should work with one result" do
|
71
|
+
rubydora.stub(:find_objects) {fixture('find_one.xml')}
|
72
|
+
SpecModel.stub(:find).with(FCREPO_ID, cast: false) {(SpecModel.new)}
|
73
|
+
expect(SpecModel.search_repo.where(:identifier =>pid).first).to be_a SpecModel
|
74
|
+
end
|
75
|
+
it "should work with multiple results" do
|
76
|
+
rubydora.stub(:find_objects) {fixture('find_multiple.xml')}
|
77
|
+
SpecModel.stub(:find).with(FCREPO_ID, cast: false) {(SpecModel.new)}
|
78
|
+
SpecModel.stub(:find).with('demo:1', cast: false) {(SpecModel.new)}
|
79
|
+
expect(SpecModel.search_repo.where(:identifier =>pid).first).to be_a SpecModel
|
80
|
+
end
|
81
|
+
end
|
82
|
+
describe "#find_by!" do
|
83
|
+
let(:pid) {'dummy:1'}
|
84
|
+
it "should throw an error when no results" do
|
85
|
+
rubydora.stub(:find_objects) {fixture('find_none.xml')}
|
86
|
+
begin
|
87
|
+
SpecModel.search_repo.find_by!(:identifier =>pid)
|
88
|
+
fail "should not successfully return from bang method with no results"
|
89
|
+
rescue Exception => e
|
90
|
+
e.should be_a ActiveRecord::RecordNotFound
|
91
|
+
end
|
92
|
+
end
|
93
|
+
it "should with one result" do
|
94
|
+
rubydora.stub(:find_objects) {fixture('find_one.xml')}
|
95
|
+
SpecModel.stub(:find).with(FCREPO_ID, cast: false) {(SpecModel.new)}
|
96
|
+
expect(SpecModel.search_repo.find_by!(:identifier =>pid)).to be_a SpecModel
|
97
|
+
end
|
98
|
+
it "should with multiple results" do
|
99
|
+
rubydora.stub(:find_objects) {fixture('find_multiple.xml')}
|
100
|
+
SpecModel.stub(:find).with(FCREPO_ID, cast: false) {(SpecModel.new)}
|
101
|
+
SpecModel.stub(:find).with('demo:1', cast: false) {(SpecModel.new)}
|
102
|
+
expect(SpecModel.search_repo.find_by!(:identifier =>pid)).to be_a SpecModel
|
103
|
+
end
|
104
|
+
end
|
105
|
+
describe "#first!" do
|
106
|
+
let(:pid) {'demo:1'}
|
107
|
+
it "should throw an error when no results" do
|
108
|
+
rubydora.stub(:find_objects) {fixture('find_none.xml')}
|
45
109
|
begin
|
46
|
-
|
110
|
+
SpecModel.search_repo.where(:identifier =>pid).first!
|
47
111
|
fail "should not successfully return from bang method with no results"
|
48
112
|
rescue Exception => e
|
49
113
|
e.should be_a ActiveRecord::RecordNotFound
|
50
114
|
end
|
51
115
|
end
|
116
|
+
it "should work with one result" do
|
117
|
+
rubydora.stub(:find_objects) {fixture('find_one.xml')}
|
118
|
+
SpecModel.stub(:find).with(FCREPO_ID, cast: false) {(SpecModel.new)}
|
119
|
+
expect(SpecModel.search_repo.where(:identifier =>pid).first!).to be_a SpecModel
|
120
|
+
end
|
121
|
+
it "should work with multiple results" do
|
122
|
+
rubydora.stub(:find_objects) {fixture('find_multiple.xml')}
|
123
|
+
SpecModel.stub(:find).with(FCREPO_ID, cast: false) {(SpecModel.new)}
|
124
|
+
SpecModel.stub(:find).with('demo:1', cast: false) {(SpecModel.new)}
|
125
|
+
expect(SpecModel.search_repo.where(:identifier =>pid).first!).to be_a SpecModel
|
126
|
+
end
|
52
127
|
end
|
53
128
|
end
|
54
129
|
end
|
data/spec/spec_helper.rb
CHANGED
@@ -12,12 +12,11 @@ end
|
|
12
12
|
|
13
13
|
require 'active-fedora'
|
14
14
|
require 'rspec'
|
15
|
-
|
15
|
+
include RSpec::Mocks::ArgumentMatchers
|
16
16
|
require 'support/mock_fedora'
|
17
17
|
require 'active_fedora_finders'
|
18
18
|
|
19
19
|
RSpec.configure do |config|
|
20
|
-
config.mock_with :mocha
|
21
20
|
config.color_enabled = true
|
22
21
|
end
|
23
22
|
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: active_fedora_finders
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.5.0
|
5
5
|
prerelease:
|
6
6
|
platform: ruby
|
7
7
|
authors:
|
@@ -9,7 +9,7 @@ authors:
|
|
9
9
|
autorequire:
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
|
-
date: 2014-
|
12
|
+
date: 2014-04-08 00:00:00.000000000 Z
|
13
13
|
dependencies:
|
14
14
|
- !ruby/object:Gem::Dependency
|
15
15
|
name: active-fedora
|
@@ -18,7 +18,7 @@ dependencies:
|
|
18
18
|
requirements:
|
19
19
|
- - ! '>='
|
20
20
|
- !ruby/object:Gem::Version
|
21
|
-
version:
|
21
|
+
version: 7.0.0
|
22
22
|
type: :runtime
|
23
23
|
prerelease: false
|
24
24
|
version_requirements: !ruby/object:Gem::Requirement
|
@@ -26,7 +26,7 @@ dependencies:
|
|
26
26
|
requirements:
|
27
27
|
- - ! '>='
|
28
28
|
- !ruby/object:Gem::Version
|
29
|
-
version:
|
29
|
+
version: 7.0.0
|
30
30
|
- !ruby/object:Gem::Dependency
|
31
31
|
name: activerecord
|
32
32
|
requirement: !ruby/object:Gem::Requirement
|
@@ -139,8 +139,8 @@ dependencies:
|
|
139
139
|
- - '='
|
140
140
|
- !ruby/object:Gem::Version
|
141
141
|
version: 0.10.5
|
142
|
-
description: A mixin library for ActiveFedora.
|
143
|
-
|
142
|
+
description: A mixin library for ActiveFedora. Realtion methods operating against
|
143
|
+
the FCRepo object search terms (DCES elements and object properties).
|
144
144
|
email:
|
145
145
|
- armintor@gmail.com
|
146
146
|
executables: []
|
@@ -155,6 +155,7 @@ files:
|
|
155
155
|
- Rakefile
|
156
156
|
- active_fedora_finders.gemspec
|
157
157
|
- lib/active_fedora_finders.rb
|
158
|
+
- lib/active_fedora_finders/relation.rb
|
158
159
|
- lib/active_fedora_finders/version.rb
|
159
160
|
- lib/tasks/af_finders_dev.rake
|
160
161
|
- spec/config_helper.rb
|
@@ -187,8 +188,7 @@ rubyforge_project:
|
|
187
188
|
rubygems_version: 1.8.24
|
188
189
|
signing_key:
|
189
190
|
specification_version: 3
|
190
|
-
summary: A library for adding ActiveRecord-style
|
191
|
-
subclasses.
|
191
|
+
summary: A library for adding ActiveRecord-style relations to ActiveFedora::Base subclasses.
|
192
192
|
test_files:
|
193
193
|
- spec/config_helper.rb
|
194
194
|
- spec/finders_spec.rb
|