active_fedora_finders 0.1.1 → 0.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.
- data/lib/active_fedora_finders.rb +8 -17
- data/lib/active_fedora_finders/version.rb +1 -1
- data/spec/finders_spec.rb +6 -6
- metadata +2 -2
@@ -25,25 +25,12 @@ module ActiveFedora
|
|
25
25
|
fk
|
26
26
|
end
|
27
27
|
|
28
|
-
included do
|
29
|
-
class << self
|
30
|
-
alias_method :active_fedora_find, :find
|
31
|
-
end
|
32
|
-
end
|
33
|
-
|
34
28
|
module ClassMethods
|
35
|
-
def find(args)
|
36
|
-
if args.is_a? String
|
37
|
-
return active_fedora_find(args)
|
38
|
-
else
|
39
|
-
return find_by_conditions(nil, args)
|
40
|
-
end
|
41
|
-
end
|
42
29
|
|
43
30
|
# modeled after ActiveRecord::FinderMethods.find_by_attributes
|
44
31
|
def find_by_attributes(match, attribute_names, *args)
|
45
32
|
conditions = Hash[attribute_names.map {|a| [a, args[attribute_names.index(a)]]}]
|
46
|
-
result =
|
33
|
+
result = fcrepo_find(match, conditions)
|
47
34
|
if match.bang? && result.blank?
|
48
35
|
raise ActiveRecord::RecordNotFound, "Couldn't find #{self.name} with #{conditions.to_a.collect {|p| p.join(' = ')}.join(', ')}"
|
49
36
|
else
|
@@ -52,7 +39,7 @@ module ActiveFedora
|
|
52
39
|
end
|
53
40
|
end
|
54
41
|
|
55
|
-
def
|
42
|
+
def fcrepo_find(match, args)
|
56
43
|
parms = args.dup
|
57
44
|
maxResults = (match.nil? or match.finder == :first) ? 1 : 25 # find_all and find_last not yet supported
|
58
45
|
query = ""
|
@@ -84,20 +71,24 @@ module ActiveFedora
|
|
84
71
|
def process_results(results)
|
85
72
|
results = Nokogiri::XML.parse(results)
|
86
73
|
results = results.xpath('/f:result/f:resultList/f:objectFields/f:pid',{'f'=>"http://www.fedora.info/definitions/1/0/types/"})
|
87
|
-
results.collect { |result|
|
74
|
+
results.collect { |result| find_one(result.text) }
|
88
75
|
end
|
89
76
|
|
90
77
|
# this method is patterned after an analog in ActiveRecord::DynamicMatchers
|
91
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)
|
92
83
|
field_keys = attribute_names.map {|val| FIELD_KEYS[val] or val}
|
93
84
|
attribute_names.replace field_keys
|
94
|
-
attribute_names.reduce(true) {|result, att| ALL_FIELDS.include? att or SUPPORTED_ALTS.include? att}
|
95
85
|
end
|
96
86
|
|
97
87
|
# adapted from ActiveRecord::DynamicMatchers
|
98
88
|
def method_missing(method_id, *arguments, &block)
|
99
89
|
if match = (ActiveRecord::DynamicFinderMatch.match(method_id) || ActiveRecord::DynamicScopeMatch.match(method_id))
|
100
90
|
attribute_names = match.attribute_names
|
91
|
+
normalize_attribute_names!(attribute_names)
|
101
92
|
super unless all_attributes_exists?(attribute_names)
|
102
93
|
if !(match.is_a?(ActiveRecord::DynamicFinderMatch) && match.instantiator? && arguments.first.is_a?(Hash)) && arguments.size < attribute_names.size
|
103
94
|
method_trace = "#{__FILE__}:#{__LINE__}:in `#{method_id}'"
|
data/spec/finders_spec.rb
CHANGED
@@ -11,21 +11,21 @@ describe ActiveFedora::Finders do
|
|
11
11
|
describe "finder methods" do
|
12
12
|
describe "default find method" do
|
13
13
|
it "should call the normal find method when passed a string" do
|
14
|
-
TestBase.expects(:
|
14
|
+
TestBase.expects(:find_one).returns TestBase.new
|
15
15
|
TestBase.find(FCREPO_ID)
|
16
16
|
end
|
17
17
|
end
|
18
18
|
describe "dynamic finder methods" do
|
19
19
|
it "should call .find_by_conditions with correct attributes" do
|
20
|
-
TestBase.expects(:
|
20
|
+
TestBase.expects(:fcrepo_find).with(is_a(ActiveRecord::DynamicFinderMatch), :identifier => FCREPO_ID).returns(TestBase.new)
|
21
21
|
TestBase.find_by_identifier(FCREPO_ID)
|
22
|
-
TestBase.expects(:
|
22
|
+
TestBase.expects(:fcrepo_find).with(is_a(ActiveRecord::DynamicFinderMatch), :cDate => FCREPO_DATE, :identifier => FCREPO_ID).returns(TestBase.new)
|
23
23
|
TestBase.find_by_create_date_and_identifier(FCREPO_DATE, FCREPO_ID)
|
24
24
|
end
|
25
25
|
it "should return an ActiveFedora::Base when there is a single result" do
|
26
26
|
stubfedora = mock("Fedora")
|
27
27
|
stubfedora.expects(:connection).returns(mock("Connection", :find_objects =>fixture('find_one.xml')))
|
28
|
-
TestBase.expects(:
|
28
|
+
TestBase.expects(:find_one).with(FCREPO_ID).returns TestBase.new(:pid=>FCREPO_ID)
|
29
29
|
ActiveFedora::Base.fedora_connection = [stubfedora]
|
30
30
|
TestBase.find_by_identifier(FCREPO_ID).should be_a TestBase
|
31
31
|
end
|
@@ -33,8 +33,8 @@ describe ActiveFedora::Finders do
|
|
33
33
|
stubfedora = mock("Fedora")
|
34
34
|
stubfedora.expects(:connection).returns(mock("Connection", :find_objects =>fixture('find_multiple.xml')))
|
35
35
|
ActiveFedora::Base.fedora_connection = [stubfedora]
|
36
|
-
TestBase.expects(:
|
37
|
-
TestBase.expects(:
|
36
|
+
TestBase.expects(:find_one).with(FCREPO_ID).returns TestBase.new(:pid=>FCREPO_ID)
|
37
|
+
TestBase.expects(:find_one).with("demo:1").returns TestBase.new(:pid=>"demo:1")
|
38
38
|
TestBase.find_all_by_source("test").should be_a Array
|
39
39
|
end
|
40
40
|
it "should throw an error when no results and a bang" do
|
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.1.
|
4
|
+
version: 0.1.2
|
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: 2012-06-
|
12
|
+
date: 2012-06-27 00:00:00.000000000 Z
|
13
13
|
dependencies:
|
14
14
|
- !ruby/object:Gem::Dependency
|
15
15
|
name: active-fedora
|