active-fedora 6.0.0.rc3 → 6.0.0.rc4

Sign up to get free protection for your applications and to get access to all the features.
@@ -4,6 +4,8 @@ Added support for RDF lists
4
4
  RDF does not index terms by default
5
5
  count is now a scoped query.
6
6
  ActiveFedora::Base.reindex_everything
7
+ RDF terms can store empty string
8
+ Access properties by using hash notation.
7
9
 
8
10
  5.6.1
9
11
  Fixed delegating enumerable methods (join, [], each_with_index, to_a, etc) on an RdfNode::TermProxy
@@ -34,6 +34,8 @@ Gem::Specification.new do |s|
34
34
  s.add_development_dependency("jettywrapper", ">=1.2.0")
35
35
  s.add_development_dependency("rspec", ">= 2.9.0")
36
36
  s.add_development_dependency("equivalent-xml")
37
+ s.add_development_dependency("rest-client")
38
+ s.add_development_dependency("webmock")
37
39
 
38
40
  s.files = `git ls-files`.split("\n")
39
41
  s.test_files = `git ls-files -- {test,spec,features}/*`.split("\n")
@@ -2,18 +2,38 @@ module ActiveFedora
2
2
  module Delegating
3
3
  extend ActiveSupport::Concern
4
4
 
5
- included do
6
- class_attribute :delegate_registry
7
- self.delegate_registry = []
8
- end
9
-
10
5
  # Calling inspect may trigger a bunch of loads, but it's mainly for debugging, so no worries.
11
6
  def inspect
12
- values = delegate_registry.map {|r| "#{r}:#{send(r).inspect}"}
7
+ values = self.class.delegate_registry.map {|r| "#{r}:#{send(r).inspect}"}
13
8
  "#<#{self.class} pid:\"#{pretty_pid}\", #{values.join(', ')}>"
14
9
  end
15
10
 
11
+ def [](key)
12
+ array_reader(key)
13
+ end
14
+
15
+ def []=(key, value)
16
+ array_setter(key, value)
17
+ end
18
+
19
+ private
20
+ def array_reader(field)
21
+ instance_exec(&self.class.delegates[field][:reader])
22
+ end
23
+
24
+ def array_setter(field, args)
25
+ instance_exec(args, &self.class.delegates[field][:setter])
26
+ end
27
+
16
28
  module ClassMethods
29
+ def delegates
30
+ @delegates ||= {}
31
+ end
32
+
33
+ def delegates= val
34
+ @delegates = val
35
+ end
36
+
17
37
  # Provides a delegate class method to expose methods in metadata streams
18
38
  # as member of the base object. Pass the target datastream via the
19
39
  # <tt>:to</tt> argument. If you want to return a unique result, (e.g. string
@@ -34,10 +54,13 @@ module ActiveFedora
34
54
  # foo.field2 # => NoMethodError: undefined method `field2' for #<Foo:0x1af30c>
35
55
 
36
56
  def delegate(field, args ={})
37
- create_delegate_accessor(field, args)
57
+ create_delegate_reader(field, args)
38
58
  create_delegate_setter(field, args)
39
59
  end
40
60
 
61
+ def delegate_registry
62
+ self.delegates.keys
63
+ end
41
64
 
42
65
  # Allows you to delegate multiple terminologies to the same datastream, instead
43
66
  # having to call the method each time for each term. The target datastream is the
@@ -60,28 +83,34 @@ module ActiveFedora
60
83
  def delegate_to(datastream,fields,args={})
61
84
  fields.each do |f|
62
85
  args.merge!({:to=>datastream})
63
- create_delegate_accessor(f, args)
86
+ create_delegate_reader(f, args)
64
87
  create_delegate_setter(f, args)
65
88
  end
66
89
  end
67
90
 
68
91
  private
69
- def create_delegate_accessor(field, args)
70
- self.delegate_registry += [field]
71
- define_method field do
92
+ def create_delegate_reader(field, args)
93
+ self.delegates[field] ||= {}
94
+ self.delegates[field][:reader] = lambda do
72
95
  ds = self.send(args[:to])
