mods 0.0.6 → 0.0.7

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.
@@ -37,6 +37,7 @@ TODO: Write usage instructions here
37
37
 
38
38
  == Releases
39
39
 
40
+ 0.0.7 implement part
40
41
  0.0.6 implement recordInfo, fix to work under jruby
41
42
  0.0.5 implement subject, change a few constants
42
43
  0.0.4 implement language, location, origin_info, physical_description
@@ -259,6 +259,42 @@ module Mods
259
259
  end
260
260
  end
261
261
 
262
+ # PART -----------------------------------------------------------------------------------
263
+ t.part :path => '/mods/part' do |n|
264
+ # attributes
265
+ n.id_at :path => '@ID', :accessor => lambda { |a| a.text }
266
+ n.order :path => '@order', :accessor => lambda { |a| a.text }
267
+ n.type_at :path => '@type', :accessor => lambda { |a| a.text }
268
+ # child elements
269
+ n.detail :path => 'detail' do |e|
270
+ # attributes
271
+ e.level :path => '@level', :accessor => lambda { |a| a.text }
272
+ e.type_at :path => '@type', :accessor => lambda { |a| a.text }
273
+ # elements
274
+ e.number :path => 'number'
275
+ e.caption :path => 'caption'
276
+ e.title :path => 'title'
277
+ end
278
+ n.extent :path => 'extent' do |e| # TODO: extent is ordered in xml schema
279
+ # attributes
280
+ e.unit :path => '@unit', :accessor => lambda { |a| a.text }
281
+ # elements
282
+ e.start :path => 'start'
283
+ e.end :path => 'end'
284
+ e.total :path => 'total'
285
+ e.list :path => 'list'
286
+ end
287
+ n.date :path => 'date' do |e| # TODO: extent is ordered in xml schema
288
+ Mods::DATE_ATTRIBS.reject { |a| a == 'keyDate' }.each { |attr_name|
289
+ e.send attr_name, :path => "@#{attr_name}", :accessor => lambda { |a| a.text }
290
+ }
291
+ end
292
+ n.text_el :path => 'text' do |e|
293
+ e.displayLabel :path => '@displayLabel', :accessor => lambda { |a| a.text }
294
+ e.type_at :path => '@type', :accessor => lambda { |a| a.text }
295
+ end
296
+ end
297
+
262
298
  # RECORD_INFO --------------------------------------------------------------------------
263
299
  t.record_info :path => '/mods/recordInfo'
264
300
  t._record_info :path => '//recordInfo' do |n|
@@ -1,4 +1,4 @@
1
1
  module Mods
2
2
  # this is the Ruby Gem version
3
- VERSION = "0.0.6"
3
+ VERSION = "0.0.7"
4
4
  end
