active-fedora 1.1.4 → 1.1.5

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.
@@ -19,6 +19,25 @@ h2. Getting Started
19
19
 
20
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.
21
21
 
22
+ h2. Testing
23
+
24
+ In order to run the RSpec tests, you need to have a copy of hydra-jetty running. To do this, download a working copy of hydra-jetty, cd into its root and run
25
+ <pre>java -jar start.jar</pre>
26
+
27
+ Then open a new terminal and import fedora's demo objects.
28
+
29
+ <pre>
30
+ export FEDORA_HOME=/path/to/hydra/jetty/fedora/default
31
+ $FEDORA_HOME/client/bin/fedora-ingest-demos.sh localhost 8983 fedoraAdmin fedoraAdmin http
32
+ <pre>
33
+
34
+ Now you're ready to run
35
+
36
+ <pre>
37
+ cd /wherever/active_fedora/is
38
+ rake spec
39
+ </pre>
40
+
22
41
  h2. LICENSE:
23
42
 
24
43
  Copyright (c) 2009-2010 Matt Zumwalt
data/Rakefile CHANGED
@@ -20,6 +20,7 @@ begin
20
20
  gem.add_dependency('xml-simple', '>= 1.0.12')
21
21
  gem.add_dependency('mime-types', '>= 1.16')
22
22
  gem.add_dependency('multipart-post')
23
+ gem.add_dependency('nokogiri')
23
24
 
24
25
  gem.add_development_dependency "rspec", ">= 1.2.9"
25
26
  gem.add_development_dependency "mocha", ">= 1.2.9"
data/VERSION CHANGED
@@ -1 +1 @@
1
- 1.1.4
1
+ 1.1.5
@@ -5,11 +5,11 @@
5
5
 
6
6
  Gem::Specification.new do |s|
7
7
  s.name = %q{active-fedora}
8
- s.version = "1.1.4"
8
+ s.version = "1.1.5"
9
9
 
10
10
  s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
11
11
  s.authors = ["Matt Zumwalt", "McClain Looney"]