73
- val = if ds.kind_of?(ActiveFedora::RDFDatastream)
74
- ds.send(field)
75
- else
76
- terminology = args[:at] || [field]
77
- ds.send(:term_values, *terminology)
78
- end
96
+ if ds.kind_of?(ActiveFedora::RDFDatastream)
97
+ ds.send(field)
98
+ else
99
+ terminology = args[:at] || [field]
100
+ ds.send(:term_values, *terminology)
101
+ end
102
+ end
103
+
104
+ define_method field do
105
+ val = self[field]
79
106
  args[:unique] ? val.first : val
80
107
  end
81
108
  end
82
109
 
110
+
83
111
  def create_delegate_setter(field, args)
84
- define_method "#{field}=".to_sym do |v|
112
+ self.delegates[field] ||= {}
113
+ self.delegates[field][:setter] = lambda do |v|
85
114
  ds = self.send(args[:to])
86
115
  if ds.kind_of?(ActiveFedora::RDFDatastream)
87
116
  ds.send("#{field}=", v)
@@ -90,7 +119,11 @@ module ActiveFedora
90
119
  ds.send(:update_indexed_attributes, {terminology => v})
91
120
  end
92
121
  end
122
+ define_method "#{field}=".to_sym do |v|
123
+ self[field]=v
124
+ end
93
125
  end
126
+
94
127
  end
95
128
  end
96
129
  end
@@ -54,7 +54,6 @@ module ActiveFedora
54
54
  graph.insert([subject, predicate, arg.rdf_subject ])
55
55
  else
56
56
  arg = arg.to_s if arg.kind_of? RDF::Literal
57
- next if arg.kind_of?(String) && arg.empty?
58
57
 
59
58
  graph.insert([subject, predicate, arg])
60
59
  end