@@ -0,0 +1,236 @@
1
+ require 'spec_helper'
2
+
3
+ describe "Mods <part> Element" do
4
+ before(:all) do
5
+ @mods_rec = Mods::Record.new
6
+ @ex = @mods_rec.from_str('<mods><part>
7
+ <detail>
8
+ <title>Wayfarers (Poem)</title>
9
+ </detail>
10
+ <extent unit="pages">
11
+ <start>97</start>
12
+ <end>98</end>
13
+ </extent>
14
+ </part></mods>').part
15
+ @ex2 = @mods_rec.from_str('<mods><part>
16
+ <detail type="page number">
17
+ <number>3</number>
18
+ </detail>
19
+ <extent unit="pages">
20
+ <start>3</start>
21
+ </extent>
22
+ </part></mods>').part
23
+ @detail = @mods_rec.from_str('<mods><part>
24
+ <detail type="issue">
25
+ <number>1</number>
26
+ <caption>no.</caption>
27
+ </detail>
28
+ </part></mods>').part
29
+ end
30
+
31
+ it "should normalize dates" do
32
+ pending "to be implemented"
33
+ end
34
+
35
+ context "basic <part> terminology pieces" do
36
+ it "should be a NodeSet" do
37
+ [@ex, @ex2, @detail].each { |p| p.should be_an_instance_of(Nokogiri::XML::NodeSet) }
38
+ end
39
+ it "should have as many members as there are <part> elements in the xml" do
40
+ [@ex, @ex2, @detail].each { |p| p.size.should == 1 }
41
+ end
42
+ it "should recognize type(_at) attribute on <part> element" do
43
+ @mods_rec.from_str("<mods><part type='val'>anything</part></mods>")
44
+ @mods_rec.part.type_at.should == ['val']
45
+ end
46
+ it "should recognize order attribute on <part> element" do
47
+ @mods_rec.from_str("<mods><part order='val'>anything</part></mods>")
48
+ @mods_rec.part.order.should == ['val']
49
+ end
50
+ it "should recognize ID attribute on <part> element as id_at term" do
51
+ @mods_rec.from_str("<mods><part ID='val'>anything</part></mods>")
52
+ @mods_rec.part.id_at.should == ['val']
53
+ end
54
+
55
+ context "<detail> child element" do
56
+ it "should be a NodeSet" do
57
+ [@ex, @ex2, @detail].each { |p| p.detail.should be_an_instance_of(Nokogiri::XML::NodeSet) }
58
+ end
59
+ it "detail NodeSet should have as many Nodes as there are <detail> elements in the xml" do
60
+ [@ex, @ex2, @detail].each { |p| p.detail.size.should == 1 }
61
+ end
62
+ it "should recognize type(_at) attribute on <detail> element" do
63
+ @ex2.detail.type_at.should == ['page number']
64
+ @detail.detail.type_at.should == ['issue']
65
+ end
66
+ it "should recognize level attribute on <detail> element" do
67
+ @mods_rec.from_str("<mods><part><detail level='val'>anything</detail></part></mods>")
68
+ @mods_rec.part.detail.level.should == ['val']
69
+ end
70
+ context "<number> child element" do
71
+ it "should be a NodeSet" do
72
+ [@ex, @ex2, @detail].each { |p| p.detail.number.should be_an_instance_of(Nokogiri::XML::NodeSet) }
73
+ end
74
+ it "number NodeSet should have as many Nodes as there are <number> elements in the xml" do
75
+ [@ex2, @detail].each { |p| p.detail.number.size.should == 1 }
76
+ @ex.detail.number.size.should == 0
77
+ end
78
+ it "text should get element value" do
79
+ @ex2.detail.number.map { |n| n.text }.should == ['3']
80
+ @detail.detail.number.map { |n| n.text }.should == ['1']
81
+ end
82
+ end # <number>
83
+ context "<caption> child element" do
84
+ before(:all) do
85
+ @mods_rec.from_str("<mods><part><detail><caption>anything</caption></detail></part></mods>")
86
+ @caption = @mods_rec.part.detail.caption
87
+ end
88
+ it "should be a NodeSet" do
89
+ [@ex, @ex2, @detail].each { |p| p.detail.caption.should be_an_instance_of(Nokogiri::XML::NodeSet) }
90
+ @caption.should be_an_instance_of(Nokogiri::XML::NodeSet)
91
+ end
92
+ it "caption NodeSet should have as many Nodes as there are <caption> elements in the xml" do
93
+ [@ex, @ex2].each { |p| p.detail.caption.size.should == 0 }
94
+ @detail.detail.caption.size.should == 1
95
+ @caption.size.should == 1
96
+ end
97
+ it "text should get element value" do
98
+ @detail.detail.caption.map { |n| n.text }.should == ['no.']
99
+ @caption.map { |n| n.text }.should == ['anything']
100
+ end
101
+ end # <caption>
102
+ context "<title> child element" do
103
+ it "should be a NodeSet" do
104
+ [@ex, @ex2, @detail].each { |p| p.detail.title.should be_an_instance_of(Nokogiri::XML::NodeSet) }
105
+ end
106
+ it "title NodeSet should have as many Nodes as there are <title> elements in the xml" do
107
+ @ex.detail.title.size.should == 1
108
+ [@ex2, @detail].each { |p| p.detail.title.size.should == 0 }
109
+ end
110
+ it "text should get element value" do
111
+ @ex.detail.title.map { |n| n.text }.should == ['Wayfarers (Poem)']
112
+ [@ex2, @detail].each { |p| p.detail.title.map { |n| n.text }.should == [] }
113
+ end
114
+ end # <title>
115
+ end # <detail>
116
+
117
+ context "<extent> child element" do
118
+ it "should be a NodeSet" do
119
+ [@ex, @ex2, @detail].each { |p| p.extent.should be_an_instance_of(Nokogiri::XML::NodeSet) }
120
+ end
121
+ it "extent NodeSet should have as many Nodes as there are <extent> elements in the xml" do
122
+ [@ex, @ex2].each { |p| p.extent.size.should == 1 }
123
+ @detail.extent.size.should == 0
124
+ end
125
+ it "should recognize unit attribute on <extent> element" do
126
+ [@ex, @ex2].each { |p| p.extent.unit.should == ['pages'] }
127
+ end
128
+ context "<start> child element" do
129
+ it "should be a NodeSet" do
130
+ [@ex, @ex2, @detail].each { |p| p.extent.start.should be_an_instance_of(Nokogiri::XML::NodeSet) }
131
+ end
132
+ it "start NodeSet should have as many Nodes as there are <start> elements in the xml" do
133
+ [@ex, @ex2].each { |p| p.extent.start.size.should == 1 }
134
+ @detail.extent.start.size.should == 0
135
+ end
136
+ it "text should get element value" do
137
+ @ex.extent.start.map { |n| n.text }.should == ['97']
138
+ @ex2.extent.start.map { |n| n.text }.should == ['3']
139
+ end
140
+ end # <start>
141
+ context "<end> child element" do
142
+ it "should be a NodeSet" do
143
+ [@ex, @ex2, @detail].each { |p| p.extent.end.should be_an_instance_of(Nokogiri::XML::NodeSet) }
144
+ end
145
+ it "end NodeSet should have as many Nodes as there are <end> elements in the xml" do
146
+ @ex.extent.end.size.should == 1
147
+ [@ex2, @detail].each { |p| p.extent.end.size.should == 0 }
148
+ end
149
+ it "text should get element value" do
150
+ @ex.extent.end.map { |n| n.text }.should == ['98']
151
+ end
152
+ end # <end>
153
+ context "<total> child element" do
154
+ before(:all) do
155
+ @mods_rec.from_str("<mods><part><extent><total>anything</total></extent></part></mods>")
156
+ @total = @mods_rec.part.extent.total
157
+ end
158
+ it "should be a NodeSet" do
159
+ [@ex, @ex2, @detail].each { |p| p.extent.total.should be_an_instance_of(Nokogiri::XML::NodeSet) }
160
+ @total.should be_an_instance_of(Nokogiri::XML::NodeSet)
161
+ end
162
+ it "total NodeSet should have as many Nodes as there are <total> elements in the xml" do
163
+ [@ex, @ex2, @detail].each { |p| p.extent.total.size.should == 0 }
164
+ @total.size.should == 1
165
+ end
166
+ it "text should get element value" do
167
+ @total.map { |n| n.text }.should == ['anything']
168
+ end
169
+ end # <total>
170
+ context "<list> child element" do
171
+ before(:all) do
172
+ @mods_rec.from_str("<mods><part><extent><list>anything</list></extent></part></mods>")
173
+ @list = @mods_rec.part.extent.list
174
+ end
175
+ it "should be a NodeSet" do
176
+ [@ex, @ex2, @detail].each { |p| p.extent.list.should be_an_instance_of(Nokogiri::XML::NodeSet) }
177
+ @list.should be_an_instance_of(Nokogiri::XML::NodeSet)
178
+ end
179
+ it "list NodeSet should have as many Nodes as there are <list> elements in the xml" do
180
+ [@ex, @ex2, @detail].each { |p| p.extent.list.size.should == 0 }
181
+ @list.size.should == 1
182
+ end
183
+ it "text should get element value" do
184
+ @list.map { |n| n.text }.should == ['anything']
185
+ end
186
+ end # <list>
187
+ end # <extent>
188
+
189
+ context "<date> child element" do
190
+ before(:all) do
191
+ @date = @mods_rec.from_str('<mods><part><date encoding="w3cdtf">1999</date></part></mods').part.date
192
+ end
193
+ it "should be a NodeSet" do
194
+ [@ex, @ex2, @detail].each { |p| p.date.should be_an_instance_of(Nokogiri::XML::NodeSet) }
195
+ @date.should be_an_instance_of(Nokogiri::XML::NodeSet)
196
+ end
197
+ it "extent NodeSet should have as many Nodes as there are <extent> elements in the xml" do
198
+ [@ex, @ex2, @detail].each { |p| p.date.size.should == 0 }
199
+ @date.size.should == 1
200
+ end
201
+ it "should recognize all date attributes except keyDate" do
202
+ Mods::DATE_ATTRIBS.reject { |n| n == 'keyDate' }.each { |a|
203
+ @mods_rec.from_str("<mods><part><date #{a}='attr_val'>zzz</date></part></mods>")
204
+ @mods_rec.part.date.send(a.to_sym).should == ['attr_val']
205
+ }
206
+ end
207
+ it "should not recognize keyDate attribute" do
208
+ @mods_rec.from_str("<mods><part><date keyDate='yes'>zzz</date></part></mods>")
209
+ expect { @mods_rec.part.date.keyDate }.to raise_error(NoMethodError, /undefined method.*keyDate/)
210
+ end
211
+ end # <date>
212
+
213
+ context "<text> child element as .text_el term" do
214
+ before(:all) do
215
+ @text_ns = @mods_rec.from_str('<mods><part><text encoding="w3cdtf">1999</text></part></mods').part.text_el
216
+ end
217
+ it "should be a NodeSet" do
218
+ [@ex, @ex2, @detail].each { |p| p.text_el.should be_an_instance_of(Nokogiri::XML::NodeSet) }
219
+ @text_ns.should be_an_instance_of(Nokogiri::XML::NodeSet)
220
+ end
221
+ it "text_el NodeSet should have as many Nodes as there are <text> elements in the xml" do
222
+ [@ex, @ex2, @detail].each { |p| p.text_el.size.should == 0 }
223
+ @text_ns.size.should == 1
224
+ end
225
+ it "should recognize displayLabel attribute" do
226
+ @mods_rec.from_str("<mods><part><text displayLabel='foo'>zzz</text></part></mods>")
227
+ @mods_rec.part.text_el.displayLabel.should == ['foo']
228
+ end
229
+ it "should recognize type(_at) attribute on <text> element" do
230
+ @mods_rec.from_str("<mods><part><text type='bar'>anything</text></part></mods>")
231
+ @mods_rec.part.text_el.type_at.should == ['bar']
232
+ end
233
+ end # <text>
234
+
235
+ end # basic <part> terminoology
236
+ end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: mods
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.6
4
+ version: 0.0.7
5
5
  prerelease:
6
6
  platform: ruby
7
7
  authors:
@@ -10,7 +10,7 @@ authors:
10
10
  autorequire:
11
11
  bindir: bin
12
12
  cert_chain: []
13
- date: 2012-11-09 00:00:00.000000000 Z
13
+ date: 2012-11-10 00:00:00.000000000 Z
14
14
  dependencies:
15
15
  - !ruby/object:Gem::Dependency
16
16
  name: nokogiri
@@ -190,6 +190,7 @@ files:
190
190
  - spec/location_spec.rb
191
191
  - spec/name_spec.rb
192
192
  - spec/origin_info_spec.rb
193
+ - spec/part_spec.rb
193
194
  - spec/physical_description_spec.rb
194
195
  - spec/reader_spec.rb
195
196
  - spec/record_info_spec.rb
@@ -211,7 +212,7 @@ required_ruby_version: !ruby/object:Gem::Requirement
211
212
  version: '0'
212
213
  segments:
213
214
  - 0
214
- hash: 400692064805909387
215
+ hash: 2974692396202214908
215
216
  required_rubygems_version: !ruby/object:Gem::Requirement
216
217
  none: false
217
218
  requirements:
@@ -220,7 +221,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
220
221
  version: '0'
221
222
  segments:
222
223
  - 0
223
- hash: 400692064805909387
224
+ hash: 2974692396202214908
224
225
  requirements: []
225
226
  rubyforge_project:
226
227
  rubygems_version: 1.8.24
@@ -232,6 +233,7 @@ test_files:
232
233
  - spec/location_spec.rb
233
234
  - spec/name_spec.rb
234
235
  - spec/origin_info_spec.rb
236
+ - spec/part_spec.rb
235
237
  - spec/physical_description_spec.rb
236
238
  - spec/reader_spec.rb
237
239
  - spec/record_info_spec.rb