12
- s.date = %q{2010-05-15}
12
+ s.date = %q{2010-05-16}
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 = [
@@ -208,6 +208,9 @@ Gem::Specification.new do |s|
208
208
  "lib/fedora/formats.rb",
209
209
  "lib/fedora/generic_search.rb",
210
210
  "lib/fedora/repository.rb",
211
+ "lib/hydra.rb",
212
+ "lib/hydra_libs/mods_datastream.rb",
213
+ "lib/hydra_libs/opinionated_mods_document.rb",
211
214
  "lib/ruby-fedora.rb",
212
215
  "lib/util/class_level_inheritable_attributes.rb",
213
216
  "script/console",
@@ -259,6 +262,8 @@ Gem::Specification.new do |s|
259
262
  "spec/unit/inheritance_spec.rb",
260
263
  "spec/unit/metadata_datastream_spec.rb",
261
264
  "spec/unit/model_spec.rb",
265
+ "spec/unit/mods_datastream_spec.rb",
266
+ "spec/unit/nokogiri_datastream_spec.rb",
262
267
  "spec/unit/property_spec.rb",
263
268
  "spec/unit/qualified_dublin_core_datastream_spec.rb",
264
269
  "spec/unit/relationship_spec.rb",
@@ -314,6 +319,8 @@ Gem::Specification.new do |s|
314
319
  "spec/unit/inheritance_spec.rb",
315
320
  "spec/unit/metadata_datastream_spec.rb",
316
321
  "spec/unit/model_spec.rb",
322
+ "spec/unit/mods_datastream_spec.rb",
323
+ "spec/unit/nokogiri_datastream_spec.rb",
317
324
  "spec/unit/property_spec.rb",
318
325
  "spec/unit/qualified_dublin_core_datastream_spec.rb",
319
326
  "spec/unit/relationship_spec.rb",
@@ -335,6 +342,7 @@ Gem::Specification.new do |s|
335
342
  s.add_runtime_dependency(%q<xml-simple>, [">= 1.0.12"])
336
343
  s.add_runtime_dependency(%q<mime-types>, [">= 1.16"])
337
344
  s.add_runtime_dependency(%q<multipart-post>, [">= 0"])
345
+ s.add_runtime_dependency(%q<nokogiri>, [">= 0"])
338
346
  s.add_development_dependency(%q<rspec>, [">= 1.2.9"])
339
347
  s.add_development_dependency(%q<mocha>, [">= 1.2.9"])
340
348
  s.add_development_dependency(%q<ruby-debug>, [">= 0"])
@@ -343,6 +351,7 @@ Gem::Specification.new do |s|
343
351
  s.add_dependency(%q<xml-simple>, [">= 1.0.12"])
344
352
  s.add_dependency(%q<mime-types>, [">= 1.16"])
345
353
  s.add_dependency(%q<multipart-post>, [">= 0"])
354
+ s.add_dependency(%q<nokogiri>, [">= 0"])
346
355
  s.add_dependency(%q<rspec>, [">= 1.2.9"])
347
356
  s.add_dependency(%q<mocha>, [">= 1.2.9"])
348
357
  s.add_dependency(%q<ruby-debug>, [">= 0"])
@@ -352,6 +361,7 @@ Gem::Specification.new do |s|
352
361
  s.add_dependency(%q<xml-simple>, [">= 1.0.12"])
353
362
  s.add_dependency(%q<mime-types>, [">= 1.16"])
354
363
  s.add_dependency(%q<multipart-post>, [">= 0"])
364
+ s.add_dependency(%q<nokogiri>, [">= 0"])
355
365
  s.add_dependency(%q<rspec>, [">= 1.2.9"])
356
366
  s.add_dependency(%q<mocha>, [">= 1.2.9"])
357
367
  s.add_dependency(%q<ruby-debug>, [">= 0"])
@@ -86,6 +86,10 @@ module ActiveFedora
86
86
  end
87
87
  @new_object = false
88
88
  self.update_index if @metadata_is_dirty == true && ENABLE_SOLR_UPDATES
89
+ if defined?( Solrizer::Solrizer )
90
+ solrizer = Solrizer::Solrizer.new
91
+ solrizer.solrize( self )
92
+ end
89
93
  @metadata_is_dirty == false
90
94
  return result
91
95
  end
@@ -0,0 +1,2 @@
1
+ # module Hydra;end
2
+ require "hydra_libs/mods_datastream"
@@ -0,0 +1,6 @@
1
+ #this class represents a MetadataDatastream, a special case of ActiveFedora::Datastream
2
+ require "hydra_libs/opinionated_mods_document"
3
+
4
+ class ModsDatastream < ActiveFedora::NokogiriDatastream
5
+ self.xml_model = OpinionatedModsDocument
6
+ end
@@ -0,0 +1,2 @@
1
+ class OpinionatedModsDocument
2
+ 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,299 @@
1
+ require File.join( File.dirname(__FILE__), "../spec_helper" )
2
+
3
+
4
+ describe ActiveFedora::NokogiriDatastream do
5
+
6
+ before(:all) do
7
+ @sample_fields = {:publisher => {:values => ["publisher1"], :type => :string},
8
+ :coverage => {:values => ["coverage1", "coverage2"], :type => :text},
9
+ :creation_date => {:values => "fake-date", :type => :date},
10
+ :mydate => {:values => "fake-date", :type => :date},
11
+ :empty_field => {:values => {}}
12
+ }
13
+ @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>")
14
+
15
+ end
16
+
17
+ before(:each) do
18
+ @test_ds = ActiveFedora::NokogiriDatastream.new
19
+ end
20
+
21
+ after(:each) do
22
+ end
23
+
24
+ describe '#new' do
25
+ it 'should provide #new' do
26
+ ActiveFedora::NokogiriDatastream.should respond_to(:new)
27
+ @test_ds.ng_xml.should be_instance_of(Nokogiri::XML::Document)
28
+ end
29
+ end
30
+
31
+
32
+ it 'should provide .fields' do
33
+ @test_ds.should respond_to(:fields)
34
+ end
35
+
36
+ describe '.save' do
37
+ it "should provide .save" do
38
+ @test_ds.should respond_to(:save)
39
+ end
40
+ it "should persist the product of .to_xml in fedora" do
41
+ Fedora::Repository.instance.expects(:save)
42
+ @test_ds.expects(:to_xml).returns("fake xml")
43
+ @test_ds.expects(:blob=).with("fake xml")
44
+ @test_ds.save
45
+ end
46
+ end
47
+
48
+ describe '.to_xml' do
49
+ it "should provide .to_xml" do
50
+ @test_ds.should respond_to(:to_xml)
51
+ end
52
+ it 'should output the fields hash as XML' do
53
+ @test_ds.expects(:fields).returns(@sample_fields)
54
+ returned_xml = XmlSimple.xml_in(@test_ds.to_xml)
55
+ returned_xml.should == @sample_xml
56
+ end
57
+
58
+ it 'should accept an optional REXML Document as an argument and insert its fields into that' do
59
+ @test_ds.expects(:fields).returns(@sample_fields)
60
+ rexml = REXML::Document.new("<test_rexml/>")
61
+ rexml.root.elements.expects(:add).times(5)
62
+ result = @test_ds.to_xml(rexml)
63
+ end
64
+ it 'should accept an optional REXML Document as an argument and insert its fields into that' do
65
+ @test_ds.expects(:fields).returns(@sample_fields)
66
+ rexml = REXML::Document.new("<test_rexml/>")
67
+ result = @test_ds.to_xml(rexml)
68
+ XmlSimple.xml_in(rexml.to_s).should == @sample_xml
69
+ XmlSimple.xml_in(result).should == @sample_xml
70
+ end
71
+
72
+ it 'should add to root of REXML::Documents, but add directly to the elements if a REXML::Element is passed in' do
73
+ @test_ds.expects(:fields).returns(@sample_fields).times(2)
74
+ doc = REXML::Document.new("<test_document/>")
75
+ el = REXML::Element.new("<test_element/>")
76
+ doc.root.elements.expects(:add).times(5)
77
+ el.expects(:add).times(5)
78
+ @test_ds.to_xml(doc)
79
+ @test_ds.to_xml(el)
80
+ end
81
+
82
+ end
83
+
84
+ describe '.set_blob_for_save' do
85
+ it "should provide .set_blob_for_save" do
86
+ @test_ds.should respond_to(:set_blob_for_save)
87
+ end
88
+
89
+ it "should set the blob to to_xml" do
90
+ @test_ds.expects(:blob=).with(@test_ds.to_xml)
91
+ @test_ds.set_blob_for_save
92
+ end
93
+ end
94
+
95
+ describe '#field' do
96
+
97
+ before(:each) do
98
+ class SpecDatastream < ActiveFedora::MetadataDatastream
99
+ def initialize
100
+ super
101
+ field :publisher, :string
102
+ field :coverage, :text
103
+ field :creation_date, :date
104
+ field :mydate, :date
105
+ field :mycomplicated_field, :string, :multiple=>false, :encoding=>'LCSH', :element_attrs=>{:foo=>:bar, :baz=>:bat}
106
+ end
107
+ end
108
+ end
109
+
110
+ after(:each) do
111
+ Object.send(:remove_const, :SpecDatastream)
112
+ end
113
+
114
+
115
+ describe ".values" do
116
+ 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"
117
+ end
118
+
119
+ describe ".values<<" do
120
+ it "should call corresponding builder method"
121
+ end
122
+
123
+ describe ".values=" do
124
+ it "should wipe out any existing nodes, use the corresponding builder, and insert new node(s) as the replacement"
125
+ end
126
+
127
+ it 'should add corresponding field to the @fields hash and set the field :type ' do
128
+ sds = SpecDatastream.new
129
+ sds.fields.should_not have_key(:bio)
130
+ sds.field :bio, :text
131
+ sds.fields.should have_key(:bio)
132
+ sds.fields[:bio].should have_key(:type)
133
+ sds.fields[:bio][:type].should == :text
134
+ sds.fields[:mycomplicated_field][:element_attrs].should == {:foo=>:bar, :baz=>:bat}
135
+ end
136
+
137
+ # it "should insert custom element attrs into the xml stream" do
138
+ # sds = SpecDatastream.new
139
+ # sds.mycomplicated_field_values='foo'
140
+ # sds.fields[:mycomplicated_field][:element_attrs].should == {:foo=>:bar, :baz=>:bat}
141
+ # sds.to_xml.should == '<fields><mycomplicated_field baz=\'bat\' foo=\'bar\'>foo</mycomplicated_field></fields>'
142
+ # end
143
+
144
+ it "should add getters and setters and appenders with field name" do
145
+ local_test_ds = SpecDatastream.new
146
+ local_test_ds.should respond_to(:publisher_values)
147
+ local_test_ds.should respond_to(:publisher_append)
148
+ local_test_ds.should respond_to(:publisher_values=)
149
+ local_test_ds.publisher_values.class.should == Array
150
+ local_test_ds.should respond_to(:coverage_values)
151
+ local_test_ds.should respond_to(:coverage_values=)
152
+ local_test_ds.should respond_to(:coverage_append)
153
+ local_test_ds.should respond_to(:creation_date_values)
154
+ local_test_ds.should respond_to(:creation_date_append)
155
+ local_test_ds.should respond_to(:creation_date_values=)
156
+ local_test_ds.should respond_to(:mydate_values)
157
+ local_test_ds.should respond_to(:mydate_append)
158
+ local_test_ds.should respond_to(:mydate_values=)
159
+ end
160
+
161
+ it "should track field values at instance level, not at class level" do
162
+ local_test_ds1 = SpecDatastream.new
163
+ local_test_ds2 = SpecDatastream.new
164
+ local_test_ds1.publisher_values = ["publisher1", "publisher2"]
165
+ local_test_ds2.publisher_values = ["publisherA", "publisherB"]
166
+
167
+ local_test_ds2.publisher_values.should == ["publisherA", "publisherB"]
168
+ local_test_ds1.publisher_values.should == ["publisher1", "publisher2"]
169
+ end
170
+
171
+ it "should allow you to add field values using <<" do
172
+ local_test_ds1 = SpecDatastream.new
173
+ local_test_ds1.publisher_values << "publisher1"
174
+ local_test_ds1.publisher_values.should == ["publisher1"]
175
+ end
176
+
177
+ it "should create setter that always turns non-arrays into arrays" do
178
+ local_test_ds = SpecDatastream.new
179
+ local_test_ds.publisher_values = "Foo"
180
+ local_test_ds.publisher_values.should == ["Foo"]
181
+ end
182
+
183
+ it "should create setter that sets datastream.dirty? to true" do
184
+ local_test_ds = SpecDatastream.new
185
+ local_test_ds.should_not be_dirty
186
+ local_test_ds.publisher_values = "Foo"
187
+ local_test_ds.should be_dirty
188
+
189
+ # Note: If you use << to append values, the datastream will not be marked as dirty!
190
+ #local_test_ds.dirty = false
191
+
192
+ #local_test_ds.should_not be_dirty
193
+ #local_test_ds.publisher_values << "Foo"
194
+ #local_test_ds.should be_dirty
195
+ end
196
+
197
+ it "should add any extra opts to the field hash" do
198
+ local_test_ds = SpecDatastream.new
199
+ local_test_ds.field "myfield", :string, :foo => "foo", :bar => "bar"
200
+ local_test_ds.fields[:myfield].should have_key(:foo)
201
+ local_test_ds.fields[:myfield][:foo].should == "foo"
202
+ local_test_ds.fields[:myfield].should have_key(:bar)
203
+ local_test_ds.fields[:myfield][:bar].should == "bar"
204
+ end
205
+
206
+ end
207
+
208
+ describe ".to_solr" do
209
+
210
+ after(:all) do
211
+ # Revert to default mappings after running tests
212
+ ActiveFedora::SolrService.load_mappings
213
+ end
214
+
215
+ it "should iterate through the class fields, calling .values on each and appending the values to the solr doc"
216
+
217
+ it "should provide .to_solr and return a SolrDocument" do
218
+ @test_ds.should respond_to(:to_solr)
219
+ @test_ds.to_solr.should be_kind_of(Solr::Document)
220
+ end
221
+
222
+ it "should optionally allow you to provide the Solr::Document to add fields to and return that document when done" do
223
+ doc = Solr::Document.new
224
+ @test_ds.to_solr(doc).should equal(doc)
225
+ end
226
+
227
+ it "should iterate through @fields hash" do
228
+ @test_ds.expects(:fields).returns(@sample_fields)
229
+ solr_doc = @test_ds.to_solr
230
+
231
+ solr_doc[:publisher_t].should == "publisher1"
232
+ solr_doc[:coverage_t].should == "coverage1"
233
+ solr_doc[:creation_date_dt].should == "fake-date"
234
+ solr_doc[:mydate_dt].should == "fake-date"
235
+
236
+ solr_doc[:empty_field_t].should be_nil
237
+ end
238
+
239
+ it "should allow multiple values for a single field"
240
+
241
+ it 'should append create keys in format field_name + _ + field_type' do
242
+ @test_ds.stubs(:fields).returns(@sample_fields)
243
+
244
+ #should have these
245
+
246
+ @test_ds.to_solr[:publisher_t].should_not be_nil
247
+ @test_ds.to_solr[:coverage_t].should_not be_nil
248
+ @test_ds.to_solr[:creation_date_dt].should_not be_nil
249
+
250
+ #should NOT have these
251
+ @test_ds.to_solr[:narrator].should be_nil
252
+ @test_ds.to_solr[:title].should be_nil
253
+ @test_ds.to_solr[:empty_field].should be_nil
254
+
255
+ end
256
+
257
+ it "should use Solr mappings to generate field names" do
258
+ ActiveFedora::SolrService.load_mappings(File.join(File.dirname(__FILE__), "..", "..", "config", "solr_mappings_af_0.1.yml"))
259
+ @test_ds.stubs(:fields).returns(@sample_fields)
260
+ solr_doc = @test_ds.to_solr
261
+
262
+ #should have these
263
+
264
+ solr_doc[:publisher_field].should == "publisher1"
265
+ solr_doc[:coverage_field].should == "coverage1"
266
+ solr_doc[:creation_date_date].should == "fake-date"
267
+ solr_doc[:mydate_date].should == "fake-date"
268
+
269
+ solr_doc[:publisher_t].should be_nil
270
+ solr_doc[:coverage_t].should be_nil
271
+ solr_doc[:creation_date_dt].should be_nil
272
+
273
+ # Reload default mappings
274
+ ActiveFedora::SolrService.load_mappings
275
+ end
276
+
277
+ it 'should append _dt to dates' do
278
+ @test_ds.expects(:fields).returns(@sample_fields).at_least_once
279
+
280
+ #should have these
281
+
282
+ @test_ds.to_solr[:creation_date_dt].should_not be_nil
283
+ @test_ds.to_solr[:mydate_dt].should_not be_nil
284
+
285
+ #should NOT have these
286
+
287
+ @test_ds.to_solr[:mydate].should be_nil
288
+ @test_ds.to_solr[:creation_date_date].should be_nil
289
+ end
290
+
291
+ end
292
+
293
+ describe '.fields' do
294
+ it "should return a Hash" do
295
+ @test_ds.fields.should be_instance_of(Hash)
296
+ end
297
+ end
298
+
299
+ end
metadata CHANGED
@@ -5,8 +5,8 @@ version: !ruby/object:Gem::Version
5
5
  segments:
6
6
  - 1
7
7
  - 1
8
- - 4
9
- version: 1.1.4
8
+ - 5
9
+ version: 1.1.5
10
10
  platform: ruby
11
11
  authors:
12
12
  - Matt Zumwalt
@@ -15,7 +15,7 @@ autorequire:
15
15
  bindir: bin
16
16
  cert_chain: []
17
17
 
18
- date: 2010-05-15 00:00:00 -05:00
18
+ date: 2010-05-16 00:00:00 -05:00
19
19
  default_executable:
20
20
  dependencies:
21
21
  - !ruby/object:Gem::Dependency
@@ -72,9 +72,21 @@ dependencies:
72
72
  type: :runtime
73
73
  version_requirements: *id004
74
74
  - !ruby/object:Gem::Dependency
75
- name: rspec
75
+ name: nokogiri
76
76
  prerelease: false
77
77
  requirement: &id005 !ruby/object:Gem::Requirement
78
+ requirements:
79
+ - - ">="
80
+ - !ruby/object:Gem::Version
81
+ segments:
82
+ - 0
83
+ version: "0"
84
+ type: :runtime
85
+ version_requirements: *id005
86
+ - !ruby/object:Gem::Dependency
87
+ name: rspec
88
+ prerelease: false
89
+ requirement: &id006 !ruby/object:Gem::Requirement
78
90
  requirements:
79
91
  - - ">="
80
92
  - !ruby/object:Gem::Version
@@ -84,11 +96,11 @@ dependencies:
84
96
  - 9
85
97
  version: 1.2.9
86
98
  type: :development
87
- version_requirements: *id005
99
+ version_requirements: *id006
88
100
  - !ruby/object:Gem::Dependency
89
101
  name: mocha
90
102
  prerelease: false
91
- requirement: &id006 !ruby/object:Gem::Requirement
103
+ requirement: &id007 !ruby/object:Gem::Requirement
92
104
  requirements:
93
105
  - - ">="
94
106
  - !ruby/object:Gem::Version
@@ -98,11 +110,11 @@ dependencies:
98
110
  - 9
99
111
  version: 1.2.9
100
112
  type: :development
101
- version_requirements: *id006
113
+ version_requirements: *id007
102
114
  - !ruby/object:Gem::Dependency
103
115
  name: ruby-debug
104
116
  prerelease: false
105
- requirement: &id007 !ruby/object:Gem::Requirement
117
+ requirement: &id008 !ruby/object:Gem::Requirement
106
118
  requirements:
107
119
  - - ">="
108
120
  - !ruby/object:Gem::Version
@@ -110,7 +122,7 @@ dependencies:
110
122
  - 0
111
123
  version: "0"
112
124
  type: :development
113
- version_requirements: *id007
125
+ version_requirements: *id008
114
126
  description: ActiveFedora provides for creating and managing objects in the Fedora Repository Architecture.
115
127
  email: matt.zumwalt@yourmediashelf.com
116
128
  executables: []
@@ -312,6 +324,9 @@ files:
312
324
  - lib/fedora/formats.rb
313
325
  - lib/fedora/generic_search.rb
314
326
  - lib/fedora/repository.rb
327
+ - lib/hydra.rb
328
+ - lib/hydra_libs/mods_datastream.rb
329
+ - lib/hydra_libs/opinionated_mods_document.rb
315
330
  - lib/ruby-fedora.rb
316
331
  - lib/util/class_level_inheritable_attributes.rb
317
332
  - script/console
@@ -363,6 +378,8 @@ files:
363
378
  - spec/unit/inheritance_spec.rb
364
379
  - spec/unit/metadata_datastream_spec.rb
365
380
  - spec/unit/model_spec.rb
381
+ - spec/unit/mods_datastream_spec.rb
382
+ - spec/unit/nokogiri_datastream_spec.rb
366
383
  - spec/unit/property_spec.rb
367
384
  - spec/unit/qualified_dublin_core_datastream_spec.rb
368
385
  - spec/unit/relationship_spec.rb
@@ -441,6 +458,8 @@ test_files:
441
458
  - spec/unit/inheritance_spec.rb
442
459
  - spec/unit/metadata_datastream_spec.rb
443
460
  - spec/unit/model_spec.rb
461
+ - spec/unit/mods_datastream_spec.rb
462
+ - spec/unit/nokogiri_datastream_spec.rb
444
463
  - spec/unit/property_spec.rb
445
464
  - spec/unit/qualified_dublin_core_datastream_spec.rb
446
465
  - spec/unit/relationship_spec.rb