@@ -0,0 +1,8 @@
1
+ module ActiveFedora
2
+ # in ./spec/spec_helper.rb
3
+ # ``` require 'active_fedora/rspec_matchers' ```
4
+ module RspecMatchers
5
+ end
6
+ end
7
+ pattern = Dir.glob(File.join(File.dirname(__FILE__), 'rspec_matchers/*_matcher.rb'))
8
+ pattern.each { |f| require f }
@@ -0,0 +1,33 @@
1
+ # RSpec matcher to spec delegations.
2
+ RSpec::Matchers.define :belong_to_associated_active_fedora_object do |association_name|
3
+ match do |subject|
4
+ @association_name = association_name
5
+ if @association_name.nil? || @expected_object.nil?
6
+ raise(
7
+ ArgumentError,
8
+ "subject.should belong_to_associated_active_fedora_object(<association_name>).with_object(<object>)"
9
+ )
10
+ end
11
+
12
+ @subject = subject.class.find(subject.pid)
13
+ @actual_object = @subject.send(@association_name)
14
+
15
+ @expected_object == @actual_object
16
+ end
17
+
18
+ chain(:with_object) { |object| @expected_object = object }
19
+
20
+
21
+ description do
22
+ "#{@subject.class} PID=#{@subject.pid} association: #{@association_name.inspect} matches ActiveFedora"
23
+ end
24
+
25
+ failure_message_for_should do |text|
26
+ "expected #{@subject.class} PID=#{@subject.pid} association: #{@association_name.inspect} to match"
27
+ end
28
+
29
+ failure_message_for_should_not do |text|
30
+ "expected #{@subject.class} PID=#{@subject.pid} association: #{@association_name.inspect} to NOT match"
31
+ end
32
+
33
+ end
@@ -0,0 +1,45 @@
1
+ # RSpec matcher to spec delegations.
2
+
3
+ RSpec::Matchers.define :have_many_associated_active_fedora_objects do |association_name|
4
+ match do |subject|
5
+ @association_name = association_name
6
+ if @association_name.nil? || !@expected_objects.respond_to?(:count)
7
+ raise(
8
+ ArgumentError,
9
+ "subject.should have_many_associated_active_fedora_objects(<association_name>).with_objects(<objects[]>)"
10
+ )
11
+ end
12
+
13
+ @subject = subject.class.find(subject.pid)
14
+ @actual_objects = @subject.send(@association_name)
15
+
16
+ if @expected_objects
17
+ actual_count = @actual_objects.count
18
+ expected_count = @expected_objects.count
19
+ if actual_count != expected_count
20
+ raise(
21
+ RSpec::Expectations::ExpectationNotMetError,
22
+ "#{@subject.class} PID=#{@subject.pid} relationship: #{@association_name.inspect} count <Expected Count: #{expected_count}> <Actual: #{actual_count}>"
23
+ )
24
+ end
25
+ intersection = @actual_objects & @expected_objects
26
+ intersection.count == @expected_objects.count
27
+ end
28
+ end
29
+
30
+ chain(:with_objects) { |objects| @expected_objects = objects }
31
+
32
+
33
+ description do
34
+ "#{@subject.class} PID=#{@subject.pid} association: #{@association_name.inspect} matches ActiveFedora"
35
+ end
36
+
37
+ failure_message_for_should do |text|
38
+ "expected #{@subject.class} PID=#{@subject.pid} association: #{@association_name.inspect} to match"
39
+ end
40
+
41
+ failure_message_for_should_not do |text|
42
+ "expected #{@subject.class} PID=#{@subject.pid} association: #{@association_name.inspect} to NOT match"
43
+ end
44
+
45
+ end
@@ -0,0 +1,47 @@
1
+ # RSpec matcher to spec delegations.
2
+
3
+ RSpec::Matchers.define :have_predicate do |predicate|
4
+ match do |subject|
5
+ @predicate = predicate
6
+ if @predicate.nil? || !@expected_objects.respond_to?(:count)
7
+ raise(
8
+ ArgumentError,
9
+ "subject.should have_predicate(<predicate>).with_objects(<objects[]>)"
10
+ )
11
+ end
12
+ @subject = subject.class.find(subject.pid)
13
+ @actual_objects = @subject.relationships(predicate)
14
+
15
+ if @expected_objects
16
+ actual_count = @actual_objects.count
17
+ expected_count = @expected_objects.count
18
+ if actual_count != expected_count
19
+ raise(
20
+ RSpec::Expectations::ExpectationNotMetError,
21
+ "#{@subject.class} PID=#{@subject.pid} relationship: #{@predicate.inspect} count <Expected Count: #{expected_count}> <Actual: #{actual_count}>"
22
+ )
23
+ end
24
+ intersection = @actual_objects.collect do |ao|
25
+ internal_uri = ao.respond_to?(:internal_uri) ? ao.internal_uri : ao
26
+ end & @expected_objects
27
+
28
+ intersection.count == @expected_objects.count
29
+ end
30
+ end
31
+
32
+ chain(:with_objects) { |objects| @expected_objects = objects }
33
+
34
+
35
+ description do
36
+ "#{@subject.class} PID=#{@subject.pid} relationship: #{@predicate.inspect} matches Fedora"
37
+ end
38
+
39
+ failure_message_for_should do |text|
40
+ "expected #{@subject.class} PID=#{@subject.pid} relationship: #{@predicate.inspect} to match"
41
+ end
42
+
43
+ failure_message_for_should_not do |text|
44
+ "expected #{@subject.class} PID=#{@subject.pid} relationship: #{@predicate.inspect} to NOT match"
45
+ end
46
+
47
+ end
@@ -0,0 +1,41 @@
1
+ # RSpec matcher to spec delegations.
2
+
3
+ RSpec::Matchers.define :match_fedora_datastream do |method|
4
+ match do |object|
5
+ @method = method
6
+ @object = object
7
+ if @expected_xml.nil?
8
+ raise(
9
+ ArgumentError,
10
+ "match_fedora_datastream(<datastream_name>).with(<expected_xml>)"
11
+ )
12
+ end
13
+ expected = Nokogiri::XML(@expected_xml)
14
+
15
+ base_url = ActiveFedora.config.credentials[:url]
16
+ @fedora_datastream_url = File.join(
17
+ base_url, 'objects', @object.pid.to_s,'datastreams', @method, 'content'
18
+ )
19
+
20
+ response = RestClient.get(@fedora_datastream_url)
21
+
22
+ actual = Nokogiri::XML(response.body)
23
+
24
+ EquivalentXml.equivalent?(expected, actual, :normalize_whitespace => true)
25
+ end
26
+
27
+ chain(:with) { |expected_xml| @expected_xml = expected_xml }
28
+
29
+ description do
30
+ "#{@object.class} PID=#{@object.pid} datastream: #{@method.inspect} matches Fedora"
31
+ end
32
+
33
+ failure_message_for_should do |text|
34
+ "expected #{@object.class} PID=#{@object.pid} datastream: #{@method.inspect} to match Fedora"
35
+ end
36
+
37
+ failure_message_for_should_not do |text|
38
+ "expected #{@object.class} PID=#{@object.pid} datastream: #{@method.inspect} to NOT match Fedora"
39
+ end
40
+
41
+ end
@@ -1,3 +1,3 @@
1
1
  module ActiveFedora
