mods 0.0.15 → 0.0.16

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.
data/.gitignore CHANGED
@@ -20,3 +20,4 @@ tmp
20
20
  *.tmproj
21
21
  tmtags
22
22
  .idea/*
23
+ to_delete
@@ -37,6 +37,7 @@ TODO: Write usage instructions here
37
37
 
38
38
  == Releases
39
39
 
40
+ 0.0.16 add role convenience methods (within name node)
40
41
  0.0.15 make namespace aware processing the default
41
42
  0.0.14 don't lose xml encoding in reader.normalize_mods under jruby
42
43
  0.0.13 really really fix removal of xsi:schemaLocation in jruby
@@ -131,12 +131,49 @@ module Mods
131
131
  n.displayForm :path => 'displayForm'
132
132
  n.affiliation :path => 'affiliation'
133
133
  n.description_el :path => 'description' # description is used by Nokogiri
134
- n.role :path => 'role/roleTerm' do |r|
135
- r.type_at :path => "@type", :accessor => lambda { |a| a.text }
136
- Mods::AUTHORITY_ATTRIBS.each { |attr_name|
137
- r.send attr_name, :path => "@#{attr_name}", :accessor => lambda { |a| a.text }
134
+ n.role :path => 'role' do |r|
135
+ r.roleTerm :path => 'roleTerm' do |rt|
136
+ rt.type_at :path => "@type", :accessor => lambda { |a| a.text }
137
+ Mods::AUTHORITY_ATTRIBS.each { |attr_name|
138
+ rt.send attr_name, :path => "@#{attr_name}", :accessor => lambda { |a| a.text }
139
+ }
140
+ end
141
+ # convenience method
142
+ r.authority :path => '.', :accessor => lambda { |role_node|
143
+ a = nil
144
+ role_node.roleTerm.each { |role_t|
145
+ # role_t.authority will be [] if it is missing from an earlier roleTerm
146
+ if role_t.authority && (!a || a.size == 0)
147
+ a = role_t.authority
148
+ end
149
+ }
150
+ a
151
+ }
152
+ # convenience method
153
+ r.code :path => '.', :accessor => lambda { |role_node|
154
+ c = nil
155
+ role_node.roleTerm.each { |role_t|
156
+ if role_t.type_at == 'code'
157
+ c ||= role_t.text
158
+ end
159
+ }
160
+ c
161
+ }
162
+ # convenience method
163
+ r.value :path => '.', :accessor => lambda { |role_node|
164
+ val = nil
165
+ role_node.roleTerm.each { |role_t|
166
+ if role_t.type_at == 'text'
167
+ val ||= role_t.text
168
+ end
169
+ }
170
+ # FIXME: this is broken if there are multiple role codes and some of them are not marcrelator
171
+ if !val && role_node.code && role_node.authority.first =~ /marcrelator/
172
+ val = MARC_RELATOR[role_node.code.first]
173
+ end
174
+ val
138
175
  }
139
- end
176
+ end # role node
140
177
  end # t._plain_name
141
178
 
142
179
  t.personal_name :path => '/mods/name[@type="personal"]'
@@ -583,12 +620,49 @@ module Mods
583
620
  n.displayForm :path => 'm:displayForm'
584
621
  n.affiliation :path => 'm:affiliation'
585
622
  n.description_el :path => 'm:description' # description is used by Nokogiri
586
- n.role :path => 'm:role/m:roleTerm' do |r|
587
- r.type_at :path => "@type", :accessor => lambda { |a| a.text }
588
- Mods::AUTHORITY_ATTRIBS.each { |attr_name|
589
- r.send attr_name, :path => "@#{attr_name}", :accessor => lambda { |a| a.text }
623
+ n.role :path => 'm:role' do |r|
624
+ r.roleTerm :path => 'm:roleTerm' do |rt|
625
+ rt.type_at :path => "@type", :accessor => lambda { |a| a.text }
626
+ Mods::AUTHORITY_ATTRIBS.each { |attr_name|
627
+ rt.send attr_name, :path => "@#{attr_name}", :accessor => lambda { |a| a.text }
628
+ }
629
+ end
630
+ # convenience method
631
+ r.authority :path => '.', :accessor => lambda { |role_node|
632
+ a = nil
633
+ role_node.roleTerm.each { |role_t|
634
+ # role_t.authority will be [] if it is missing from an earlier roleTerm
635
+ if role_t.authority && (!a || a.size == 0)
636
+ a = role_t.authority
637
+ end
638
+ }
639
+ a
640
+ }
641
+ # convenience method
642
+ r.code :path => '.', :accessor => lambda { |role_node|
643
+ c = nil
644
+ role_node.roleTerm.each { |role_t|
645
+ if role_t.type_at == 'code'
646
+ c ||= role_t.text
647
+ end
648
+ }
649
+ c
650
+ }
651
+ # convenience method
652
+ r.value :path => '.', :accessor => lambda { |role_node|
653
+ val = nil
654
+ role_node.roleTerm.each { |role_t|
655
+ if role_t.type_at == 'text'
656
+ val ||= role_t.text
657
+ end
658
+ }
659
+ # FIXME: this is broken if there are multiple role codes and some of them are not marcrelator
660
+ if !val && role_node.code && role_node.authority.first =~ /marcrelator/
661
+ val = MARC_RELATOR[role_node.code.first]
662
+ end
663
+ val
590
664
  }
591
- end
665
+ end # role node
592
666
  end # t._plain_name
593
667
 
594
668
  t.personal_name :path => '/m:mods/m:name[@type="personal"]'
@@ -880,23 +954,27 @@ module Mods
880
954
  n.nonSort :path => 'm:nonSort'
881
955
  n.partNumber :path => 'm:partNumber'
882
956
  n.partName :path => 'm:partName'
957
+ # convenience method
883
958
  n.sort_title :path => '.', :accessor => lambda { |node|
884
959
  if node.type_at != "alternative" || (node.type_at == "alternative" &&
885
960
  mods_ng_xml.xpath('/m:mods/m:titleInfo', {'m' => Mods::MODS_NS}).size == 1)
886
961
  node.title.text + (!node.subTitle.text.empty? ? "#{@title_delimiter}#{node.subTitle.text}" : "" )
887
962
  end
888
963
  }
964
+ # convenience method
889
965
  n.full_title :path => '.', :accessor => lambda { |node|
890
966
  (!node.nonSort.text.empty? ? "#{node.nonSort.text} " : "" ) +
891
967
  node.title.text +
892
968
  (!node.subTitle.text.empty? ? "#{@title_delimiter}#{node.subTitle.text}" : "" )
893
969
  }
970
+ # convenience method
894
971
  n.short_title :path => '.', :accessor => lambda { |node|
895
972
  if node.type_at != "alternative"
896
973
  (!node.nonSort.text.empty? ? "#{node.nonSort.text} " : "" ) +
897
974
  node.title.text
898
975
  end
899
976
  }
977
+ # convenience method
900
978
  n.alternative_title :path => '.', :accessor => lambda { |node|
901
979
  if node.type_at == "alternative"
902
980
  (!node.nonSort.text.empty? ? "#{node.nonSort.text} " : "" ) +
@@ -1,4 +1,4 @@
1
1
  module Mods
2
2
  # this is the Ruby Gem version
3
- VERSION = "0.0.15"
3
+ VERSION = "0.0.16"
4
4
  end
@@ -35,5 +35,5 @@ Gem::Specification.new do |gem|
35
35
  gem.add_development_dependency 'simplecov'
36
36
  gem.add_development_dependency 'simplecov-rcov'
37
37
  # gem.add_development_dependency 'ruby-debug19'
38
-
38
+ gem.add_development_dependency 'equivalent-xml'
39
39
  end
@@ -7,38 +7,31 @@ describe "Mods <name> Element" do
7
7
  @ns_decl = "xmlns='#{Mods::MODS_NS}'"
8
8
 
9
9
  @corp_name = 'ABC corp'
10
- @mods_w_corp_name = "<mods><name type='corporate'><namePart>#{@corp_name}</namePart></name></mods>"
11
10
  @mods_w_corp_name_ns = "<mods #{@ns_decl}><name type='corporate'><namePart>#{@corp_name}</namePart></name></mods>"
12
- @mods_w_corp_name_role = "<mods><name type='corporate'><namePart>#{@corp_name}</namePart>
13
- <role><roleTerm type='text'>lithographer</roleTerm></role></name></mods>"
11
+ @mods_w_corp_name = @mods_w_corp_name_ns.sub(" #{@ns_decl}", '')
14
12
  @mods_w_corp_name_role_ns = "<mods #{@ns_decl}><name type='corporate'><namePart>#{@corp_name}</namePart>
15
13
  <role><roleTerm type='text'>lithographer</roleTerm></role></name></mods>"
14
+ @mods_w_corp_name_role = @mods_w_corp_name_role_ns.sub(" #{@ns_decl}", '')
15
+
16
16
  @pers_name = 'Crusty'
17
- @mods_w_pers_name = "<mods><name type='personal'><namePart>#{@pers_name}</namePart></name></mods>"
18
17
  @mods_w_pers_name_ns = "<mods #{@ns_decl}><name type='personal'><namePart>#{@pers_name}</namePart></name></mods>"
19
- @mods_w_both = "<mods>
20
- <name type='corporate'><namePart>#{@corp_name}</namePart></name>
21
- <name type='personal'><namePart>#{@pers_name}</namePart></name></mods>"
18
+ @mods_w_pers_name = @mods_w_pers_name_ns.sub(" #{@ns_decl}", '')
22
19
  @mods_w_both_ns = "<mods #{@ns_decl}>
23
20
  <name type='corporate'><namePart>#{@corp_name}</namePart></name>
24
21
  <name type='personal'><namePart>#{@pers_name}</namePart></name></mods>"
22
+ @mods_w_both = @mods_w_both_ns.sub(" #{@ns_decl}", '')
23
+
25
24
  @pers_role = 'creator'
26
- @mods_w_pers_name_role = "<mods><name type='personal'><namePart>#{@pers_name}</namePart>
27
- <role><roleTerm authority='marcrelator' type='text'>#{@pers_role}</roleTerm><role></name></mods>"
28
25
  @mods_w_pers_name_role_ns = "<mods #{@ns_decl}><name type='personal'><namePart>#{@pers_name}</namePart>
29
26
  <role><roleTerm authority='marcrelator' type='text'>#{@pers_role}</roleTerm><role></name></mods>"
30
- @mods_w_pers_name_role_code = "<mods><name type='personal'><namePart type='given'>John</namePart>
31
- <namePart type='family'>Huston</namePart>
32
- <role>
33
- <roleTerm type='code' authority='marcrelator'>drt</roleTerm>
34
- </role>
35
- </name></mods>"
27
+ @mods_w_pers_name_role = @mods_w_pers_name_role_ns.sub(" #{@ns_decl}", '')
36
28
  @mods_w_pers_name_role_code_ns = "<mods #{@ns_decl}><name type='personal'><namePart type='given'>John</namePart>
37
29
  <namePart type='family'>Huston</namePart>
38
30
  <role>
39
31
  <roleTerm type='code' authority='marcrelator'>drt</roleTerm>
40
32
  </role>
41
33
  </name></mods>"
34
+ @mods_w_pers_name_role_code = @mods_w_pers_name_role_code_ns.sub(" #{@ns_decl}", '')
42
35
  end
43
36
 
44
37
  context "personal name" do
@@ -68,17 +61,17 @@ describe "Mods <name> Element" do
68
61
  context "roles" do
69
62
  it "should be possible to access a personal_name role easily" do
70
63
  @mods_rec.from_str(@mods_w_pers_name_role_ns)
71
- @mods_rec.personal_name.role.text.should include(@pers_role)
64
+ @mods_rec.personal_name.role.roleTerm.text.should include(@pers_role)
72
65
  end
73
66
  it "should get role type" do
74
67
  @mods_rec.from_str(@mods_w_pers_name_role_ns)
75
- @mods_rec.personal_name.role.type_at.should == ["text"]
68
+ @mods_rec.personal_name.role.roleTerm.type_at.should == ["text"]
76
69
  @mods_rec.from_str(@mods_w_pers_name_role_code_ns)
77
- @mods_rec.personal_name.role.type_at.should == ["code"]
70
+ @mods_rec.personal_name.role.roleTerm.type_at.should == ["code"]
78
71
  end
79
72
  it "should get role authority" do
80
73
  @mods_rec.from_str(@mods_w_pers_name_role_ns)
81
- @mods_rec.personal_name.role.authority.should == ["marcrelator"]
74
+ @mods_rec.personal_name.role.roleTerm.authority.should == ["marcrelator"]
82
75
  end
83
76
  end # roles
84
77
  end # WITH namespaces
@@ -112,13 +105,13 @@ describe "Mods <name> Element" do
112
105
  end
113
106
  it "should get role type" do
114
107
  @mods_rec.from_str(@mods_w_pers_name_role, false)
115
- @mods_rec.personal_name.role.type_at.should == ["text"]
108
+ @mods_rec.personal_name.role.roleTerm.type_at.should == ["text"]
116
109
  @mods_rec.from_str(@mods_w_pers_name_role_code, false)
117
- @mods_rec.personal_name.role.type_at.should == ["code"]
110
+ @mods_rec.personal_name.role.roleTerm.type_at.should == ["code"]
118
111
  end
119
112
  it "should get role authority" do
120
113
  @mods_rec.from_str(@mods_w_pers_name_role, false)
121
- @mods_rec.personal_name.role.authority.should == ["marcrelator"]
114
+ @mods_rec.personal_name.role.roleTerm.authority.should == ["marcrelator"]
122
115
  end
123
116
  end # roles
124
117
  end # WITHOUT namespaces
@@ -127,12 +120,6 @@ describe "Mods <name> Element" do
127
120
 
128
121
  end # personal name
129
122
 
130
- context "sort_author" do
131
- it "should do something" do
132
- pending "sort_author to be implemented (choose creator if present ... )"
133
- end
134
- end
135
-
136
123
  context "corporate name" do
137
124
  context "WITH namespaces" do
138
125
  it "should recognize child elements" do
@@ -218,13 +205,13 @@ describe "Mods <name> Element" do
218
205
  context "role child element" do
219
206
  it "should get role type" do
220
207
  @mods_rec.from_str(@mods_w_pers_name_role_ns)
221
- @mods_rec.plain_name.role.type_at.should == ["text"]
208
+ @mods_rec.plain_name.role.roleTerm.type_at.should == ["text"]
222
209
  @mods_rec.from_str(@mods_w_pers_name_role_code_ns)
223
- @mods_rec.plain_name.role.type_at.should == ["code"]
210
+ @mods_rec.plain_name.role.roleTerm.type_at.should == ["code"]
224
211
  end
225
212
  it "should get role authority" do
226
213
  @mods_rec.from_str(@mods_w_pers_name_role_ns)
227
- @mods_rec.plain_name.role.authority.should == ["marcrelator"]
214
+ @mods_rec.plain_name.role.roleTerm.authority.should == ["marcrelator"]
228
215
  end
229
216
  end
230
217
 
@@ -262,22 +249,250 @@ describe "Mods <name> Element" do
262
249
  context "role child element" do
263
250
  it "should get role type" do
264
251
  @mods_rec.from_str(@mods_w_pers_name_role, false)
265
- @mods_rec.plain_name.role.type_at.should == ["text"]
252
+ @mods_rec.plain_name.role.roleTerm.type_at.should == ["text"]
266
253
  @mods_rec.from_str(@mods_w_pers_name_role_code, false)
267
- @mods_rec.plain_name.role.type_at.should == ["code"]
254
+ @mods_rec.plain_name.role.roleTerm.type_at.should == ["code"]
268
255
  end
269
256
  it "should get role authority" do
270
257
  @mods_rec.from_str(@mods_w_pers_name_role, false)
271
- @mods_rec.plain_name.role.authority.should == ["marcrelator"]
258
+ @mods_rec.plain_name.role.roleTerm.authority.should == ["marcrelator"]
272
259
  end
273
260
  end
274
261
  end # context WITHOUT namespaces
275
262
 
276
263
  end # plain name
277
-
278
264
 
279
265
  it "should be able to translate the marc relator code into text" do
280
266
  MARC_RELATOR['drt'].should == "Director"
281
267
  end
282
268
 
269
+ context "roles" do
270
+ before(:all) do
271
+ @xml_w_code = "<mods #{@ns_decl}><name><namePart>Alfred Hitchock</namePart>
272
+ <role><roleTerm type='code' authority='marcrelator'>drt</roleTerm></role>
273
+ </name></mods>"
274
+ @xml_w_text = "<mods #{@ns_decl}><name><namePart>Sean Connery</namePart>
275
+ <role><roleTerm type='text' authority='marcrelator'>Actor</roleTerm></role>
276
+ </name></mods>"
277
+ @xml_wo_authority = "<mods #{@ns_decl}><name><namePart>Exciting Prints</namePart>
278
+ <role><roleTerm type='text'>lithographer</roleTerm></role>
279
+ </name></mods>"
280
+ @xml_w_both = "<mods #{@ns_decl}><name><namePart>anyone</namePart>
281
+ <role>
282
+ <roleTerm type='text' authority='marcrelator'>CreatorFake</roleTerm>
283
+ <roleTerm type='code' authority='marcrelator'>cre</roleTerm>
284
+ </role>
285
+ </name></mods>"
286
+ @xml_w_mult_roles = "<mods #{@ns_decl}><name><namePart>Fats Waller</namePart>
287
+ <role><roleTerm type='text'>Creator</roleTerm>
288
+ <roleTerm type='code' authority='marcrelator'>cre</roleTerm></role>
289
+ <role><roleTerm type='text'>Performer</roleTerm></role>
290
+ </name></mods>"
291
+ end
292
+
293
+ context "convenience methods WITH namespaces" do
294
+ before(:all) do
295
+ @mods_w_code = Mods::Record.new.from_str(@xml_w_code)
296
+ @mods_w_text = Mods::Record.new.from_str(@xml_w_text)
297
+ @mods_wo_authority = Mods::Record.new.from_str(@xml_wo_authority)
298
+ @mods_w_both = Mods::Record.new.from_str(@xml_w_both)
299
+ @mods_mult_roles = Mods::Record.new.from_str(@xml_w_mult_roles)
300
+ end
301
+ context "value" do
302
+ it "should be the value of a text roleTerm" do
303
+ @mods_w_text.plain_name.role.value.should == ["Actor"]
304
+ end
305
+ it "should be the translation of the code if it is a marcrelator code and there is no text roleTerm" do
306
+ @mods_w_code.plain_name.role.value.should == ["Director"]
307
+ end
308
+ it "should be the value of the text roleTerm if there are both a code and a text roleTerm" do
309
+ @mods_w_both.plain_name.role.value.should == ["CreatorFake"]
310
+ end
311
+ it "should have 2 values if there are 2 role elements" do
312
+ @mods_mult_roles.plain_name.role.value.should == ['Creator', 'Performer']
313
+ end
314
+ end
315
+ context "authority" do
316
+ it "should be empty if it is missing from xml" do
317
+ @mods_wo_authority.plain_name.role.authority.size.should == 0
318
+ end
319
+ it "should be the value of the authority attribute on the roleTerm element" do
320
+ @mods_w_code.plain_name.role.authority.should == ["marcrelator"]
321
+ @mods_w_text.plain_name.role.authority.should == ["marcrelator"]
322
+ @mods_w_both.plain_name.role.authority.should == ["marcrelator"]
323
+ end
324
+ end
325
+ context "code" do
326
+ it "should be empty if the roleTerm is not of type code" do
327
+ @mods_w_text.plain_name.role.code.size.should == 0
328
+ @mods_wo_authority.plain_name.role.code.size.should == 0
329
+ end
330
+ it "should be the value of the roleTerm element if element's type attribute is 'code'" do
331
+ @mods_w_code.plain_name.role.code.should == ["drt"]
332
+ @mods_w_both.plain_name.role.code.should == ["cre"]
333
+ end
334
+ end
335
+ context "pertaining to a specific name" do
336
+ before(:all) do
337
+ complex = "<mods #{@ns_decl}>
338
+ <name>
339
+ <namePart>Sean Connery</namePart>
340
+ <role><roleTerm type='code' authority='marcrelator'>drt</roleTerm></role>
341
+ </name>
342
+ <name>
343
+ <namePart>Pierce Brosnan</namePart>
344
+ <role>
345
+ <roleTerm type='text'>CreatorFake</roleTerm>
346
+ <roleTerm type='code' authority='marcrelator'>cre</roleTerm>
347
+ </role>
348
+ <role><roleTerm type='text' authority='marcrelator'>Actor</roleTerm></role>
349
+ </name>
350
+ <name>
351
+ <namePart>Daniel Craig</namePart>
352
+ <role>
353
+ <roleTerm type='text' authority='marcrelator'>Actor</roleTerm>
354
+ <roleTerm type='code' authority='marcrelator'>cre</roleTerm>
355
+ </role>
356
+ </name>
357
+ </mods>"
358
+ @mods_complex = Mods::Record.new.from_str(complex)
359
+ end
360
+ it "roles should be empty array when there is no role element" do
361
+ @mods_rec.from_str(@mods_w_pers_name_ns)
362
+ @mods_rec.personal_name.first.role.size.should == 0
363
+ end
364
+ it "object should have same number of roles as it has role nodes in xml" do
365
+ @mods_complex.plain_name[0].role.size.should == 1
366
+ @mods_complex.plain_name[1].role.size.should == 2
367
+ @mods_complex.plain_name[2].role.size.should == 1
368
+ end
369
+ context "name's roles should be correctly populated" do
370
+ it "text attribute" do
371
+ @mods_complex.plain_name[0].role.value.should == ['Director']
372
+ @mods_complex.plain_name[1].role.value.should == ['CreatorFake', 'Actor']
373
+ @mods_complex.plain_name[2].role.value.should == ['Actor']
374
+ end
375
+ it "code attribute" do
376
+ @mods_complex.plain_name[0].role.code.should == ['drt']
377
+ @mods_complex.plain_name[1].role.code.should == ['cre']
378
+ @mods_complex.plain_name[2].role.code.should == ['cre']
379
+ end
380
+ it "authority attribute" do
381
+ @mods_complex.plain_name[0].role.authority.should == ['marcrelator']
382
+ @mods_complex.plain_name[1].role.authority.should == ['marcrelator', 'marcrelator']
383
+ @mods_complex.plain_name[2].role.authority.should == ['marcrelator']
384
+ end
385
+ it "multiple roles" do
386
+ @mods_mult_roles.plain_name.first.role.value.should == ['Creator', 'Performer']
387
+ @mods_mult_roles.plain_name.first.role.code.should == ['cre']
388
+ @mods_mult_roles.plain_name.role.first.roleTerm.authority.first.should == 'marcrelator'
389
+ @mods_mult_roles.plain_name.role.last.roleTerm.authority.size.should == 0
390
+ end
391
+ end
392
+ end # pertaining to a specific name
393
+ end # roles WITH namespaces
394
+
395
+ context "convenience methods WITHOUT namespaces" do
396
+ before(:all) do
397
+ @mods_w_code = Mods::Record.new.from_str(@xml_w_code.sub(" #{@ns_decl}", ''), false)
398
+ @mods_w_text = Mods::Record.new.from_str(@xml_w_text.sub(" #{@ns_decl}", ''), false)
399
+ @mods_wo_authority = Mods::Record.new.from_str(@xml_wo_authority.sub(" #{@ns_decl}", ''), false)
400
+ @mods_w_both = Mods::Record.new.from_str(@xml_w_both.sub(" #{@ns_decl}", ''), false)
401
+ @mods_mult_roles = Mods::Record.new.from_str(@xml_w_mult_roles.sub(" #{@ns_decl}", ''), false)
402
+ end
403
+ context "value" do
404
+ it "should be the value of a text roleTerm" do
405
+ @mods_w_text.plain_name.role.value.should == ["Actor"]
406
+ end
407
+ it "should be the translation of the code if it is a marcrelator code and there is no text roleTerm" do
408
+ @mods_w_code.plain_name.role.value.should == ["Director"]
409
+ end
410
+ it "should be the value of the text roleTerm if there are both a code and a text roleTerm" do
411
+ @mods_w_both.plain_name.role.value.should == ["CreatorFake"]
412
+ end
413
+ it "should have 2 values if there are 2 role elements" do
414
+ @mods_mult_roles.plain_name.role.value.should == ['Creator', 'Performer']
415
+ end
416
+ end
417
+ context "authority" do
418
+ it "should be empty if it is missing from xml" do
419
+ @mods_wo_authority.plain_name.role.authority.size.should == 0
420
+ end
421
+ it "should be the value of the authority attribute on the roleTerm element" do
422
+ @mods_w_code.plain_name.role.authority.should == ["marcrelator"]
423
+ @mods_w_text.plain_name.role.authority.should == ["marcrelator"]
424
+ @mods_w_both.plain_name.role.authority.should == ["marcrelator"]
425
+ end
426
+ end
427
+ context "code" do
428
+ it "should be empty if the roleTerm is not of type code" do
429
+ @mods_w_text.plain_name.role.code.size.should == 0
430
+ @mods_wo_authority.plain_name.role.code.size.should == 0
431
+ end
432
+ it "should be the value of the roleTerm element if element's type attribute is 'code'" do
433
+ @mods_w_code.plain_name.role.code.should == ["drt"]
434
+ @mods_w_both.plain_name.role.code.should == ["cre"]
435
+ end
436
+ end
437
+ context "pertaining to a specific name" do
438
+ before(:all) do
439
+ complex = "<mods>
440
+ <name>
441
+ <namePart>Sean Connery</namePart>
442
+ <role><roleTerm type='code' authority='marcrelator'>drt</roleTerm></role>
443
+ </name>
444
+ <name>
445
+ <namePart>Pierce Brosnan</namePart>
446
+ <role>
447
+ <roleTerm type='text'>CreatorFake</roleTerm>
448
+ <roleTerm type='code' authority='marcrelator'>cre</roleTerm>
449
+ </role>
450
+ <role><roleTerm type='text' authority='marcrelator'>Actor</roleTerm></role>
451
+ </name>
452
+ <name>
453
+ <namePart>Daniel Craig</namePart>
454
+ <role>
455
+ <roleTerm type='text' authority='marcrelator'>Actor</roleTerm>
456
+ <roleTerm type='code' authority='marcrelator'>cre</roleTerm>
457
+ </role>
458
+ </name>
459
+ </mods>"
460
+ @mods_complex = Mods::Record.new.from_str(complex, false)
461
+ end
462
+ it "roles should be empty array when there is no role element" do
463
+ @mods_rec.from_str(@mods_w_pers_name_ns)
464
+ @mods_rec.personal_name.first.role.size.should == 0
465
+ end
466
+ it "object should have same number of roles as it has role nodes in xml" do
467
+ @mods_complex.plain_name[0].role.size.should == 1
468
+ @mods_complex.plain_name[1].role.size.should == 2
469
+ @mods_complex.plain_name[2].role.size.should == 1
470
+ end
471
+ context "name's roles should be correctly populated" do
472
+ it "text attribute" do
473
+ @mods_complex.plain_name[0].role.value.should == ['Director']
474
+ @mods_complex.plain_name[1].role.value.should == ['CreatorFake', 'Actor']
475
+ @mods_complex.plain_name[2].role.value.should == ['Actor']
476
+ end
477
+ it "code attribute" do
478
+ @mods_complex.plain_name[0].role.code.should == ['drt']
479
+ @mods_complex.plain_name[1].role.code.should == ['cre']
480
+ @mods_complex.plain_name[2].role.code.should == ['cre']
481
+ end
482
+ it "authority attribute" do
483
+ @mods_complex.plain_name[0].role.authority.should == ['marcrelator']
484
+ @mods_complex.plain_name[1].role.authority.should == ['marcrelator', 'marcrelator']
485
+ @mods_complex.plain_name[2].role.authority.should == ['marcrelator']
486
+ end
487
+ it "multiple roles" do
488
+ @mods_mult_roles.plain_name.first.role.value.should == ['Creator', 'Performer']
489
+ @mods_mult_roles.plain_name.first.role.code.should == ['cre']
490
+ @mods_mult_roles.plain_name.role.first.roleTerm.authority.first.should == 'marcrelator'
491
+ @mods_mult_roles.plain_name.role.last.roleTerm.authority.size.should == 0
492
+ end
493
+ end
494
+ end # pertaining to a specific name
495
+ end # WITHOUT namespaces
496
+ end # roles
497
+
283
498
  end
@@ -99,7 +99,7 @@ describe "Mods <subject> Element" do
99
99
  @pers_name_sub.personal_name.displayForm.map { |e| e.text }.should == ['Edward VI , king of England, 1537-1553']
100
100
  end
101
101
  it "should be able to identify roles associated with a name" do
102
- @mult_corp_name_sub.corporate_name.role.map { |e| e.text }.should == ['lithographers.']
102
+ @mult_corp_name_sub.corporate_name.role.roleTerm.map { |e| e.text }.should == ['lithographers.']
103
103
  end
104
104
  it "should be able to identify dates associated with a name" do
105
105
  @mult_pers_name_sub.personal_name.date.map { |e| e.text }.should include("1818-1878")
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.15
4
+ version: 0.0.16
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-26 00:00:00.000000000 Z
13
+ date: 2012-12-18 00:00:00.000000000 Z
14
14
  dependencies:
15
15
  - !ruby/object:Gem::Dependency
16
16
  name: nokogiri
@@ -156,6 +156,22 @@ dependencies:
156
156
  - - ! '>='
157
157
  - !ruby/object:Gem::Version
158
158
  version: '0'
159
+ - !ruby/object:Gem::Dependency
160
+ name: equivalent-xml
161
+ requirement: !ruby/object:Gem::Requirement
162
+ none: false
163
+ requirements:
164
+ - - ! '>='
165
+ - !ruby/object:Gem::Version
166
+ version: '0'
167
+ type: :development
168
+ prerelease: false
169
+ version_requirements: !ruby/object:Gem::Requirement
170
+ none: false
171
+ requirements:
172
+ - - ! '>='
173
+ - !ruby/object:Gem::Version
174
+ version: '0'
159
175
  description: Parse MODS (Metadata Object Description Schema) records. More information
160
176
  about MODS can be found at http://www.loc.gov/standards/mods/
161
177
  email:
@@ -214,7 +230,7 @@ required_ruby_version: !ruby/object:Gem::Requirement
214
230
  version: '0'
215
231
  segments:
216
232
  - 0
217
- hash: 3689606292418896094
233
+ hash: -1181909657495840648
218
234
  required_rubygems_version: !ruby/object:Gem::Requirement
219
235
  none: false
220
236
  requirements:
@@ -223,7 +239,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
223
239
  version: '0'
224
240
  segments:
225
241
  - 0
226
- hash: 3689606292418896094
242
+ hash: -1181909657495840648
227
243
  requirements: []
228
244
  rubyforge_project:
229
245
  rubygems_version: 1.8.24