mods 0.0.6 → 0.0.7

Sign up to get free protection for your applications and to get access to all the features.
@@ -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