2
- VERSION = "6.0.0.rc3"
2
+ VERSION = "6.0.0.rc4"
3
3
  end
@@ -117,13 +117,6 @@ describe ActiveFedora::NtriplesRDFDatastream do
117
117
  @subject.part << "thing 2"
118
118
  @subject.part.should == ["thing 1", "thing 2"]
119
119
  end
120
- it "should delete a value" do
121
- @subject.title = "Hamlet"
122
- @subject.save
123
- @subject.title = ""
124
- @subject.save
125
- @subject.title.should be_nil
126
- end
127
120
 
128
121
  it "should be able to save a blank document" do
129
122
  @subject.title = ""
@@ -170,13 +163,17 @@ describe ActiveFedora::NtriplesRDFDatastream do
170
163
  @subject.title = "Hamlet"
171
164
  @subject.related_url = "http://psu.edu/"
172
165
  @subject.related_url << "http://projecthydra.org/"
173
- @subject.save
166
+
174
167
  @subject.title.should == "Hamlet"
175
168
  @subject.related_url.should include("http://psu.edu/")
176
169
  @subject.related_url.should include("http://projecthydra.org/")
177
- @subject.title = ""
170
+
171
+ @subject.title = "" #empty string can be meaningful, don't assume delete.
172
+ @subject.title.should == ''
173
+
174
+ @subject.title = nil
178
175
  @subject.related_url.delete("http://projecthydra.org/")
179
- @subject.save
176
+
180
177
  @subject.title.should be_nil
181
178
  @subject.related_url.should == ["http://psu.edu/"]
182
179
  end
@@ -50,6 +50,7 @@ describe ActiveFedora::Base do
50
50
  before :each do
51
51
  @n = BarHistory2.new()
52
52
  end
53
+
53
54
  it "should save a delegated property uniquely" do
54
55
  @n.fubar="Quack"
55
56
  @n.fubar.should == "Quack"
@@ -69,6 +70,10 @@ describe ActiveFedora::Base do
69
70
  @n.duck.should == ["Quack", "Peep"]
70
71
  end
71
72
 
73
+ it "should accept the array getters and setters" do
74
+ @n[:duck]= ["Cluck", "Gobble"]
75
+ @n[:duck].should == ["Cluck", "Gobble"]
76
+ end
72
77
  end
73
78
  end
74
79
 
@@ -29,5 +29,10 @@ describe ActiveFedora::RDFDatastream do
29
29
  @obj.inner_object.repository.should_not_receive(:datastream_dissemination).with(hash_including(:dsid=>'descMetadata'))
30
30
  subject.should_not be_content_changed
31
31
  end
32
+
33
+ it "should allow asserting an empty string" do
34
+ @obj.descMetadata.title = ['']
35
+ @obj.descMetadata.title.should == ['']
36
+ end
32
37
  end
33
38
  end
