active-fedora 1.1.2 → 1.1.4.pre2

Sign up to get free protection for your applications and to get access to all the features.
@@ -1,37 +1,27 @@
1
- == Getting Help
1
+ h2. Description
2
+
3
+ RubyFedora and ActiveFedora provide a set of Ruby gems for creating and managing objects in the Fedora Repository Architecture (http://fedora-commons.org).
4
+
5
+ h2. Getting Help
2
6
 
3
7
  * http://yourmediashelf.com/activefedora
4
8
  * Project Homepage: <http://yourmediashelf.com/activefedora>
5
9
  * Further documentation is available at <http://projects.mediashelf.us/show/active-fedora>
6
10
  * Community Discussions & Mailing List are located at <http://groups.google.com/group/active-fedora>
7
11
 
8
- = active-fedora gem
9
-
10
- * http://rubyforge.org/projects/rubyfedora/
11
-
12
- == DESCRIPTION:
13
-
14
- RubyFedora and ActiveFedora provide a set of Ruby gems for creating and managing objects in the Fedora Repository Architecture (http://fedora-commons.org).
15
-
16
-
17
- == FEATURES/PROBLEMS:
18
-
19
-
20
- == SYNOPSIS:
21
-
22
- See usage documentation on the wiki: http://projects.mediashelf.us/wiki/active-fedora/Documentation
12
+ h2. Installation
23
13
 
24
- == REQUIREMENTS:
14
+ The gem is hosted on gemcutter.
25
15
 
26
- * ruby-fedora
16
+ <pre>gem install active-fedora</pre>
27
17
 
28
- == INSTALL:
18
+ h2. Getting Started
29
19
 
30
- sudo gem install active-fedora
20
+ The "ActiveFedora Console Tour":http://projects.mediashelf.us/wiki/active-fedora/Getting_Started gives you a brief tour through ActiveFedora's features on the command line.
31
21
 
32
- == LICENSE:
22
+ h2. LICENSE:
33
23
 
34
- Copyright (c) 2009 Matt Zumwalt
24
+ Copyright (c) 2009-2010 Matt Zumwalt
35
25
 
36
26
  This program is free software: you can redistribute it and/or modify
37
27
  it under the terms of the GNU Lesser General Public License (LGPL) as
data/Rakefile CHANGED
@@ -14,6 +14,8 @@ begin
14
14
  gem.email = "matt.zumwalt@yourmediashelf.com"
15
15
  gem.homepage = "http://yourmediashelf.com/activefedora"
16
16
  gem.authors = ["Matt Zumwalt", "McClain Looney"]
17
+ gem.rubyforge_project = 'rubyfedora'
18
+
17
19
  gem.add_dependency('solr-ruby', '>= 0.0.6')
18
20
  gem.add_dependency('xml-simple', '>= 1.0.12')
19
21
  gem.add_dependency('mime-types', '>= 1.16')
@@ -26,6 +28,7 @@ begin
26
28
  # gem is a Gem::Specification... see http://www.rubygems.org/read/chapter/20 for additional settings
27
29
  end
28
30
  Jeweler::GemcutterTasks.new
31
+ # Jeweler::RubyforgeTasks.new
29
32
  rescue LoadError
30
33
  puts "Jeweler (or a dependency) not available. Install it with: gem install jeweler"
31
34
  end
data/VERSION CHANGED
@@ -1 +1 @@
1
- 1.1.2
1
+ 0.1.4.pre1
@@ -5,17 +5,17 @@
5
5
 
6
6
  Gem::Specification.new do |s|
7
7
  s.name = %q{active-fedora}
8
- s.version = "1.1.2"
8
+ s.version = "1.1.4.pre2"
9
9
 
10
- s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
10
+ s.required_rubygems_version = Gem::Requirement.new("> 1.3.1") if s.respond_to? :required_rubygems_version=
11
11
  s.authors = ["Matt Zumwalt", "McClain Looney"]
12
- s.date = %q{2010-03-31}
12
+ s.date = %q{2010-05-15}
13
13
  s.description = %q{ActiveFedora provides for creating and managing objects in the Fedora Repository Architecture.}
14
14
  s.email = %q{matt.zumwalt@yourmediashelf.com}
15
15
  s.extra_rdoc_files = [
16
16
  "LICENSE",
17
17
  "README.rdoc",
18
- "README.txt"
18
+ "README.textile"
19
19
  ]
20
20
  s.files = [
21
21
  ".document",
@@ -176,7 +176,7 @@ Gem::Specification.new do |s|
176
176
  "Manifest.txt",
177
177
  "PostInstall.txt",
178
178
  "README.rdoc",
179
- "README.txt",
179
+ "README.textile",
180
180
  "Rakefile",
181
181
  "VERSION",
182
182
  "active-fedora.gemspec",
@@ -217,6 +217,7 @@ Gem::Specification.new do |s|
217
217
  "spec/fixtures/changeme155.xml",
218
218
  "spec/fixtures/dino.jpg",
219
219
  "spec/fixtures/minivan.jpg",
220
+ "spec/fixtures/oh_qdc.xml",
220
221
  "spec/fixtures/test_12.foxml.xml",
221
222
  "spec/integration/base_file_management_spec.rb",
222
223
  "spec/integration/base_loader_spec.rb",
@@ -237,7 +238,6 @@ Gem::Specification.new do |s|
237
238
  "spec/samples/models/oral_history.rb",
238
239
  "spec/samples/models/seminar.rb",
239
240
  "spec/samples/models/seminar_audio_file.rb",
240
- "spec/samples/oh_qdc.xml",
241
241
  "spec/samples/oral_history_sample.xml",
242
242
  "spec/samples/oral_history_sample_model.rb",
243
243
  "spec/samples/oral_history_xml.xml",
@@ -273,6 +273,7 @@ Gem::Specification.new do |s|
273
273
  s.homepage = %q{http://yourmediashelf.com/activefedora}
274
274
  s.rdoc_options = ["--charset=UTF-8"]
275
275
  s.require_paths = ["lib"]
276
+ s.rubyforge_project = %q{rubyfedora}
276
277
  s.rubygems_version = %q{1.3.6}
277
278
  s.summary = %q{A convenience libary for manipulating MODS (Metadata Object Description Schema) documents.}
278
279
  s.test_files = [
@@ -311,6 +312,8 @@ Gem::Specification.new do |s|
311
312
  "spec/unit/inheritance_spec.rb",
312
313
  "spec/unit/metadata_datastream_spec.rb",
313
314
  "spec/unit/model_spec.rb",
315
+ "spec/unit/mods_datastream_spec.rb",
316
+ "spec/unit/nokogiri_datastream_spec.rb",
314
317
  "spec/unit/property_spec.rb",
315
318
  "spec/unit/qualified_dublin_core_datastream_spec.rb",
316
319
  "spec/unit/relationship_spec.rb",
@@ -40,7 +40,8 @@ module ActiveFedora #:nodoc:
40
40
  if defined?(RAILS_ROOT)
41
41
  config_path = "#{RAILS_ROOT}/config/fedora.yml"
42
42
  else
43
- raise "Don't know where to look for fedora.yml. You should either set RAILS_ROOT or pass the path to fedora.yml as an argument to ActiveFedora.init"
43
+ config_path = File.join(File.dirname(__FILE__), "..", "config", "fedora.yml")
44
+ logger.info "Using the default fedora.yml that comes with active-fedora. If you want to override this, pass the path to fedora.yml as an argument to ActiveFedora.init or set RAILS_ROOT and put fedora.yml into \#{RAILS_ROOT}/config."
44
45
  end
45
46
  end
46
47
 
@@ -1,6 +1,7 @@
1
1
  require 'util/class_level_inheritable_attributes'
2
2
  require 'active_fedora/model'
3
3
  require 'active_fedora/semantic_node'
4
+ require 'nokogiri'
4
5
 
5
6
  SOLR_DOCUMENT_ID = "id" unless defined?(SOLR_DOCUMENT_ID)
6
7
  ENABLE_SOLR_UPDATES = true unless defined?(ENABLE_SOLR_UPDATES)
@@ -328,18 +329,33 @@ module ActiveFedora
328
329
 
329
330
 
330
331
  def self.deserialize(doc) #:nodoc:
331
- pid = doc.elements['/foxml:digitalObject'].attributes['PID']
332
+ if doc.instance_of?(REXML::Document)
333
+ pid = doc.elements['/foxml:digitalObject'].attributes['PID']
332
334
 
333
- proto = self.new(:pid=>pid, :new_object=>false)
334
- proto.datastreams.each do |name,ds|
335
- doc.elements.each("//foxml:datastream[@ID='#{name}']") do |el|
336
- # datastreams remain marked as new if the foxml doesn't have an entry for that datastream
337
- ds.new_object = false
338
- proto.datastreams[name]=ds.class.from_xml(ds, el)
335
+ proto = self.new(:pid=>pid, :new_object=>false)
336
+ proto.datastreams.each do |name,ds|
337
+ doc.elements.each("//foxml:datastream[@ID='#{name}']") do |el|
338
+ # datastreams remain marked as new if the foxml doesn't have an entry for that datastream
339
+ ds.new_object = false
340
+ proto.datastreams[name]=ds.class.from_xml(ds, el)
341
+ end
342
+ end
343
+ proto.inner_object.new_object = false
344
+ return proto
345
+ elsif doc.instance_of?(Nokogiri::XML::Document)
346
+ pid = doc.xpath('/foxml:digitalObject').first["PID"]
347
+
348
+ proto = self.new(:pid=>pid, :new_object=>false)
349
+ proto.datastreams.each do |name,ds|
350
+ doc.xpath("//foxml:datastream[@ID='#{name}']").each do |node|
351
+ # datastreams remain marked as new if the foxml doesn't have an entry for that datastream
352
+ ds.new_object = false
353
+ proto.datastreams[name]=ds.class.from_xml(ds, node)
354
+ end
339
355
  end
356
+ proto.inner_object.new_object = false
357
+ return proto
340
358
  end
341
- proto.inner_object.new_object = false
342
- return proto
343
359
  end
344
360
 
345
361
  #Return a hash of all available metadata fields for all
@@ -18,5 +18,57 @@ module ActiveFedora
18
18
  return "#{namespace}:#{sanitized_class_name}#{pid_suffix}"
19
19
  end
20
20
 
21
+ def self.models_asserted_by(obj)
22
+ Array obj.relationships[:self][:has_model]
23
+ end
24
+
25
+ def self.known_models_for(obj)
26
+ models_array = []
27
+ models_asserted_by( obj ).each do |model_uri|
28
+ m = uri_to_model_class(model_uri)
29
+ if m
30
+ models_array << m
31
+ end
32
+ end
33
+
34
+ if models_array.empty?
35
+ models_array = [ActiveFedora::Base]
36
+ end
37
+
38
+ return models_array
39
+ end
40
+
41
+ # Returns a ruby class corresponding to the given uri if one can be found.
42
+ # Returns false if no corresponding class can be found.
43
+ def self.uri_to_ruby_class( uri )
44
+ classname = uri.gsub("info:fedora/afmodel:", "")
45
+
46
+ if class_exists?(classname)
47
+ Kernel.const_get(classname)
48
+ else
49
+ false
50
+ end
51
+ end
52
+
53
+ # Returns an ActiveFedora Model class corresponding to the given uri if one can be found.
54
+ # Returns false if no corresponding model can be found.
55
+ def self.uri_to_model_class( uri )
56
+ rc = uri_to_ruby_class(uri)
57
+ if rc && rc.superclass == ActiveFedora::Base
58
+ rc
59
+ else
60
+ false
61
+ end
62
+ end
63
+
64
+ private
65
+
66
+ def self.class_exists?(class_name)
67
+ klass = Module.const_get(class_name)
68
+ return klass.is_a?(Class)
69
+ rescue NameError
70
+ return false
71
+ end
72
+
21
73
  end
22
74
  end
@@ -70,12 +70,15 @@ module ActiveFedora
70
70
  def before_save # :nodoc:
71
71
  #check_concurrency
72
72
  end
73
- def self.from_xml(tmpl, el)
74
- el.elements.each("foxml:xmlContent/fields") do |f|
75
- tmpl.send("#{f.name}_append", f.text)
73
+
74
+ # @tmpl ActiveFedora::Datastream
75
+ # @node Nokogiri::XML::Node
76
+ def self.from_xml(tmpl, node)
77
+ node.xpath("foxml:xmlContent/fields").each do |f|
78
+ # tmpl.send("#{f.name}_append", f.content)
76
79
  end
77
80
  tmpl.instance_variable_set(:@dirty, false)
78
- tmpl.control_group= el.attributes['CONTROL_GROUP']
81
+ tmpl.control_group= node['CONTROL_GROUP']
79
82
  tmpl
80
83
  end
81
84
 
@@ -53,9 +53,12 @@ module ActiveFedora
53
53
  end
54
54
  return xml.to_s
55
55
  end
56
- def self.from_xml(tmpl, el) # :nodoc:
57
- el.elements.each("./foxml:datastreamVersion[last()]/foxml:xmlContent/fields/node()")do |f|
58
- tmpl.send("#{f.name}_append", f.text)
56
+
57
+ # @tmpl ActiveFedora::MetadataDatastream
58
+ # @node Nokogiri::XML::Node
59
+ def self.from_xml(tmpl, node) # :nodoc:
60
+ node.xpath("./foxml:datastreamVersion[last()]/foxml:xmlContent/fields/node()").each do |f|
61
+ tmpl.send("#{f.name}_append", f.text) unless f.class == Nokogiri::XML::Text
59
62
  end
60
63
  tmpl.send(:dirty=, false)
61
64
  tmpl
@@ -26,21 +26,23 @@ module ActiveFedora
26
26
  self.blob = self.to_dc_xml
27
27
  end
28
28
 
29
- def self.from_xml(tmpl, el) # :nodoc:
29
+ # @tmpl ActiveFedora::Datastream
30
+ # @node Nokogiri::XML::Node
31
+ def self.from_xml(tmpl, node) # :nodoc:
30
32
  tmpl.fields.each do |z|
31
33
  fname = z.first
32
34
  fspec = z.last
33
- node = "dcterms:#{fspec[:xml_node] ? fspec[:xml_node] : fname}"
35
+ node_name = "dcterms:#{fspec[:xml_node] ? fspec[:xml_node] : fname}"
34
36
  attr_modifier= "[@xsi:type='#{fspec[:encoding]}']" if fspec[:encoding]
35
- query = "./foxml:datastreamVersion[last()]/foxml:xmlContent/dc/#{node}#{attr_modifier}"
36
- el.elements.each(query) do |f|
37
+ query = "./foxml:datastreamVersion[last()]/foxml:xmlContent/dc/#{node_name}#{attr_modifier}"
38
+ node.xpath(query, {"foxml"=>"info:fedora/fedora-system:def/foxml#", "dcterms"=>'http://purl.org/dc/terms/', "xsi"=>'http://www.w3.org/2001/XMLSchema-instance'}).each do |f|
37
39
  tmpl.send("#{fname}_append", f.text)
38
40
  end
39
41
 
40
42
  end
41
43
  tmpl.instance_variable_set(:@dirty, false)
42
44
  tmpl
43
- end
45
+ end
44
46
 
45
47
  #Render self as a Fedora DC xml document.
46
48
  def to_dc_xml
@@ -28,12 +28,13 @@ module ActiveFedora
28
28
  EOL
29
29
  end
30
30
 
31
- # Expects a RelsExtDatastream and a REXML Element as inputs.
32
- def self.from_xml(tmpl, el)
33
- #puts el.elements["./foxml:datastreamVersion[last()]/foxml:xmlContent/rdf:RDF/rdf:Description/"]
34
- el.elements.each("./foxml:datastreamVersion[last()]/foxml:xmlContent/rdf:RDF/rdf:Description/*") do |f|
35
- #puts "Element" + f.inspect
36
- r = ActiveFedora::Relationship.new(:subject=>:self, :predicate=>ActiveFedora::SemanticNode::PREDICATE_MAPPINGS.invert[f.name], :object=>f.attributes["rdf:resource"])
31
+ # @tmpl ActiveFedora::MetadataDatastream
32
+ # @node Nokogiri::XML::Node
33
+ def self.from_xml(tmpl, node)
34
+ # node.xpath("./foxml:datastreamVersion[last()]/foxml:xmlContent/rdf:RDF/rdf:Description/*").each do |f|
35
+ node.xpath("./foxml:datastreamVersion[last()]/foxml:xmlContent/rdf:RDF/rdf:Description/*", {"rdf"=>"http://www.w3.org/1999/02/22-rdf-syntax-ns#", "foxml"=>"info:fedora/fedora-system:def/foxml#"}).each do |f|
36
+ r = ActiveFedora::Relationship.new(:subject=>:self, :predicate=>ActiveFedora::SemanticNode::PREDICATE_MAPPINGS.invert[f.name], :object=>f["resource"])
37
+ puts "adding #{r.inspect} to template"
37
38
  tmpl.add_relationship(r)
38
39
  end
39
40
  tmpl.send(:dirty=, false)
@@ -4,6 +4,7 @@ require 'fedora/connection'
4
4
  require 'fedora/formats'
5
5
  require 'fedora/fedora_object'
6
6
  require 'fedora/datastream'
7
+ require "nokogiri"
7
8
 
8
9
  module Fedora
9
10
  NAMESPACE = "fedora:info/"
@@ -96,9 +97,11 @@ module Fedora
96
97
 
97
98
  convert_xml(connection.get("#{fedora_url.path}/objects?#{params.to_fedora_query}#{includes}"))
98
99
  end
100
+
99
101
  def find_model(pid, klazz)
100
102
  obj = self.find_objects("pid=#{pid}").first
101
- doc = REXML::Document.new(obj.object_xml, :ignore_whitespace_nodes=>:all)
103
+ #doc = REXML::Document.new(obj.object_xml, :ignore_whitespace_nodes=>:all)
104
+ doc = Nokogiri::XML::Document.parse(obj.object_xml)
102
105
  klazz.deserialize(doc)
103
106
  end
104
107
 
File without changes
@@ -3,6 +3,7 @@ require 'active_fedora'
3
3
  require 'active_fedora/base'
4
4
  require 'active_fedora/metadata_datastream'
5
5
  require 'ruby-debug'
6
+ require 'nokogiri'
6
7
 
7
8
  # Load Sample OralHistory Model
8
9
  require File.join( File.dirname(__FILE__), "..","samples","oral_history_sample_model" )
@@ -28,7 +29,7 @@ describe ActiveFedora::Base do
28
29
  #mocko = mock("object")
29
30
  #ActiveFedora::Base.expects(:new).returns(mocko)
30
31
  @test_object.datastreams["sensitive_passages"].delete
31
- doc = REXML::Document.new(@test_object.inner_object.object_xml, :ignore_whitespace_nodes=>:all)
32
+ doc = Nokogiri::XML::Document.parse(@test_object.inner_object.object_xml)
32
33
  result = OralHistorySampleModel.deserialize(doc)
33
34
  result.new_object?.should be_false
34
35
  result.datastreams_in_memory.should have_key("dublin_core")
@@ -6,6 +6,11 @@ require 'mocha'
6
6
 
7
7
  describe ActiveFedora::ContentModel do
8
8
 
9
+ before(:all) do
10
+ class SampleModel < ActiveFedora::Base
11
+ end
12
+ end
13
+
9
14
  before(:each) do
10
15
  Fedora::Repository.instance.stubs(:nextid).returns("_nextid_")
11
16
  @test_cmodel = ActiveFedora::ContentModel.new
@@ -47,5 +52,51 @@ describe ActiveFedora::ContentModel do
47
52
  end
48
53
  end
49
54
 
55
+ describe "models_asserted_by" do
56
+ it "should return an array of all of the content models asserted by the given object" do
57
+ mock_object = mock("ActiveFedora Object")
58
+ mock_object.expects(:relationships).returns( :self=>{:has_model=>["info:fedora/fedora-system:ServiceDefinition-3.0", "info:fedora/afmodel:SampleModel", "info:fedora/afmodel:NonDefinedModel"]} )
59
+ ActiveFedora::ContentModel.models_asserted_by(mock_object).should == ["info:fedora/fedora-system:ServiceDefinition-3.0", "info:fedora/afmodel:SampleModel", "info:fedora/afmodel:NonDefinedModel"]
60
+ end
61
+ it "should return an empty array if the object doesn't have a RELS-EXT datastream" do
62
+ mock_object = mock("ActiveFedora Object")
63
+ mock_object.expects(:relationships).returns( :self=>{} )
64
+ ActiveFedora::ContentModel.models_asserted_by(mock_object).should == []
65
+ end
66
+ end
67
+
68
+ describe "known_models_asserted_by" do
69
+ it "should figure out the applicable models to load" do
70
+ mock_object = mock("ActiveFedora Object")
71
+ mock_object.expects(:relationships).returns( :self=>{:has_model=>["info:fedora/fedora-system:ServiceDefinition-3.0", "info:fedora/afmodel:SampleModel", "info:fedora/afmodel:NonDefinedModel"]} )
72
+ ActiveFedora::ContentModel.known_models_for(mock_object).should == [SampleModel]
73
+ end
74
+ it "should default to using ActiveFedora::Base as the model" do
75
+ mock_object = mock("ActiveFedora Object")
76
+ mock_object.expects(:relationships).returns( :self=>{:has_model=>["info:fedora/afmodel:NonDefinedModel"]} )
77
+ ActiveFedora::ContentModel.known_models_for(mock_object).should == [ActiveFedora::Base]
78
+ end
79
+ it "should still work even if the object doesn't have a RELS-EXT datastream" do
80
+ mock_object = mock("ActiveFedora Object")
81
+ mock_object.expects(:relationships).returns( :self=>{} )
82
+ ActiveFedora::ContentModel.known_models_for(mock_object).should == [ActiveFedora::Base]
83
+ end
84
+ end
85
+
86
+ describe "uri_to_ruby_class" do
87
+ it "should return ruby class corresponding to the given uri if a valid class can be found" do
88
+ ActiveFedora::ContentModel.uri_to_ruby_class("info:fedora/afmodel:SampleModel").should == SampleModel
89
+ ActiveFedora::ContentModel.uri_to_ruby_class("info:fedora/afmodel:NonDefinedModel").should == false
90
+ ActiveFedora::ContentModel.uri_to_ruby_class("info:fedora/afmodel:String").should == String
91
+ end
92
+ end
93
+
94
+ describe "uri_to_model_class" do
95
+ it "should return an ActiveFedora Model class corresponding to the given uri if a valid model can be found" do
96
+ ActiveFedora::ContentModel.uri_to_model_class("info:fedora/afmodel:SampleModel").should == SampleModel
97
+ ActiveFedora::ContentModel.uri_to_model_class("info:fedora/afmodel:NonDefinedModel").should == false
98
+ ActiveFedora::ContentModel.uri_to_model_class("info:fedora/afmodel:String").should == false
99
+ end
100
+ end
50
101
 
51
102
  end
@@ -1,7 +1,7 @@
1
1
  require File.join( File.dirname(__FILE__), "../spec_helper" )
2
2
 
3
3
  require 'active_fedora'
4
- require "rexml/document"
4
+ require "nokogiri"
5
5
  require 'ftools'
6
6
 
7
7
  describe ActiveFedora::Datastream do
@@ -27,7 +27,7 @@ describe ActiveFedora::Datastream do
27
27
  </foxml:datastreamVersion>
28
28
  </foxml:datastream>
29
29
  EOF
30
- n = ActiveFedora::Datastream.from_xml(ActiveFedora::Datastream.new, REXML::Document.new(xml).elements.first)
30
+ n = ActiveFedora::Datastream.from_xml(ActiveFedora::Datastream.new, Nokogiri::XML::Document.parse(xml).root)
31
31
  n.control_group.should == 'M'
32
32
 
33
33
  end
@@ -0,0 +1,289 @@
1
+ require File.join( File.dirname(__FILE__), "../spec_helper" )
2
+
3
+ require 'active_fedora'
4
+ require 'hydra'
5
+
6
+ describe ModsDatastream do
7
+
8
+ before(:all) do
9
+ @sample_fields = {:publisher => {:values => ["publisher1"], :type => :string},
10
+ :coverage => {:values => ["coverage1", "coverage2"], :type => :text},
11
+ :creation_date => {:values => "fake-date", :type => :date},
12
+ :mydate => {:values => "fake-date", :type => :date},
13
+ :empty_field => {:values => {}}
14
+ }
15
+ @sample_xml = XmlSimple.xml_in("<fields><coverage>coverage1</coverage><coverage>coverage2</coverage><creation_date>fake-date</creation_date><mydate>fake-date</mydate><publisher>publisher1</publisher></fields>")
16
+
17
+ end
18
+
19
+ before(:each) do
20
+ @test_ds = ModsDatastream.new
21
+ end
22
+
23
+ after(:each) do
24
+ end
25
+
26
+ describe '#new' do
27
+ it 'should provide #new' do
28
+ ModsDatastream.should respond_to(:new)
29
+ @test_ds.ng_xml.should be_instance_of(OpinionatedModsDocument)
30
+ end
31
+ end
32
+
33
+
34
+ it 'should provide .fields' do
35
+ @test_ds.should respond_to(:fields)
36
+ end
37
+
38
+ describe '.save' do
39
+ it "should provide .save" do
40
+ @test_ds.should respond_to(:save)
41
+ end
42
+ it "should persist the product of .to_xml in fedora" do
43
+ Fedora::Repository.instance.expects(:save)
44
+ @test_ds.expects(:to_xml).returns("fake xml")
45
+ @test_ds.expects(:blob=).with("fake xml")
46
+ @test_ds.save
47
+ end
48
+ end
49
+
50
+ describe '.to_xml' do
51
+ it "should provide .to_xml" do
52
+ @test_ds.should respond_to(:to_xml)
53
+ end
54
+ it 'should output the fields hash as XML' do
55
+ @test_ds.expects(:fields).returns(@sample_fields)
56
+ #sample_rexml = REXML::Document.new(sample_xml)
57
+ #returned_rexml = REXML::Document.new(@test_ds.to_dc_xml)
58
+ #returned_rexml.to_s.should == sample_rexml.to_s
59
+ returned_xml = XmlSimple.xml_in(@test_ds.to_xml)
60
+ returned_xml.should == @sample_xml
61
+ end
62
+
63
+ it 'should accept an optional REXML Document as an argument and insert its fields into that' do
64
+ @test_ds.expects(:fields).returns(@sample_fields)
65
+ rexml = REXML::Document.new("<test_rexml/>")
66
+ rexml.root.elements.expects(:add).times(5)
67
+ result = @test_ds.to_xml(rexml)
68
+ end
69
+ it 'should accept an optional REXML Document as an argument and insert its fields into that' do
70
+ @test_ds.expects(:fields).returns(@sample_fields)
71
+ rexml = REXML::Document.new("<test_rexml/>")
72
+ result = @test_ds.to_xml(rexml)
73
+ XmlSimple.xml_in(rexml.to_s).should == @sample_xml
74
+ XmlSimple.xml_in(result).should == @sample_xml
75
+ end
76
+
77
+ it 'should add to root of REXML::Documents, but add directly to the elements if a REXML::Element is passed in' do
78
+ @test_ds.expects(:fields).returns(@sample_fields).times(2)
79
+ doc = REXML::Document.new("<test_document/>")
80
+ el = REXML::Element.new("<test_element/>")
81
+ doc.root.elements.expects(:add).times(5)
82
+ el.expects(:add).times(5)
83
+ @test_ds.to_xml(doc)
84
+ @test_ds.to_xml(el)
85
+ end
86
+
87
+ end
88
+
89
+ describe '.set_blob_for_save' do
90
+ it "should provide .set_blob_for_save" do
91
+ @test_ds.should respond_to(:set_blob_for_save)
92
+ end
93
+
94
+ it "should set the blob to to_xml" do
95
+ @test_ds.expects(:blob=).with(@test_ds.to_xml)
96
+ @test_ds.set_blob_for_save
97
+ end
98
+ end
99
+
100
+ describe '#field' do
101
+
102
+ before(:each) do
103
+ class SpecDatastream < ActiveFedora::MetadataDatastream
104
+ def initialize
105
+ super
106
+ field :publisher, :string
107
+ field :coverage, :text
108
+ field :creation_date, :date
109
+ field :mydate, :date
110
+ field :mycomplicated_field, :string, :multiple=>false, :encoding=>'LCSH', :element_attrs=>{:foo=>:bar, :baz=>:bat}
111
+ end
112
+ end
113
+ end
114
+
115
+ after(:each) do
116
+ Object.send(:remove_const, :SpecDatastream)
117
+ end
118
+
119
+ it 'should add corresponding field to the @fields hash and set the field :type ' do
120
+ sds = SpecDatastream.new
121
+ sds.fields.should_not have_key(:bio)
122
+ sds.field :bio, :text
123
+ sds.fields.should have_key(:bio)
124
+ sds.fields[:bio].should have_key(:type)
125
+ sds.fields[:bio][:type].should == :text
126
+ sds.fields[:mycomplicated_field][:element_attrs].should == {:foo=>:bar, :baz=>:bat}
127
+ end
128
+
129
+ # it "should insert custom element attrs into the xml stream" do
130
+ # sds = SpecDatastream.new
131
+ # sds.mycomplicated_field_values='foo'
132
+ # sds.fields[:mycomplicated_field][:element_attrs].should == {:foo=>:bar, :baz=>:bat}
133
+ # sds.to_xml.should == '<fields><mycomplicated_field baz=\'bat\' foo=\'bar\'>foo</mycomplicated_field></fields>'
134
+ # end
135
+
136
+ it "should add getters and setters and appenders with field name" do
137
+ local_test_ds = SpecDatastream.new
138
+ local_test_ds.should respond_to(:publisher_values)
139
+ local_test_ds.should respond_to(:publisher_append)
140
+ local_test_ds.should respond_to(:publisher_values=)
141
+ local_test_ds.publisher_values.class.should == Array
142
+ local_test_ds.should respond_to(:coverage_values)
143
+ local_test_ds.should respond_to(:coverage_values=)
144
+ local_test_ds.should respond_to(:coverage_append)
145
+ local_test_ds.should respond_to(:creation_date_values)
146
+ local_test_ds.should respond_to(:creation_date_append)
147
+ local_test_ds.should respond_to(:creation_date_values=)
148
+ local_test_ds.should respond_to(:mydate_values)
149
+ local_test_ds.should respond_to(:mydate_append)
150
+ local_test_ds.should respond_to(:mydate_values=)
151
+ end
152
+
153
+ it "should track field values at instance level, not at class level" do
154
+ local_test_ds1 = SpecDatastream.new
155
+ local_test_ds2 = SpecDatastream.new
156
+ local_test_ds1.publisher_values = ["publisher1", "publisher2"]
157
+ local_test_ds2.publisher_values = ["publisherA", "publisherB"]
158
+
159
+ local_test_ds2.publisher_values.should == ["publisherA", "publisherB"]
160
+ local_test_ds1.publisher_values.should == ["publisher1", "publisher2"]
161
+ end
162
+
163
+ it "should allow you to add field values using <<" do
164
+ local_test_ds1 = SpecDatastream.new
165
+ local_test_ds1.publisher_values << "publisher1"
166
+ local_test_ds1.publisher_values.should == ["publisher1"]
167
+ end
168
+
169
+ it "should create setter that always turns non-arrays into arrays" do
170
+ local_test_ds = SpecDatastream.new
171
+ local_test_ds.publisher_values = "Foo"
172
+ local_test_ds.publisher_values.should == ["Foo"]
173
+ end
174
+
175
+ it "should create setter that sets datastream.dirty? to true" do
176
+ local_test_ds = SpecDatastream.new
177
+ local_test_ds.should_not be_dirty
178
+ local_test_ds.publisher_values = "Foo"
179
+ local_test_ds.should be_dirty
180
+
181
+ # Note: If you use << to append values, the datastream will not be marked as dirty!
182
+ #local_test_ds.dirty = false
183
+
184
+ #local_test_ds.should_not be_dirty
185
+ #local_test_ds.publisher_values << "Foo"
186
+ #local_test_ds.should be_dirty
187
+ end
188
+
189
+ it "should add any extra opts to the field hash" do
190
+ local_test_ds = SpecDatastream.new
191
+ local_test_ds.field "myfield", :string, :foo => "foo", :bar => "bar"
192
+ local_test_ds.fields[:myfield].should have_key(:foo)
193
+ local_test_ds.fields[:myfield][:foo].should == "foo"
194
+ local_test_ds.fields[:myfield].should have_key(:bar)
195
+ local_test_ds.fields[:myfield][:bar].should == "bar"
196
+ end
197
+
198
+ end
199
+
200
+ describe ".to_solr" do
201
+
202
+ after(:all) do
203
+ # Revert to default mappings after running tests
204
+ ActiveFedora::SolrService.load_mappings
205
+ end
206
+
207
+ it "should provide .to_solr and return a SolrDocument" do
208
+ @test_ds.should respond_to(:to_solr)
209
+ @test_ds.to_solr.should be_kind_of(Solr::Document)
210
+ end
211
+
212
+ it "should optionally allow you to provide the Solr::Document to add fields to and return that document when done" do
213
+ doc = Solr::Document.new
214
+ @test_ds.to_solr(doc).should equal(doc)
215
+ end
216
+
217
+ it "should iterate through @fields hash" do
218
+ @test_ds.expects(:fields).returns(@sample_fields)
219
+ solr_doc = @test_ds.to_solr
220
+
221
+ solr_doc[:publisher_t].should == "publisher1"
222
+ solr_doc[:coverage_t].should == "coverage1"
223
+ solr_doc[:creation_date_dt].should == "fake-date"
224
+ solr_doc[:mydate_dt].should == "fake-date"
225
+
226
+ solr_doc[:empty_field_t].should be_nil
227
+ end
228
+
229
+ it "should allow multiple values for a single field"
230
+
231
+ it 'should append create keys in format field_name + _ + field_type' do
232
+ @test_ds.stubs(:fields).returns(@sample_fields)
233
+
234
+ #should have these
235
+
236
+ @test_ds.to_solr[:publisher_t].should_not be_nil
237
+ @test_ds.to_solr[:coverage_t].should_not be_nil
238
+ @test_ds.to_solr[:creation_date_dt].should_not be_nil
239
+
240
+ #should NOT have these
241
+ @test_ds.to_solr[:narrator].should be_nil
242
+ @test_ds.to_solr[:title].should be_nil
243
+ @test_ds.to_solr[:empty_field].should be_nil
244
+
245
+ end
246
+
247
+ it "should use Solr mappings to generate field names" do
248
+ ActiveFedora::SolrService.load_mappings(File.join(File.dirname(__FILE__), "..", "..", "config", "solr_mappings_af_0.1.yml"))
249
+ @test_ds.stubs(:fields).returns(@sample_fields)
250
+ solr_doc = @test_ds.to_solr
251
+
252
+ #should have these
253
+
254
+ solr_doc[:publisher_field].should == "publisher1"
255
+ solr_doc[:coverage_field].should == "coverage1"
256
+ solr_doc[:creation_date_date].should == "fake-date"
257
+ solr_doc[:mydate_date].should == "fake-date"
258
+
259
+ solr_doc[:publisher_t].should be_nil
260
+ solr_doc[:coverage_t].should be_nil
261
+ solr_doc[:creation_date_dt].should be_nil
262
+
263
+ # Reload default mappings
264
+ ActiveFedora::SolrService.load_mappings
265
+ end
266
+
267
+ it 'should append _dt to dates' do
268
+ @test_ds.expects(:fields).returns(@sample_fields).at_least_once
269
+
270
+ #should have these
271
+
272
+ @test_ds.to_solr[:creation_date_dt].should_not be_nil
273
+ @test_ds.to_solr[:mydate_dt].should_not be_nil
274
+
275
+ #should NOT have these
276
+
277
+ @test_ds.to_solr[:mydate].should be_nil
278
+ @test_ds.to_solr[:creation_date_date].should be_nil
279
+ end
280
+
281
+ end
282
+
283
+ describe '.fields' do
284
+ it "should return a Hash" do
285
+ @test_ds.fields.should be_instance_of(Hash)
286
+ end
287
+ end
288
+
289
+ end
@@ -0,0 +1,301 @@
1
+ require File.join( File.dirname(__FILE__), "../spec_helper" )
2
+
3
+ require 'active_fedora'
4
+ require 'active_fedora/nokogiri_datastream'
5
+
6
+ describe ActiveFedora::NokogiriDatastream do
7
+
8
+ before(:all) do
9
+ @sample_fields = {:publisher => {:values => ["publisher1"], :type => :string},
10
+ :coverage => {:values => ["coverage1", "coverage2"], :type => :text},
11
+ :creation_date => {:values => "fake-date", :type => :date},
12
+ :mydate => {:values => "fake-date", :type => :date},
13
+ :empty_field => {:values => {}}
14
+ }
15
+ @sample_xml = XmlSimple.xml_in("<fields><coverage>coverage1</coverage><coverage>coverage2</coverage><creation_date>fake-date</creation_date><mydate>fake-date</mydate><publisher>publisher1</publisher></fields>")
16
+
17
+ end
18
+
19
+ before(:each) do
20
+ @test_ds = ActiveFedora::NokogiriDatastream.new
21
+ end
22
+
23
+ after(:each) do
24
+ end
25
+
26
+ describe '#new' do
27
+ it 'should provide #new' do
28
+ ActiveFedora::NokogiriDatastream.should respond_to(:new)
29
+ @test_ds.ng_xml.should be_instance_of(Nokogiri::XML::Document)
30
+ end
31
+ end
32
+
33
+
34
+ it 'should provide .fields' do
35
+ @test_ds.should respond_to(:fields)
36
+ end
37
+
38
+ describe '.save' do
39
+ it "should provide .save" do
40
+ @test_ds.should respond_to(:save)
41
+ end
42
+ it "should persist the product of .to_xml in fedora" do
43
+ Fedora::Repository.instance.expects(:save)
44
+ @test_ds.expects(:to_xml).returns("fake xml")
45
+ @test_ds.expects(:blob=).with("fake xml")
46
+ @test_ds.save
47
+ end
48
+ end
49
+
50
+ describe '.to_xml' do
51
+ it "should provide .to_xml" do
52
+ @test_ds.should respond_to(:to_xml)
53
+ end
54
+ it 'should output the fields hash as XML' do
55
+ @test_ds.expects(:fields).returns(@sample_fields)
56
+ returned_xml = XmlSimple.xml_in(@test_ds.to_xml)
57
+ returned_xml.should == @sample_xml
58
+ end
59
+
60
+ it 'should accept an optional REXML Document as an argument and insert its fields into that' do
61
+ @test_ds.expects(:fields).returns(@sample_fields)
62
+ rexml = REXML::Document.new("<test_rexml/>")
63
+ rexml.root.elements.expects(:add).times(5)
64
+ result = @test_ds.to_xml(rexml)
65
+ end
66
+ it 'should accept an optional REXML Document as an argument and insert its fields into that' do
67
+ @test_ds.expects(:fields).returns(@sample_fields)
68
+ rexml = REXML::Document.new("<test_rexml/>")
69
+ result = @test_ds.to_xml(rexml)
70
+ XmlSimple.xml_in(rexml.to_s).should == @sample_xml
71
+ XmlSimple.xml_in(result).should == @sample_xml
72
+ end
73
+
74
+ it 'should add to root of REXML::Documents, but add directly to the elements if a REXML::Element is passed in' do
75
+ @test_ds.expects(:fields).returns(@sample_fields).times(2)
76
+ doc = REXML::Document.new("<test_document/>")
77
+ el = REXML::Element.new("<test_element/>")
78
+ doc.root.elements.expects(:add).times(5)
79
+ el.expects(:add).times(5)
80
+ @test_ds.to_xml(doc)
81
+ @test_ds.to_xml(el)
82
+ end
83
+
84
+ end
85
+
86
+ describe '.set_blob_for_save' do
87
+ it "should provide .set_blob_for_save" do
88
+ @test_ds.should respond_to(:set_blob_for_save)
89
+ end
90
+
91
+ it "should set the blob to to_xml" do
92
+ @test_ds.expects(:blob=).with(@test_ds.to_xml)
93
+ @test_ds.set_blob_for_save
94
+ end
95
+ end
96
+
97
+ describe '#field' do
98
+
99
+ before(:each) do
100
+ class SpecDatastream < ActiveFedora::MetadataDatastream
101
+ def initialize
102
+ super
103
+ field :publisher, :string
104
+ field :coverage, :text
105
+ field :creation_date, :date
106
+ field :mydate, :date
107
+ field :mycomplicated_field, :string, :multiple=>false, :encoding=>'LCSH', :element_attrs=>{:foo=>:bar, :baz=>:bat}
108
+ end
109
+ end
110
+ end
111
+
112
+ after(:each) do
113
+ Object.send(:remove_const, :SpecDatastream)
114
+ end
115
+
116
+
117
+ decribe ".values"
118
+ it "should call ng_xml.values_for(#{field_name}) OR call corresponding lookup method and build an array of values by calling .value on each node in the set"
119
+ end
120
+
121
+ decribe ".values<<"
122
+ it "should call corresponding builder method"
123
+ end
124
+
125
+ decribe ".values="
126
+ it "should wipe out any existing nodes, use the corresponding builder, and insert new node(s) as the replacement"
127
+ end
128
+
129
+ it 'should add corresponding field to the @fields hash and set the field :type ' do
130
+ sds = SpecDatastream.new
131
+ sds.fields.should_not have_key(:bio)
132
+ sds.field :bio, :text
133
+ sds.fields.should have_key(:bio)
134
+ sds.fields[:bio].should have_key(:type)
135
+ sds.fields[:bio][:type].should == :text
136
+ sds.fields[:mycomplicated_field][:element_attrs].should == {:foo=>:bar, :baz=>:bat}
137
+ end
138
+
139
+ # it "should insert custom element attrs into the xml stream" do
140
+ # sds = SpecDatastream.new
141
+ # sds.mycomplicated_field_values='foo'
142
+ # sds.fields[:mycomplicated_field][:element_attrs].should == {:foo=>:bar, :baz=>:bat}
143
+ # sds.to_xml.should == '<fields><mycomplicated_field baz=\'bat\' foo=\'bar\'>foo</mycomplicated_field></fields>'
144
+ # end
145
+
146
+ it "should add getters and setters and appenders with field name" do
147
+ local_test_ds = SpecDatastream.new
148
+ local_test_ds.should respond_to(:publisher_values)
149
+ local_test_ds.should respond_to(:publisher_append)
150
+ local_test_ds.should respond_to(:publisher_values=)
151
+ local_test_ds.publisher_values.class.should == Array
152
+ local_test_ds.should respond_to(:coverage_values)
153
+ local_test_ds.should respond_to(:coverage_values=)
154
+ local_test_ds.should respond_to(:coverage_append)
155
+ local_test_ds.should respond_to(:creation_date_values)
156
+ local_test_ds.should respond_to(:creation_date_append)
157
+ local_test_ds.should respond_to(:creation_date_values=)
158
+ local_test_ds.should respond_to(:mydate_values)
159
+ local_test_ds.should respond_to(:mydate_append)
160
+ local_test_ds.should respond_to(:mydate_values=)
161
+ end
162
+
163
+ it "should track field values at instance level, not at class level" do
164
+ local_test_ds1 = SpecDatastream.new
165
+ local_test_ds2 = SpecDatastream.new
166
+ local_test_ds1.publisher_values = ["publisher1", "publisher2"]
167
+ local_test_ds2.publisher_values = ["publisherA", "publisherB"]
168
+
169
+ local_test_ds2.publisher_values.should == ["publisherA", "publisherB"]
170
+ local_test_ds1.publisher_values.should == ["publisher1", "publisher2"]
171
+ end
172
+
173
+ it "should allow you to add field values using <<" do
174
+ local_test_ds1 = SpecDatastream.new
175
+ local_test_ds1.publisher_values << "publisher1"
176
+ local_test_ds1.publisher_values.should == ["publisher1"]
177
+ end
178
+
179
+ it "should create setter that always turns non-arrays into arrays" do
180
+ local_test_ds = SpecDatastream.new
181
+ local_test_ds.publisher_values = "Foo"
182
+ local_test_ds.publisher_values.should == ["Foo"]
183
+ end
184
+
185
+ it "should create setter that sets datastream.dirty? to true" do
186
+ local_test_ds = SpecDatastream.new
187
+ local_test_ds.should_not be_dirty
188
+ local_test_ds.publisher_values = "Foo"
189
+ local_test_ds.should be_dirty
190
+
191
+ # Note: If you use << to append values, the datastream will not be marked as dirty!
192
+ #local_test_ds.dirty = false
193
+
194
+ #local_test_ds.should_not be_dirty
195
+ #local_test_ds.publisher_values << "Foo"
196
+ #local_test_ds.should be_dirty
197
+ end
198
+
199
+ it "should add any extra opts to the field hash" do
200
+ local_test_ds = SpecDatastream.new
201
+ local_test_ds.field "myfield", :string, :foo => "foo", :bar => "bar"
202
+ local_test_ds.fields[:myfield].should have_key(:foo)
203
+ local_test_ds.fields[:myfield][:foo].should == "foo"
204
+ local_test_ds.fields[:myfield].should have_key(:bar)
205
+ local_test_ds.fields[:myfield][:bar].should == "bar"
206
+ end
207
+
208
+ end
209
+
210
+ describe ".to_solr" do
211
+
212
+ after(:all) do
213
+ # Revert to default mappings after running tests
214
+ ActiveFedora::SolrService.load_mappings
215
+ end
216
+
217
+ it "should iterate through the class fields, calling .values on each and appending the values to the solr doc"
218
+
219
+ it "should provide .to_solr and return a SolrDocument" do
220
+ @test_ds.should respond_to(:to_solr)
221
+ @test_ds.to_solr.should be_kind_of(Solr::Document)
222
+ end
223
+
224
+ it "should optionally allow you to provide the Solr::Document to add fields to and return that document when done" do
225
+ doc = Solr::Document.new
226
+ @test_ds.to_solr(doc).should equal(doc)
227
+ end
228
+
229
+ it "should iterate through @fields hash" do
230
+ @test_ds.expects(:fields).returns(@sample_fields)
231
+ solr_doc = @test_ds.to_solr
232
+
233
+ solr_doc[:publisher_t].should == "publisher1"
234
+ solr_doc[:coverage_t].should == "coverage1"
235
+ solr_doc[:creation_date_dt].should == "fake-date"
236
+ solr_doc[:mydate_dt].should == "fake-date"
237
+
238
+ solr_doc[:empty_field_t].should be_nil
239
+ end
240
+
241
+ it "should allow multiple values for a single field"
242
+
243
+ it 'should append create keys in format field_name + _ + field_type' do
244
+ @test_ds.stubs(:fields).returns(@sample_fields)
245
+
246
+ #should have these
247
+
248
+ @test_ds.to_solr[:publisher_t].should_not be_nil
249
+ @test_ds.to_solr[:coverage_t].should_not be_nil
250
+ @test_ds.to_solr[:creation_date_dt].should_not be_nil
251
+
252
+ #should NOT have these
253
+ @test_ds.to_solr[:narrator].should be_nil
254
+ @test_ds.to_solr[:title].should be_nil
255
+ @test_ds.to_solr[:empty_field].should be_nil
256
+
257
+ end
258
+
259
+ it "should use Solr mappings to generate field names" do
260
+ ActiveFedora::SolrService.load_mappings(File.join(File.dirname(__FILE__), "..", "..", "config", "solr_mappings_af_0.1.yml"))
261
+ @test_ds.stubs(:fields).returns(@sample_fields)
262
+ solr_doc = @test_ds.to_solr
263
+
264
+ #should have these
265
+
266
+ solr_doc[:publisher_field].should == "publisher1"
267
+ solr_doc[:coverage_field].should == "coverage1"
268
+ solr_doc[:creation_date_date].should == "fake-date"
269
+ solr_doc[:mydate_date].should == "fake-date"
270
+
271
+ solr_doc[:publisher_t].should be_nil
272
+ solr_doc[:coverage_t].should be_nil
273
+ solr_doc[:creation_date_dt].should be_nil
274
+
275
+ # Reload default mappings
276
+ ActiveFedora::SolrService.load_mappings
277
+ end
278
+
279
+ it 'should append _dt to dates' do
280
+ @test_ds.expects(:fields).returns(@sample_fields).at_least_once
281
+
282
+ #should have these
283
+
284
+ @test_ds.to_solr[:creation_date_dt].should_not be_nil
285
+ @test_ds.to_solr[:mydate_dt].should_not be_nil
286
+
287
+ #should NOT have these
288
+
289
+ @test_ds.to_solr[:mydate].should be_nil
290
+ @test_ds.to_solr[:creation_date_date].should be_nil
291
+ end
292
+
293
+ end
294
+
295
+ describe '.fields' do
296
+ it "should return a Hash" do
297
+ @test_ds.fields.should be_instance_of(Hash)
298
+ end
299
+ end
300
+
301
+ end
@@ -2,6 +2,7 @@ require File.join( File.dirname(__FILE__), "../spec_helper" )
2
2
 
3
3
  require 'active_fedora'
4
4
  require 'xmlsimple'
5
+ require 'nokogiri'
5
6
 
6
7
  describe ActiveFedora::QualifiedDublinCoreDatastream do
7
8
 
@@ -44,8 +45,10 @@ describe ActiveFedora::QualifiedDublinCoreDatastream do
44
45
  tmpl.expects(:publisher_append).with('jwa')
45
46
  tmpl.expects(:description_append).with('desc')
46
47
 
47
- sample = File.join(File.dirname(__FILE__), '../samples/oh_qdc.xml')
48
- z = ActiveFedora::QualifiedDublinCoreDatastream.from_xml(tmpl, REXML::Document.new(File.open(sample)).root.elements.first)
48
+ sample_xml = fixture('oh_qdc.xml')
49
+ sample_ds_xml = Nokogiri::XML::Document.parse(sample_xml).xpath('//foxml:datastream').first
50
+
51
+ z = ActiveFedora::QualifiedDublinCoreDatastream.from_xml(tmpl, sample_ds_xml)
49
52
  z.should === tmpl
50
53
  end
51
54
 
@@ -59,10 +62,10 @@ describe ActiveFedora::QualifiedDublinCoreDatastream do
59
62
  end
60
63
 
61
64
  it "should have identity in and out" do
62
- sample = File.join(File.dirname(__FILE__), '../samples/oh_qdc.xml')
65
+ sample = fixture('oh_qdc.xml')
63
66
  tmpl = OralHistorySampleModel.new.datastreams['dublin_core']
64
- z = ActiveFedora::QualifiedDublinCoreDatastream.from_xml(tmpl, REXML::Document.new(File.open(sample)).root.elements.first)
65
- y = ActiveFedora::QualifiedDublinCoreDatastream.from_xml(tmpl, REXML::Document.new(z.to_dc_xml))
67
+ z = ActiveFedora::QualifiedDublinCoreDatastream.from_xml(tmpl, Nokogiri::XML::Document.parse(sample).root.children.first)
68
+ y = ActiveFedora::QualifiedDublinCoreDatastream.from_xml(tmpl, Nokogiri::XML::Document.parse(z.to_dc_xml))
66
69
  y.to_dc_xml.should == z.to_dc_xml
67
70
  end
68
71
 
@@ -77,8 +80,8 @@ describe ActiveFedora::QualifiedDublinCoreDatastream do
77
80
 
78
81
 
79
82
  it "should parse dcterms and dcelements from xml" do
80
- doc = REXML::Document.new(File.open(File.dirname(__FILE__)+'/../fixtures/changeme155.xml'), :force_array=>true)
81
- stream = doc.elements['//foxml:datastream[@ID=\'dublin_core\']']
83
+ doc = Nokogiri::XML::Document.parse(File.open( File.dirname(__FILE__)+'/../fixtures/changeme155.xml') )
84
+ stream = doc.xpath('//foxml:datastream[@ID=\'dublin_core\']')
82
85
  n = ActiveFedora::QualifiedDublinCoreDatastream.from_xml(ActiveFedora::QualifiedDublinCoreDatastream.new, stream)
83
86
  n.spatial_values.should == ["Boston [7013445]", "Dorchester [7013575]", "Roxbury [7015002]"]
84
87
  n.title_values.should == ["Oral history with Frances Addelson, 1997 November 14"]
@@ -134,7 +137,7 @@ describe ActiveFedora::QualifiedDublinCoreDatastream do
134
137
 
135
138
 
136
139
  #
137
- # I think the fields should just be tracked as a REXML::Document internally. Too much BS otherwise.
140
+ # I think the fields should just be tracked as a Nokogiri::XML::Document internally. Too much BS otherwise.
138
141
  #
139
142
 
140
143
 
@@ -158,7 +161,7 @@ describe ActiveFedora::QualifiedDublinCoreDatastream do
158
161
 
159
162
  it "should use specified :xml_node if it is available in the field Hash" do
160
163
  @test_ds.stubs(:fields).returns({:myfieldname => {:values => ["sample spatial coverage"], :xml_node => "nodename" }})
161
- REXML::Document.new(@test_ds.to_dc_xml).elements['./dc/dcterms:nodename'].text.should == 'sample spatial coverage'
164
+ Nokogiri::XML::Document.parse(@test_ds.to_dc_xml).xpath('./dc/dcterms:nodename').text.should == 'sample spatial coverage'
162
165
  end
163
166
 
164
167
  it "should use specified :xml_node if it was specified when .field was called" do
@@ -2,6 +2,7 @@ require File.join( File.dirname(__FILE__), "../spec_helper" )
2
2
 
3
3
  require 'active_fedora'
4
4
  require "rexml/document"
5
+ require "nokogiri"
5
6
  require 'ftools'
6
7
 
7
8
  describe ActiveFedora::RelsExtDatastream do
@@ -12,7 +13,7 @@ describe ActiveFedora::RelsExtDatastream do
12
13
  @test_relationship2 = ActiveFedora::Relationship.new(:subject => :self, :predicate => :is_part_of, :object => "demo:11")
13
14
  @test_relationship3 = ActiveFedora::Relationship.new(:subject => @pid, :predicate => :has_part, :object => "demo:12")
14
15
 
15
- @sample_xml = REXML::Document.new(@sample_xml_string)
16
+ @sample_xml = Nokogiri::XML::Document.parse(@sample_xml_string)
16
17
  end
17
18
 
18
19
  before(:each) do
@@ -65,8 +66,8 @@ describe ActiveFedora::RelsExtDatastream do
65
66
  end
66
67
  it "should load RELS-EXT relationships into relationships hash" do
67
68
  @test_obj.relationships.should == {:self=>{:is_member_of=>["info:fedora/demo:10"], :is_part_of=>["info:fedora/demo:11"], :has_model=>["info:fedora/afmodel:ActiveFedora_Base"]}}
68
- doc = REXML::Document.new(@test_obj.inner_object.object_xml)
69
- el = doc.elements["/foxml:digitalObject//foxml:datastream[@ID='RELS-EXT']"]
69
+ doc = Nokogiri::XML::Document.parse(@test_obj.inner_object.object_xml)
70
+ el = doc.xpath("/foxml:digitalObject//foxml:datastream[@ID='RELS-EXT']").first
70
71
  new_ds = ActiveFedora::RelsExtDatastream.new
71
72
  new_ds.relationships.should == {:self=>{}}
72
73
  ActiveFedora::RelsExtDatastream.from_xml(new_ds,el)
metadata CHANGED
@@ -1,12 +1,13 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: active-fedora
3
3
  version: !ruby/object:Gem::Version
4
- prerelease: false
4
+ prerelease: true
5
5
  segments:
6
6
  - 1
7
7
  - 1
8
- - 2
9
- version: 1.1.2
8
+ - 4
9
+ - pre2
10
+ version: 1.1.4.pre2
10
11
  platform: ruby
11
12
  authors:
12
13
  - Matt Zumwalt
@@ -15,7 +16,7 @@ autorequire:
15
16
  bindir: bin
16
17
  cert_chain: []
17
18
 
18
- date: 2010-03-31 00:00:00 -05:00
19
+ date: 2010-05-15 00:00:00 -05:00
19
20
  default_executable:
20
21
  dependencies:
21
22
  - !ruby/object:Gem::Dependency
@@ -120,7 +121,7 @@ extensions: []
120
121
  extra_rdoc_files:
121
122
  - LICENSE
122
123
  - README.rdoc
123
- - README.txt
124
+ - README.textile
124
125
  files:
125
126
  - .document
126
127
  - .gitignore
@@ -280,7 +281,7 @@ files:
280
281
  - Manifest.txt
281
282
  - PostInstall.txt
282
283
  - README.rdoc
283
- - README.txt
284
+ - README.textile
284
285
  - Rakefile
285
286
  - VERSION
286
287
  - active-fedora.gemspec
@@ -321,6 +322,7 @@ files:
321
322
  - spec/fixtures/changeme155.xml
322
323
  - spec/fixtures/dino.jpg
323
324
  - spec/fixtures/minivan.jpg
325
+ - spec/fixtures/oh_qdc.xml
324
326
  - spec/fixtures/test_12.foxml.xml
325
327
  - spec/integration/base_file_management_spec.rb
326
328
  - spec/integration/base_loader_spec.rb
@@ -341,7 +343,6 @@ files:
341
343
  - spec/samples/models/oral_history.rb
342
344
  - spec/samples/models/seminar.rb
343
345
  - spec/samples/models/seminar_audio_file.rb
344
- - spec/samples/oh_qdc.xml
345
346
  - spec/samples/oral_history_sample.xml
346
347
  - spec/samples/oral_history_sample_model.rb
347
348
  - spec/samples/oral_history_xml.xml
@@ -391,14 +392,16 @@ required_ruby_version: !ruby/object:Gem::Requirement
391
392
  version: "0"
392
393
  required_rubygems_version: !ruby/object:Gem::Requirement
393
394
  requirements:
394
- - - ">="
395
+ - - ">"
395
396
  - !ruby/object:Gem::Version
396
397
  segments:
397
- - 0
398
- version: "0"
398
+ - 1
399
+ - 3
400
+ - 1
401
+ version: 1.3.1
399
402
  requirements: []
400
403
 
401
- rubyforge_project:
404
+ rubyforge_project: rubyfedora
402
405
  rubygems_version: 1.3.6
403
406
  signing_key:
404
407
  specification_version: 3
@@ -439,6 +442,8 @@ test_files:
439
442
  - spec/unit/inheritance_spec.rb
440
443
  - spec/unit/metadata_datastream_spec.rb
441
444
  - spec/unit/model_spec.rb
445
+ - spec/unit/mods_datastream_spec.rb
446
+ - spec/unit/nokogiri_datastream_spec.rb
442
447
  - spec/unit/property_spec.rb
443
448
  - spec/unit/qualified_dublin_core_datastream_spec.rb
444
449
  - spec/unit/relationship_spec.rb