@@ -0,0 +1,41 @@
1
+ require "spec_helper"
2
+ require 'ostruct'
3
+ require "active_fedora/rspec_matchers/belong_to_associated_active_fedora_object_matcher"
4
+
5
+ describe RSpec::Matchers, "belong_to_associated_active_fedora_object_matcher" do
6
+ subject { OpenStruct.new(:pid => pid )}
7
+ let(:pid) { 123 }
8
+ let(:object1) { Object.new }
9
+ let(:object2) { Object.new }
10
+ let(:association) { :association }
11
+
12
+ it 'should match when association is properly stored in fedora' do
13
+ subject.class.should_receive(:find).with(pid).and_return(subject)
14
+ subject.should_receive(association).and_return(object1)
15
+ subject.should belong_to_associated_active_fedora_object(association).with_object(object1)
16
+ end
17
+
18
+ it 'should not match when association is different' do
19
+ subject.class.should_receive(:find).with(pid).and_return(subject)
20
+ subject.should_receive(association).and_return(object1)
21
+ lambda {
22
+ subject.should belong_to_associated_active_fedora_object(association).with_object(object2)
23
+ }.should (
24
+ raise_error(
25
+ RSpec::Expectations::ExpectationNotMetError,
26
+ /expected #{subject.class} PID=#{pid} association: #{association.inspect}/
27
+ )
28
+ )
29
+ end
30
+
31
+ it 'should require :with_object option' do
32
+ lambda {
33
+ subject.should belong_to_associated_active_fedora_object(association)
34
+ }.should(
35
+ raise_error(
36
+ ArgumentError,
37
+ "subject.should belong_to_associated_active_fedora_object(<association_name>).with_object(<object>)"
38
+ )
39
+ )
40
+ end
41
+ end
@@ -0,0 +1,42 @@
1
+ require "spec_helper"
2
+ require 'ostruct'
3
+ require "active_fedora/rspec_matchers/have_many_associated_active_fedora_objects_matcher"
4
+
5
+ describe RSpec::Matchers, "have_many_associated_active_fedora_objects_matcher" do
6
+ subject { OpenStruct.new(:pid => pid )}
7
+ let(:pid) { 123 }
8
+ let(:object1) { Object.new }
9
+ let(:object2) { Object.new }
10
+ let(:object3) { Object.new }
11
+ let(:association) { :association }
12
+
13
+ it 'should match when association is properly stored in fedora' do
14
+ subject.class.should_receive(:find).with(pid).and_return(subject)
15
+ subject.should_receive(association).and_return([object1,object2])
16
+ subject.should have_many_associated_active_fedora_objects(association).with_objects([object1, object2])
17
+ end
18
+
19
+ it 'should not match when association is different' do
20
+ subject.class.should_receive(:find).with(pid).and_return(subject)
21
+ subject.should_receive(association).and_return([object1,object3])
22
+ lambda {
23
+ subject.should have_many_associated_active_fedora_objects(association).with_objects([object1, object2])
24
+ }.should (
25
+ raise_error(
26
+ RSpec::Expectations::ExpectationNotMetError,
27
+ /expected #{subject.class} PID=#{pid} association: #{association.inspect}/
28
+ )
29
+ )
30
+ end
31
+
32
+ it 'should require :with_objects option' do
33
+ lambda {
34
+ subject.should have_many_associated_active_fedora_objects(association)
35
+ }.should(
36
+ raise_error(
37
+ ArgumentError,
38
+ "subject.should have_many_associated_active_fedora_objects(<association_name>).with_objects(<objects[]>)"
39
+ )
40
+ )
41
+ end
42
+ end
@@ -0,0 +1,42 @@
1
+ require "spec_helper"
2
+ require 'ostruct'
3
+ require "active_fedora/rspec_matchers/have_predicate_matcher"
4
+
5
+ describe RSpec::Matchers, "have_predicate_matcher" do
6
+ subject { OpenStruct.new(:pid => pid )}
7
+ let(:pid) { 123 }
8
+ let(:object1) { Object.new }
9
+ let(:object2) { Object.new }
10
+ let(:object3) { Object.new }
11
+ let(:predicate) { :predicate }
12
+
13
+ it 'should match when relationship is "what we have in Fedora"' do
14
+ subject.class.should_receive(:find).with(pid).and_return(subject)
15
+ subject.should_receive(:relationships).with(predicate).and_return([object1,object2])
16
+ subject.should have_predicate(predicate).with_objects([object1, object2])
17
+ end
18
+
19
+ it 'should not match when relationship is different' do
20
+ subject.class.should_receive(:find).with(pid).and_return(subject)
21
+ subject.should_receive(:relationships).with(predicate).and_return([object1,object3])
22
+ lambda {
23
+ subject.should have_predicate(predicate).with_objects([object1, object2])
24
+ }.should (
25
+ raise_error(
26
+ RSpec::Expectations::ExpectationNotMetError,
27
+ /expected #{subject.class} PID=#{pid} relationship: #{predicate.inspect}/
28
+ )
29
+ )
30
+ end
31
+
32
+ it 'should require :with_objects option' do
33
+ lambda {
34
+ subject.should have_predicate(predicate)
35
+ }.should(
36
+ raise_error(
37
+ ArgumentError,
38
+ "subject.should have_predicate(<predicate>).with_objects(<objects[]>)"
39
+ )
40
+ )
41
+ end
42
+ end
@@ -0,0 +1,44 @@
1
+ require "spec_helper"
2
+ require 'ostruct'
3
+ require 'webmock/rspec'
4
+ WebMock.allow_net_connect!
5
+ require "active_fedora/rspec_matchers/match_fedora_datastream_matcher"
6
+
7
+ describe RSpec::Matchers, "match_fedora_datastream" do
8
+ let(:pid) { 123 }
9
+ let(:expected_xml) { '<xml><node>Value</node></xml>' }
10
+ let(:datastream_name) { 'metadata' }
11
+ let(:datastream_url) {
12
+ File.join(ActiveFedora.config.credentials[:url], 'objects', pid.to_s,'datastreams', datastream_name, 'content')
13
+ }
14
+ subject { OpenStruct.new(:pid => pid )}
15
+
16
+ it 'should match based on request' do
17
+ stub_request(:get, datastream_url).to_return(:body => expected_xml, :status => 200)
18
+ subject.should match_fedora_datastream(datastream_name).with(expected_xml)
19
+ end
20
+
21
+ it 'should handle non-matching requests' do
22
+ stub_request(:get, datastream_url).to_return(:body => "<parent>#{expected_xml}</parent>", :status => 200)
23
+ lambda {
24
+ subject.should match_fedora_datastream(datastream_name).with(expected_xml)
25
+ }.should(
26
+ raise_error(
27
+ RSpec::Expectations::ExpectationNotMetError,
28
+ /expected #{subject.class} PID=#{pid} datastream: #{datastream_name.inspect} to match Fedora/
29
+ )
30
+ )
31
+ end
32
+
33
+ it 'should require :with option' do
34
+ stub_request(:get, datastream_url).to_return(:body => "<parent>#{expected_xml}</parent>", :status => 200)
35
+ lambda {
36
+ subject.should match_fedora_datastream(datastream_name)
37
+ }.should(
38
+ raise_error(
39
+ ArgumentError,
40
+ "match_fedora_datastream(<datastream_name>).with(<expected_xml>)"
41
+ )
42
+ )
43
+ end
44
+ 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: 6.0.0.rc3
4
+ version: 6.0.0.rc4
5
5
  prerelease: 6
6
6
  platform: ruby
7
7
  authors:
@@ -11,7 +11,7 @@ authors:
11
11
  autorequire:
12
12
  bindir: bin
13
13
  cert_chain: []
14
- date: 2013-02-22 00:00:00.000000000 Z
14
+ date: 2013-02-25 00:00:00.000000000 Z
15
15
  dependencies:
16
16
  - !ruby/object:Gem::Dependency
17
17
  name: rsolr
@@ -317,6 +317,38 @@ dependencies:
317
317
  - - ! '>='
318
318
  - !ruby/object:Gem::Version
319
319
  version: '0'
320
+ - !ruby/object:Gem::Dependency
321
+ name: rest-client
322
+ requirement: !ruby/object:Gem::Requirement
323
+ none: false
324
+ requirements:
325
+ - - ! '>='
326
+ - !ruby/object:Gem::Version
327
+ version: '0'
328
+ type: :development
329
+ prerelease: false
330
+ version_requirements: !ruby/object:Gem::Requirement
331
+ none: false
332
+ requirements:
333
+ - - ! '>='
334
+ - !ruby/object:Gem::Version
335
+ version: '0'
336
+ - !ruby/object:Gem::Dependency
337
+ name: webmock
338
+ requirement: !ruby/object:Gem::Requirement
339
+ none: false
340
+ requirements:
341
+ - - ! '>='
342
+ - !ruby/object:Gem::Version
343
+ version: '0'
344
+ type: :development
345
+ prerelease: false
346
+ version_requirements: !ruby/object:Gem::Requirement
347
+ none: false
348
+ requirements:
349
+ - - ! '>='
350
+ - !ruby/object:Gem::Version
351
+ version: '0'
320
352
  description: ActiveFedora provides for creating and managing objects in the Fedora
321
353
  Repository Architecture.
322
354
  email:
@@ -392,6 +424,11 @@ files:
392
424
  - lib/active_fedora/relation.rb
393
425
  - lib/active_fedora/relationship_graph.rb
394
426
  - lib/active_fedora/rels_ext_datastream.rb
427
+ - lib/active_fedora/rspec_matchers.rb
428
+ - lib/active_fedora/rspec_matchers/belong_to_associated_active_fedora_object_matcher.rb
429
+ - lib/active_fedora/rspec_matchers/have_many_associated_active_fedora_objects_matcher.rb
430
+ - lib/active_fedora/rspec_matchers/have_predicate_matcher.rb
431
+ - lib/active_fedora/rspec_matchers/match_fedora_datastream_matcher.rb
395
432
  - lib/active_fedora/rubydora_connection.rb
396
433
  - lib/active_fedora/semantic_node.rb
397
434
  - lib/active_fedora/service_definitions.rb
@@ -546,6 +583,10 @@ files:
546
583
  - spec/unit/rdfxml_rdf_datastream_spec.rb
547
584
  - spec/unit/relationship_graph_spec.rb
548
585
  - spec/unit/rels_ext_datastream_spec.rb
586
+ - spec/unit/rspec_matchers/belong_to_associated_active_fedora_object_matcher_spec.rb
587
+ - spec/unit/rspec_matchers/have_many_associated_active_fedora_objects_matcher_spec.rb
588
+ - spec/unit/rspec_matchers/have_predicate_matcher_spec.rb
589
+ - spec/unit/rspec_matchers/match_fedora_datastream_matcher_spec.rb
549
590
  - spec/unit/rubydora_connection_spec.rb
550
591
  - spec/unit/semantic_node_spec.rb
551
592
  - spec/unit/serializers_spec.rb
@@ -703,6 +744,10 @@ test_files:
703
744
  - spec/unit/rdfxml_rdf_datastream_spec.rb
704
745
  - spec/unit/relationship_graph_spec.rb
705
746
  - spec/unit/rels_ext_datastream_spec.rb
747
+ - spec/unit/rspec_matchers/belong_to_associated_active_fedora_object_matcher_spec.rb
748
+ - spec/unit/rspec_matchers/have_many_associated_active_fedora_objects_matcher_spec.rb
749
+ - spec/unit/rspec_matchers/have_predicate_matcher_spec.rb
750
+ - spec/unit/rspec_matchers/match_fedora_datastream_matcher_spec.rb
706
751
  - spec/unit/rubydora_connection_spec.rb
707
752
  - spec/unit/semantic_node_spec.rb
708
753
  - spec/unit/serializers_spec.rb