mods 0.0.14 → 0.0.15
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/README.rdoc +1 -1
- data/lib/mods/nom_terminology.rb +445 -8
- data/lib/mods/reader.rb +3 -3
- data/lib/mods/record.rb +6 -7
- data/lib/mods/version.rb +1 -1
- data/spec/language_spec.rb +100 -73
- data/spec/location_spec.rb +269 -119
- data/spec/name_spec.rb +223 -197
- data/spec/origin_info_spec.rb +315 -190
- data/spec/part_spec.rb +411 -176
- data/spec/physical_description_spec.rb +120 -55
- data/spec/reader_spec.rb +76 -61
- data/spec/record_info_spec.rb +448 -206
- data/spec/record_spec.rb +192 -7
- data/spec/related_item_spec.rb +275 -124
- data/spec/subject_spec.rb +666 -339
- data/spec/title_spec.rb +204 -89
- data/spec/top_level_elmnts_simple_spec.rb +324 -145
- metadata +79 -98
@@ -3,76 +3,141 @@ require 'spec_helper'
|
|
3
3
|
describe "Mods <physicalDescription> Element" do
|
4
4
|
before(:all) do
|
5
5
|
@mods_rec = Mods::Record.new
|
6
|
-
@
|
7
|
-
@form_and_extent = '<mods><physicalDescription>
|
8
|
-
<form authority="smd">map</form>
|
9
|
-
<form type="material">foo</form>
|
10
|
-
<extent>1 map ; 22 x 18 cm.</extent>
|
11
|
-
</physicalDescription></mods>'
|
12
|
-
@forms_and_notes = '<mods><physicalDescription>
|
13
|
-
<form authority="aat">Graphics</form>
|
14
|
-
<form>plain form</form>
|
15
|
-
<note displayLabel="Dimensions">dimension text</note>
|
16
|
-
<note displayLabel="Condition">condition text</note>
|
17
|
-
</physicalDescription></mods>'
|
18
|
-
@digital = '<mods><physicalDescription>
|
19
|
-
<reformattingQuality>preservation</reformattingQuality>
|
20
|
-
<internetMediaType>image/jp2</internetMediaType>
|
21
|
-
<digitalOrigin>reformatted digital</digitalOrigin>
|
22
|
-
</physicalDescription></mods>'
|
6
|
+
@ns_decl = "xmlns='#{Mods::MODS_NS}'"
|
23
7
|
end
|
24
8
|
|
25
9
|
context "basic physical_description terminology pieces" do
|
26
|
-
before(:all) do
|
27
|
-
@mods_rec.from_str(@form_and_extent)
|
28
|
-
end
|
29
10
|
|
30
|
-
|
31
|
-
@mods_rec.from_str(@extent_only)
|
32
|
-
@mods_rec.physical_description.extent.map { |n| n.text }.should == ["extent"]
|
33
|
-
end
|
11
|
+
context "WITH namespaces" do
|
34
12
|
|
35
|
-
|
36
|
-
|
37
|
-
@mods_rec.
|
13
|
+
it "extent child element" do
|
14
|
+
@mods_rec.from_str("<mods #{@ns_decl}><physicalDescription><extent>extent</extent></physicalDescription></mods>")
|
15
|
+
@mods_rec.physical_description.extent.map { |n| n.text }.should == ["extent"]
|
38
16
|
end
|
39
|
-
it "should understand note element" do
|
40
|
-
@mods_rec.physical_description.note.map { |n| n.text }.should == ["dimension text", "condition text"]
|
41
|
-
end
|
42
|
-
it "should understand displayLabel attribute on note element" do
|
43
|
-
@mods_rec.physical_description.note.displayLabel.should == ["Dimensions", "Condition"]
|
44
|
-
end
|
45
|
-
end
|
46
17
|
|
47
|
-
|
48
|
-
|
49
|
-
|
18
|
+
context "note child element" do
|
19
|
+
before(:all) do
|
20
|
+
forms_and_notes = "<mods #{@ns_decl}><physicalDescription>
|
21
|
+
<form authority='aat'>Graphics</form>
|
22
|
+
<form>plain form</form>
|
23
|
+
<note displayLabel='Dimensions'>dimension text</note>
|
24
|
+
<note displayLabel='Condition'>condition text</note>
|
25
|
+
</physicalDescription></mods>"
|
26
|
+
@mods_rec.from_str(forms_and_notes)
|
27
|
+
end
|
28
|
+
it "should understand note element" do
|
29
|
+
@mods_rec.physical_description.note.map { |n| n.text }.should == ["dimension text", "condition text"]
|
30
|
+
end
|
31
|
+
it "should understand displayLabel attribute on note element" do
|
32
|
+
@mods_rec.physical_description.note.displayLabel.should == ["Dimensions", "Condition"]
|
33
|
+
end
|
50
34
|
end
|
51
|
-
|
52
|
-
|
35
|
+
|
36
|
+
context "form child element" do
|
37
|
+
before(:all) do
|
38
|
+
forms_and_extent = "<mods #{@ns_decl}><physicalDescription>
|
39
|
+
<form authority='smd'>map</form>
|
40
|
+
<form type='material'>foo</form>
|
41
|
+
<extent>1 map ; 22 x 18 cm.</extent>
|
42
|
+
</physicalDescription></mods>"
|
43
|
+
@mods_rec.from_str(forms_and_extent)
|
44
|
+
end
|
45
|
+
it "should understand form element" do
|
46
|
+
@mods_rec.physical_description.form.map { |n| n.text }.should == ["map", "foo"]
|
47
|
+
end
|
48
|
+
it "should understand authority attribute on form element" do
|
49
|
+
@mods_rec.physical_description.form.authority.should == ["smd"]
|
50
|
+
end
|
51
|
+
it "should understand type attribute on form element" do
|
52
|
+
@mods_rec.physical_description.form.type_at.should == ["material"]
|
53
|
+
end
|
53
54
|
end
|
54
|
-
|
55
|
-
|
55
|
+
|
56
|
+
context "digital materials" do
|
57
|
+
before(:all) do
|
58
|
+
digital = "<mods #{@ns_decl}><physicalDescription>
|
59
|
+
<reformattingQuality>preservation</reformattingQuality>
|
60
|
+
<internetMediaType>image/jp2</internetMediaType>
|
61
|
+
<digitalOrigin>reformatted digital</digitalOrigin>
|
62
|
+
</physicalDescription></mods>"
|
63
|
+
@mods_rec.from_str(digital)
|
64
|
+
end
|
65
|
+
it "should understand reformattingQuality child element" do
|
66
|
+
@mods_rec.physical_description.reformattingQuality.map { |n| n.text }.should == ["preservation"]
|
67
|
+
end
|
68
|
+
it "should understand digitalOrigin child element" do
|
69
|
+
@mods_rec.physical_description.digitalOrigin.map { |n| n.text }.should == ["reformatted digital"]
|
70
|
+
end
|
71
|
+
it "should understand internetMediaType child element" do
|
72
|
+
@mods_rec.physical_description.internetMediaType.map { |n| n.text }.should == ["image/jp2"]
|
73
|
+
end
|
56
74
|
end
|
57
|
-
|
58
|
-
|
75
|
+
end # WITH namespaces
|
76
|
+
|
77
|
+
context "WITHOUT namespaces" do
|
78
|
+
it "extent child element" do
|
79
|
+
@mods_rec.from_str('<mods><physicalDescription><extent>extent</extent></physicalDescription></mods>', false)
|
80
|
+
@mods_rec.physical_description.extent.map { |n| n.text }.should == ["extent"]
|
59
81
|
end
|
60
|
-
end
|
61
82
|
|
62
|
-
|
63
|
-
|
64
|
-
|
65
|
-
|
66
|
-
|
67
|
-
|
83
|
+
context "note child element" do
|
84
|
+
before(:all) do
|
85
|
+
forms_and_notes = '<mods><physicalDescription>
|
86
|
+
<form authority="aat">Graphics</form>
|
87
|
+
<form>plain form</form>
|
88
|
+
<note displayLabel="Dimensions">dimension text</note>
|
89
|
+
<note displayLabel="Condition">condition text</note>
|
90
|
+
</physicalDescription></mods>'
|
91
|
+
@mods_rec.from_str(forms_and_notes, false)
|
92
|
+
end
|
93
|
+
it "should understand note element" do
|
94
|
+
@mods_rec.physical_description.note.map { |n| n.text }.should == ["dimension text", "condition text"]
|
95
|
+
end
|
96
|
+
it "should understand displayLabel attribute on note element" do
|
97
|
+
@mods_rec.physical_description.note.displayLabel.should == ["Dimensions", "Condition"]
|
98
|
+
end
|
68
99
|
end
|
69
|
-
|
70
|
-
|
100
|
+
|
101
|
+
context "form child element" do
|
102
|
+
before(:all) do
|
103
|
+
forms_and_extent = '<mods><physicalDescription>
|
104
|
+
<form authority="smd">map</form>
|
105
|
+
<form type="material">foo</form>
|
106
|
+
<extent>1 map ; 22 x 18 cm.</extent>
|
107
|
+
</physicalDescription></mods>'
|
108
|
+
@mods_rec.from_str(forms_and_extent, false)
|
109
|
+
end
|
110
|
+
it "should understand form element" do
|
111
|
+
@mods_rec.physical_description.form.map { |n| n.text }.should == ["map", "foo"]
|
112
|
+
end
|
113
|
+
it "should understand authority attribute on form element" do
|
114
|
+
@mods_rec.physical_description.form.authority.should == ["smd"]
|
115
|
+
end
|
116
|
+
it "should understand type attribute on form element" do
|
117
|
+
@mods_rec.physical_description.form.type_at.should == ["material"]
|
118
|
+
end
|
71
119
|
end
|
72
|
-
|
73
|
-
|
120
|
+
|
121
|
+
context "digital materials" do
|
122
|
+
before(:all) do
|
123
|
+
digital = '<mods><physicalDescription>
|
124
|
+
<reformattingQuality>preservation</reformattingQuality>
|
125
|
+
<internetMediaType>image/jp2</internetMediaType>
|
126
|
+
<digitalOrigin>reformatted digital</digitalOrigin>
|
127
|
+
</physicalDescription></mods>'
|
128
|
+
@mods_rec.from_str(digital, false)
|
129
|
+
end
|
130
|
+
it "should understand reformattingQuality child element" do
|
131
|
+
@mods_rec.physical_description.reformattingQuality.map { |n| n.text }.should == ["preservation"]
|
132
|
+
end
|
133
|
+
it "should understand digitalOrigin child element" do
|
134
|
+
@mods_rec.physical_description.digitalOrigin.map { |n| n.text }.should == ["reformatted digital"]
|
135
|
+
end
|
136
|
+
it "should understand internetMediaType child element" do
|
137
|
+
@mods_rec.physical_description.internetMediaType.map { |n| n.text }.should == ["image/jp2"]
|
138
|
+
end
|
74
139
|
end
|
75
|
-
end
|
140
|
+
end # WITHOUT namespaces
|
76
141
|
|
77
142
|
end # basic terminology pieces
|
78
143
|
|
data/spec/reader_spec.rb
CHANGED
@@ -4,38 +4,93 @@ require 'spec_helper'
|
|
4
4
|
|
5
5
|
describe "Mods::Reader" do
|
6
6
|
before(:all) do
|
7
|
+
@ns_hash = {'m' => Mods::MODS_NS}
|
7
8
|
# url is for a namespaced document
|
8
9
|
@example_url = 'http://www.loc.gov/standards/mods/v3/mods99042030_linkedDataAdded.xml'
|
9
|
-
@
|
10
|
-
@
|
11
|
-
@
|
12
|
-
@
|
10
|
+
@example_default_ns_str = '<mods xmlns="http://www.loc.gov/mods/v3"><note>default ns</note></mods>'
|
11
|
+
@example_ns_str = '<mods:mods xmlns:mods="http://www.loc.gov/mods/v3"><mods:note>ns</mods:note></mods:mods>'
|
12
|
+
@example_no_ns_str = '<mods><note>no ns</note></mods>'
|
13
|
+
@example_wrong_ns_str = '<mods xmlns="wrong"><note>wrong ns</note></mods>'
|
14
|
+
@doc_from_str_default_ns = Mods::Reader.new.from_str(@example_ns_str)
|
15
|
+
@doc_from_str_ns = Mods::Reader.new.from_str(@example_ns_str)
|
16
|
+
@doc_from_str_no_ns = Mods::Reader.new.from_str(@example_no_ns_str)
|
17
|
+
@doc_from_str_wrong_ns = Mods::Reader.new.from_str(@example_wrong_ns_str)
|
13
18
|
@from_url = Mods::Reader.new.from_url(@example_url)
|
14
|
-
@ns_hash = {'mods' => Mods::MODS_NS}
|
15
19
|
end
|
16
20
|
|
17
21
|
it "from_str should turn an xml string into a Nokogiri::XML::Document object" do
|
18
|
-
@
|
19
|
-
@
|
22
|
+
@doc_from_str_default_ns.class.should == Nokogiri::XML::Document
|
23
|
+
@doc_from_str_ns.class.should == Nokogiri::XML::Document
|
24
|
+
@doc_from_str_no_ns.class.should == Nokogiri::XML::Document
|
25
|
+
@doc_from_str_wrong_ns.class.should == Nokogiri::XML::Document
|
20
26
|
end
|
21
27
|
|
22
28
|
it "from_url should turn the contents at the url into a Nokogiri::XML::Document object" do
|
23
29
|
@from_url.class.should == Nokogiri::XML::Document
|
24
30
|
end
|
25
31
|
|
32
|
+
context "namespace awareness" do
|
33
|
+
it "should care about namespace by default" do
|
34
|
+
r = Mods::Reader.new
|
35
|
+
r.namespace_aware.should == true
|
36
|
+
@doc_from_str_default_ns.root.namespace.href.should == Mods::MODS_NS
|
37
|
+
@doc_from_str_default_ns.xpath('/m:mods/m:note', @ns_hash).text.should == "ns"
|
38
|
+
@doc_from_str_default_ns.xpath('/mods/note').size.should == 0
|
39
|
+
@doc_from_str_ns.root.namespace.href.should == Mods::MODS_NS
|
40
|
+
@doc_from_str_ns.xpath('/m:mods/m:note', @ns_hash).text.should == "ns"
|
41
|
+
@doc_from_str_ns.xpath('/mods/note').size.should == 0
|
42
|
+
@doc_from_str_no_ns.xpath('/m:mods/m:note', @ns_hash).size.should == 0
|
43
|
+
@doc_from_str_no_ns.xpath('/mods/note').text.should == "no ns"
|
44
|
+
@doc_from_str_wrong_ns.root.namespace.href.should == "wrong"
|
45
|
+
@doc_from_str_wrong_ns.xpath('/m:mods/m:note', @ns_hash).size.should == 0
|
46
|
+
@doc_from_str_wrong_ns.xpath('/mods/note').size.should == 0
|
47
|
+
end
|
48
|
+
|
49
|
+
it "should be allowed not to care about namespaces" do
|
50
|
+
r = Mods::Reader.new(false)
|
51
|
+
r.namespace_aware.should == false
|
52
|
+
my_from_str_ns = r.from_str(@example_ns_str)
|
53
|
+
my_from_str_ns.xpath('/m:mods/m:note', @ns_hash).size.should == 0
|
54
|
+
my_from_str_ns.xpath('/mods/note').text.should == "ns"
|
55
|
+
my_from_str_no_ns = r.from_str(@example_no_ns_str)
|
56
|
+
my_from_str_no_ns.xpath('/m:mods/m:note', @ns_hash).size.should == 0
|
57
|
+
my_from_str_no_ns.xpath('/mods/note').text.should == "no ns"
|
58
|
+
my_from_str_wrong_ns = r.from_str(@example_wrong_ns_str)
|
59
|
+
my_from_str_wrong_ns.xpath('/m:mods/m:note', @ns_hash).size.should == 0
|
60
|
+
my_from_str_wrong_ns.xpath('/mods/note').text.should == "wrong ns"
|
61
|
+
end
|
62
|
+
end
|
63
|
+
|
64
|
+
it "should do something useful when it gets unparseable XML" do
|
65
|
+
pending "need to implement error handling for bad xml"
|
66
|
+
end
|
67
|
+
|
26
68
|
context "normalizing mods" do
|
27
69
|
it "should not lose UTF-8 encoding" do
|
28
70
|
utf_mods = '<?xml version="1.0" encoding="UTF-8"?>
|
29
|
-
<mods:mods xmlns:mods="http://www.loc.gov/mods/v3"
|
71
|
+
<mods:mods xmlns:mods="http://www.loc.gov/mods/v3"
|
30
72
|
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" version="3.3"
|
31
73
|
xsi:schemaLocation="http://www.loc.gov/mods/v3 http://www.loc.gov/standards/mods/v3/mods-3-3.xsd">
|
32
|
-
|
33
|
-
|
34
|
-
|
74
|
+
<mods:name authority="local" type="personal">
|
75
|
+
<mods:namePart>Gravé par Denise Macquart.</mods:namePart>
|
76
|
+
</mods:name>
|
35
77
|
</mods:mods>'
|
36
78
|
reader = Mods::Reader.new.from_str(utf_mods)
|
37
79
|
reader.encoding.should eql("UTF-8")
|
38
80
|
end
|
81
|
+
it "should remove xsi:schemaLocation attribute from mods element if removing namespaces" do
|
82
|
+
str = '<ns3:mods xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:ns3="http://www.loc.gov/mods/v3" xsi:schemaLocation="http://www.loc.gov/mods/v3 http://www.loc.gov/standards/mods/v3/mods-3-2.xsd">
|
83
|
+
<ns3:note>be very frightened</ns3:note></ns3:mods>'
|
84
|
+
ng_xml = Nokogiri::XML(str)
|
85
|
+
# Nokogiri treats namespaced attributes differently in jruby than in ruby
|
86
|
+
(ng_xml.root.has_attribute?('schemaLocation') || ng_xml.root.has_attribute?('xsi:schemaLocation')).should == true
|
87
|
+
r = Mods::Reader.new
|
88
|
+
r.namespace_aware = false
|
89
|
+
r.from_nk_node(ng_xml)
|
90
|
+
# the below are different depending on jruby or ruby ... oy
|
91
|
+
r.mods_ng_xml.root.attributes.keys.should_not include('schemaLocation')
|
92
|
+
r.mods_ng_xml.root.attributes.keys.should_not include('xsi:schemaLocation')
|
93
|
+
end
|
39
94
|
end
|
40
95
|
|
41
96
|
context "from_nk_node" do
|
@@ -61,63 +116,23 @@ describe "Mods::Reader" do
|
|
61
116
|
</GetRecord>
|
62
117
|
</OAI-PMH>'
|
63
118
|
ng_xml = Nokogiri::XML(oai_resp)
|
64
|
-
@mods_node = ng_xml.xpath('//
|
119
|
+
@mods_node = ng_xml.xpath('//m:mods', @ns_hash).first
|
65
120
|
@r = Mods::Reader.new
|
66
121
|
@mods_ng_doc = @r.from_nk_node(@mods_node)
|
67
122
|
end
|
68
123
|
it "should turn the Nokogiri::XML::Node into a Nokogiri::XML::Document object" do
|
69
124
|
@mods_ng_doc.should be_kind_of(Nokogiri::XML::Document)
|
70
125
|
end
|
71
|
-
it "should
|
72
|
-
@mods_ng_doc.xpath('/mods/titleInfo/title').text.should == "boo"
|
126
|
+
it "should care about namespace by default" do
|
127
|
+
@mods_ng_doc.xpath('/m:mods/m:titleInfo/m:title', @ns_hash).text.should == "boo"
|
73
128
|
end
|
74
|
-
it "should be able to care about namespaces" do
|
75
|
-
@r.namespace_aware = true
|
76
|
-
@mods_ng_doc = @r.from_nk_node(@mods_node)
|
77
|
-
@mods_ng_doc.xpath('/mods:mods/mods:titleInfo/mods:title', @ns_hash).text.should == "boo"
|
129
|
+
it "should be able not to care about namespaces" do
|
78
130
|
@r.namespace_aware = false
|
79
|
-
|
80
|
-
|
81
|
-
|
82
|
-
|
83
|
-
|
84
|
-
|
85
|
-
r = Mods::Reader.new
|
86
|
-
r.namespace_aware.should == false
|
87
|
-
@from_no_ns_str.xpath('/mods/note').text.should == "hi"
|
88
|
-
@from_wrong_ns_str.xpath('/mods/note').text.should == "hi"
|
89
|
-
# @from_no_ns_str.xpath('/mods:mods/mods:note', @ns_hash).text.should == ""
|
90
|
-
# @from_wrong_ns_str.xpath('/mods:mods/mods:note', @ns_hash).text.should == ""
|
91
|
-
end
|
92
|
-
|
93
|
-
it "should be allowed to care about namespaces" do
|
94
|
-
r = Mods::Reader.new
|
95
|
-
r.namespace_aware = true
|
96
|
-
r.from_url(@example_url).root.namespace.href.should == Mods::MODS_NS
|
97
|
-
my_from_str_no_ns = r.from_str(@example_no_ns_str)
|
98
|
-
my_from_str_no_ns.xpath('/mods:mods/mods:note', @ns_hash).text.should_not == "hi"
|
99
|
-
my_from_str_wrong_ns = r.from_str(@example_wrong_ns_str)
|
100
|
-
my_from_str_wrong_ns.root.namespace.href.should == 'whoops'
|
101
|
-
my_from_str_wrong_ns.xpath('/mods:mods/mods:note', @ns_hash).text.should_not == "hi"
|
102
|
-
my_from_str_wrong_ns.xpath('/mods/note').text.should_not == "hi"
|
103
|
-
end
|
104
|
-
|
105
|
-
it "should remove xsi:schemaLocation attribute from mods element if removing namespaces" do
|
106
|
-
str = '<ns3:mods xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:ns3="http://www.loc.gov/mods/v3" xsi:schemaLocation="http://www.loc.gov/mods/v3 http://www.loc.gov/standards/mods/v3/mods-3-2.xsd">
|
107
|
-
<ns3:note>be very frightened</ns3:note></ns3:mods>'
|
108
|
-
ng_xml = Nokogiri::XML(str)
|
109
|
-
# Nokogiri treats namespaced attributes differently in jruby than in ruby
|
110
|
-
(ng_xml.root.has_attribute?('schemaLocation') || ng_xml.root.has_attribute?('xsi:schemaLocation')).should == true
|
111
|
-
r = Mods::Reader.new
|
112
|
-
r.namespace_aware = false
|
113
|
-
r.from_nk_node(ng_xml)
|
114
|
-
# the below are different depending on jruby or ruby ... oy
|
115
|
-
r.mods_ng_xml.root.attributes.keys.should_not include('schemaLocation')
|
116
|
-
r.mods_ng_xml.root.attributes.keys.should_not include('xsi:schemaLocation')
|
117
|
-
end
|
118
|
-
end
|
131
|
+
mods_ng_doc = @r.from_nk_node(@mods_node)
|
132
|
+
mods_ng_doc.xpath('/m:mods/m:titleInfo/m:title', @ns_hash).size.should == 0
|
133
|
+
mods_ng_doc.xpath('/mods/titleInfo/title').text.should == "boo"
|
134
|
+
@r.namespace_aware = true
|
135
|
+
end
|
136
|
+
end # context from_nk_node
|
119
137
|
|
120
|
-
it "should do something useful when it gets unparseable XML" do
|
121
|
-
pending "need to implement error handling for bad xml"
|
122
|
-
end
|
123
138
|
end
|
data/spec/record_info_spec.rb
CHANGED
@@ -3,6 +3,7 @@ require 'spec_helper'
|
|
3
3
|
describe "Mods <recordInfo> Element" do
|
4
4
|
before(:all) do
|
5
5
|
@mods_rec = Mods::Record.new
|
6
|
+
@ns_decl = "xmlns='#{Mods::MODS_NS}'"
|
6
7
|
end
|
7
8
|
|
8
9
|
it "should translate language codes" do
|
@@ -14,238 +15,479 @@ describe "Mods <recordInfo> Element" do
|
|
14
15
|
end
|
15
16
|
|
16
17
|
context "basic <record_info> terminology pieces" do
|
17
|
-
before(:all) do
|
18
|
-
@rec_info = @mods_rec.from_str('<mods><recordInfo>
|
19
|
-
<recordContentSource authority="marcorg">RQE</recordContentSource>
|
20
|
-
<recordCreationDate encoding="marc">890517</recordCreationDate>
|
21
|
-
<recordIdentifier source="SIRSI">a9079953</recordIdentifier>
|
22
|
-
</recordInfo></mods>').record_info
|
23
|
-
@rec_info2 = @mods_rec.from_str('<mods><recordInfo>
|
24
|
-
<descriptionStandard>aacr2</descriptionStandard>
|
25
|
-
<recordContentSource authority="marcorg">AU@</recordContentSource>
|
26
|
-
<recordCreationDate encoding="marc">050921</recordCreationDate>
|
27
|
-
<recordIdentifier source="SIRSI">a8837534</recordIdentifier>
|
28
|
-
<languageOfCataloging>
|
29
|
-
<languageTerm authority="iso639-2b" type="code">eng</languageTerm>
|
30
|
-
</languageOfCataloging>
|
31
|
-
</recordInfo></mods>').record_info
|
32
|
-
@bnf = @mods_rec.from_str('<mods><recordInfo>
|
33
|
-
<recordContentSource>TEI Description</recordContentSource>
|
34
|
-
<recordCreationDate encoding="w3cdtf">2011-12-07</recordCreationDate>
|
35
|
-
<recordIdentifier source="BNF 2166"/>
|
36
|
-
<recordOrigin/>
|
37
|
-
<languageOfCataloging>
|
38
|
-
<languageTerm authority="iso639-2b">fra</languageTerm>
|
39
|
-
</languageOfCataloging>
|
40
|
-
</recordInfo></mods>').record_info
|
41
|
-
@rlin = @mods_rec.from_str('<mods><recordInfo>
|
42
|
-
<descriptionStandard>appm</descriptionStandard>
|
43
|
-
<recordContentSource authority="marcorg">CSt</recordContentSource>
|
44
|
-
<recordCreationDate encoding="marc">850416</recordCreationDate>
|
45
|
-
<recordChangeDate encoding="iso8601">19991012150824.0</recordChangeDate>
|
46
|
-
<recordIdentifier source="CStRLIN">a4083219</recordIdentifier>
|
47
|
-
</recordInfo></mods>').record_info
|
48
|
-
end
|
49
18
|
|
50
|
-
|
51
|
-
|
52
|
-
|
53
|
-
|
54
|
-
|
55
|
-
|
56
|
-
|
57
|
-
|
58
|
-
|
59
|
-
|
60
|
-
|
61
|
-
|
62
|
-
|
63
|
-
|
64
|
-
|
65
|
-
|
66
|
-
|
67
|
-
|
68
|
-
|
69
|
-
|
70
|
-
|
71
|
-
|
72
|
-
|
73
|
-
|
74
|
-
|
75
|
-
|
76
|
-
|
77
|
-
|
78
|
-
|
79
|
-
|
19
|
+
context "WITH namespaces" do
|
20
|
+
before(:all) do
|
21
|
+
@rec_info = @mods_rec.from_str("<mods #{@ns_decl}><recordInfo>
|
22
|
+
<recordContentSource authority='marcorg'>RQE</recordContentSource>
|
23
|
+
<recordCreationDate encoding='marc'>890517</recordCreationDate>
|
24
|
+
<recordIdentifier source='SIRSI'>a9079953</recordIdentifier>
|
25
|
+
</recordInfo></mods>").record_info
|
26
|
+
@rec_info2 = @mods_rec.from_str("<mods #{@ns_decl}><recordInfo>
|
27
|
+
<descriptionStandard>aacr2</descriptionStandard>
|
28
|
+
<recordContentSource authority='marcorg'>AU@</recordContentSource>
|
29
|
+
<recordCreationDate encoding='marc'>050921</recordCreationDate>
|
30
|
+
<recordIdentifier source='SIRSI'>a8837534</recordIdentifier>
|
31
|
+
<languageOfCataloging>
|
32
|
+
<languageTerm authority='iso639-2b' type='code'>eng</languageTerm>
|
33
|
+
</languageOfCataloging>
|
34
|
+
</recordInfo></mods>").record_info
|
35
|
+
@bnf = @mods_rec.from_str("<mods #{@ns_decl}><recordInfo>
|
36
|
+
<recordContentSource>TEI Description</recordContentSource>
|
37
|
+
<recordCreationDate encoding='w3cdtf'>2011-12-07</recordCreationDate>
|
38
|
+
<recordIdentifier source='BNF 2166'/>
|
39
|
+
<recordOrigin/>
|
40
|
+
<languageOfCataloging>
|
41
|
+
<languageTerm authority='iso639-2b'>fra</languageTerm>
|
42
|
+
</languageOfCataloging>
|
43
|
+
</recordInfo></mods>").record_info
|
44
|
+
@rlin = @mods_rec.from_str("<mods #{@ns_decl}><recordInfo>
|
45
|
+
<descriptionStandard>appm</descriptionStandard>
|
46
|
+
<recordContentSource authority='marcorg'>CSt</recordContentSource>
|
47
|
+
<recordCreationDate encoding='marc'>850416</recordCreationDate>
|
48
|
+
<recordChangeDate encoding='iso8601'>19991012150824.0</recordChangeDate>
|
49
|
+
<recordIdentifier source='CStRLIN'>a4083219</recordIdentifier>
|
50
|
+
</recordInfo></mods>").record_info
|
80
51
|
end
|
81
|
-
it "should recognize authority attribute" do
|
82
|
-
[@rec_info, @rec_info2, @rlin].each { |ri| ri.recordContentSource.authority.should == ['marcorg'] }
|
83
|
-
@bnf.recordContentSource.authority.size.should == 0
|
84
|
-
end
|
85
|
-
it "should recognize all authority attributes" do
|
86
|
-
Mods::AUTHORITY_ATTRIBS.each { |a|
|
87
|
-
@mods_rec.from_str("<mods><recordInfo><recordContentSource #{a}='attr_val'>zzz</recordContentSource></recordInfo></mods>")
|
88
|
-
@mods_rec.record_info.recordContentSource.send(a.to_sym).should == ['attr_val']
|
89
|
-
}
|
90
|
-
end
|
91
|
-
end # <recordContentSource>
|
92
52
|
|
93
|
-
context "<recordCreationDate> child element" do
|
94
53
|
it "should be a NodeSet" do
|
95
|
-
[@rec_info, @rec_info2, @bnf, @rlin].each { |ri| ri.
|
96
|
-
end
|
97
|
-
it "recordCreationDate NodeSet should have as many Nodes as there are <recordCreationDate> elements in the xml" do
|
98
|
-
[@rec_info, @rec_info2, @bnf, @rlin].each { |ri| ri.recordCreationDate.size.should == 1 }
|
54
|
+
[@rec_info, @rec_info2, @bnf, @rlin].each { |ri| ri.should be_an_instance_of(Nokogiri::XML::NodeSet) }
|
99
55
|
end
|
100
|
-
it "
|
101
|
-
@rec_info.
|
102
|
-
@rec_info2.recordCreationDate.map { |n| n.text }.should == ['050921']
|
103
|
-
@bnf.recordCreationDate.map { |n| n.text }.should == ['2011-12-07']
|
104
|
-
@rlin.recordCreationDate.map { |n| n.text }.should == ['850416']
|
56
|
+
it "should have as many members as there are <recordInfo> elements in the xml" do
|
57
|
+
[@rec_info, @rec_info2, @bnf, @rlin].each { |ri| ri.size.should == 1 }
|
105
58
|
end
|
106
|
-
it "should recognize
|
107
|
-
|
108
|
-
|
109
|
-
|
110
|
-
|
111
|
-
Mods::DATE_ATTRIBS.each { |a|
|
112
|
-
@mods_rec.from_str("<mods><recordInfo><recordCreationDate #{a}='attr_val'>zzz</recordCreationDate></recordInfo></mods>")
|
113
|
-
@mods_rec.record_info.recordCreationDate.send(a.to_sym).should == ['attr_val']
|
59
|
+
it "should recognize language attributes on <recordInfo> element" do
|
60
|
+
pending "problem with xml:lang"
|
61
|
+
Mods::LANG_ATTRIBS.each { |a|
|
62
|
+
@mods_rec.from_str("<mods #{@ns_decl}><recordInfo #{a}='val'><recordOrigin>nowhere</recordOrigin></recordInfo></mods>")
|
63
|
+
@mods_rec.record_info.send(a.to_sym).should == ['val']
|
114
64
|
}
|
115
65
|
end
|
116
|
-
|
117
|
-
|
118
|
-
|
119
|
-
it "should be a NodeSet" do
|
120
|
-
[@rec_info, @rec_info2, @bnf, @rlin].each { |ri| ri.recordChangeDate.should be_an_instance_of(Nokogiri::XML::NodeSet) }
|
121
|
-
end
|
122
|
-
it "recordChangeDate NodeSet should have as many Nodes as there are <recordChangeDate> elements in the xml" do
|
123
|
-
[@rec_info, @rec_info2, @bnf].each { |ri| ri.recordChangeDate.size.should == 0 }
|
124
|
-
@rlin.recordChangeDate.size.should == 1
|
125
|
-
end
|
126
|
-
it "text should get element value" do
|
127
|
-
@rlin.recordChangeDate.map { |n| n.text }.should == ['19991012150824.0']
|
66
|
+
it "should recognize displayLabel attribute on <recordInfo> element" do
|
67
|
+
@mods_rec.from_str("<mods #{@ns_decl}><recordInfo displayLabel='val'><recordOrigin>nowhere</recordOrigin></recordInfo></mods>")
|
68
|
+
@mods_rec.record_info.displayLabel.should == ['val']
|
128
69
|
end
|
129
|
-
it "should recognize encoding attribute" do
|
130
|
-
@rlin.recordChangeDate.encoding.should == ['iso8601']
|
131
|
-
end
|
132
|
-
it "should recognize all date attributes" do
|
133
|
-
Mods::DATE_ATTRIBS.each { |a|
|
134
|
-
@mods_rec.from_str("<mods><recordInfo><recordChangeDate #{a}='attr_val'>zzz</recordChangeDate></recordInfo></mods>")
|
135
|
-
@mods_rec.record_info.recordChangeDate.send(a.to_sym).should == ['attr_val']
|
136
|
-
}
|
137
|
-
end
|
138
|
-
end # <recordChangeDate>
|
139
70
|
|
140
|
-
|
141
|
-
|
142
|
-
|
143
|
-
|
144
|
-
|
145
|
-
|
146
|
-
|
147
|
-
|
148
|
-
|
149
|
-
|
150
|
-
|
151
|
-
|
152
|
-
|
153
|
-
|
154
|
-
|
155
|
-
|
156
|
-
|
157
|
-
|
158
|
-
|
159
|
-
|
160
|
-
|
161
|
-
|
162
|
-
|
71
|
+
context "<recordContentSource> child element" do
|
72
|
+
it "should be a NodeSet" do
|
73
|
+
[@rec_info, @rec_info2, @bnf, @rlin].each { |ri| ri.recordContentSource.should be_an_instance_of(Nokogiri::XML::NodeSet) }
|
74
|
+
end
|
75
|
+
it "recordContentSource NodeSet should have as many Nodes as there are <recordContentSource> elements in the xml" do
|
76
|
+
[@rec_info, @rec_info2, @bnf, @rlin].each { |ri| ri.recordContentSource.size.should == 1 }
|
77
|
+
end
|
78
|
+
it "text should get element value" do
|
79
|
+
@rec_info.recordContentSource.map { |n| n.text }.should == ["RQE"]
|
80
|
+
@rec_info2.recordContentSource.map { |n| n.text }.should == ["AU@"]
|
81
|
+
@bnf.recordContentSource.map { |n| n.text }.should == ["TEI Description"]
|
82
|
+
@rlin.recordContentSource.map { |n| n.text }.should == ["CSt"]
|
83
|
+
end
|
84
|
+
it "should recognize authority attribute" do
|
85
|
+
[@rec_info, @rec_info2, @rlin].each { |ri| ri.recordContentSource.authority.should == ['marcorg'] }
|
86
|
+
@bnf.recordContentSource.authority.size.should == 0
|
87
|
+
end
|
88
|
+
it "should recognize all authority attributes" do
|
89
|
+
Mods::AUTHORITY_ATTRIBS.each { |a|
|
90
|
+
@mods_rec.from_str("<mods #{@ns_decl}><recordInfo><recordContentSource #{a}='attr_val'>zzz</recordContentSource></recordInfo></mods>")
|
91
|
+
@mods_rec.record_info.recordContentSource.send(a.to_sym).should == ['attr_val']
|
92
|
+
}
|
93
|
+
end
|
94
|
+
end # <recordContentSource>
|
163
95
|
|
164
|
-
|
165
|
-
|
166
|
-
|
167
|
-
|
168
|
-
|
169
|
-
|
170
|
-
|
171
|
-
|
172
|
-
|
173
|
-
|
174
|
-
|
175
|
-
|
96
|
+
context "<recordCreationDate> child element" do
|
97
|
+
it "should be a NodeSet" do
|
98
|
+
[@rec_info, @rec_info2, @bnf, @rlin].each { |ri| ri.recordCreationDate.should be_an_instance_of(Nokogiri::XML::NodeSet) }
|
99
|
+
end
|
100
|
+
it "recordCreationDate NodeSet should have as many Nodes as there are <recordCreationDate> elements in the xml" do
|
101
|
+
[@rec_info, @rec_info2, @bnf, @rlin].each { |ri| ri.recordCreationDate.size.should == 1 }
|
102
|
+
end
|
103
|
+
it "text should get element value" do
|
104
|
+
@rec_info.recordCreationDate.map { |n| n.text }.should == ['890517']
|
105
|
+
@rec_info2.recordCreationDate.map { |n| n.text }.should == ['050921']
|
106
|
+
@bnf.recordCreationDate.map { |n| n.text }.should == ['2011-12-07']
|
107
|
+
@rlin.recordCreationDate.map { |n| n.text }.should == ['850416']
|
108
|
+
end
|
109
|
+
it "should recognize encoding attribute" do
|
110
|
+
[@rec_info, @rec_info2, @rlin].each { |ri| ri.recordCreationDate.encoding.should == ['marc'] }
|
111
|
+
@bnf.recordCreationDate.encoding.should == ['w3cdtf']
|
112
|
+
end
|
113
|
+
it "should recognize all date attributes" do
|
114
|
+
Mods::DATE_ATTRIBS.each { |a|
|
115
|
+
@mods_rec.from_str("<mods #{@ns_decl}><recordInfo><recordCreationDate #{a}='attr_val'>zzz</recordCreationDate></recordInfo></mods>")
|
116
|
+
@mods_rec.record_info.recordCreationDate.send(a.to_sym).should == ['attr_val']
|
117
|
+
}
|
118
|
+
end
|
119
|
+
end # <recordCreationDate>
|
120
|
+
|
121
|
+
context "<recordChangeDate> child element" do
|
122
|
+
it "should be a NodeSet" do
|
123
|
+
[@rec_info, @rec_info2, @bnf, @rlin].each { |ri| ri.recordChangeDate.should be_an_instance_of(Nokogiri::XML::NodeSet) }
|
124
|
+
end
|
125
|
+
it "recordChangeDate NodeSet should have as many Nodes as there are <recordChangeDate> elements in the xml" do
|
126
|
+
[@rec_info, @rec_info2, @bnf].each { |ri| ri.recordChangeDate.size.should == 0 }
|
127
|
+
@rlin.recordChangeDate.size.should == 1
|
128
|
+
end
|
129
|
+
it "text should get element value" do
|
130
|
+
@rlin.recordChangeDate.map { |n| n.text }.should == ['19991012150824.0']
|
131
|
+
end
|
132
|
+
it "should recognize encoding attribute" do
|
133
|
+
@rlin.recordChangeDate.encoding.should == ['iso8601']
|
134
|
+
end
|
135
|
+
it "should recognize all date attributes" do
|
136
|
+
Mods::DATE_ATTRIBS.each { |a|
|
137
|
+
@mods_rec.from_str("<mods #{@ns_decl}><recordInfo><recordChangeDate #{a}='attr_val'>zzz</recordChangeDate></recordInfo></mods>")
|
138
|
+
@mods_rec.record_info.recordChangeDate.send(a.to_sym).should == ['attr_val']
|
139
|
+
}
|
140
|
+
end
|
141
|
+
end # <recordChangeDate>
|
142
|
+
|
143
|
+
context "<recordIdentifier> child element" do
|
144
|
+
it "should be a NodeSet" do
|
145
|
+
[@rec_info, @rec_info2, @bnf, @rlin].each { |ri| ri.recordIdentifier.should be_an_instance_of(Nokogiri::XML::NodeSet) }
|
146
|
+
end
|
147
|
+
it "recordIdentifier NodeSet should have as many Nodes as there are <recordIdentifier> elements in the xml" do
|
148
|
+
[@rec_info, @rec_info2, @bnf, @rlin].each { |ri| ri.recordIdentifier.size.should == 1 }
|
149
|
+
end
|
150
|
+
it "text should get element value" do
|
151
|
+
@rec_info.recordIdentifier.map { |n| n.text }.should == ['a9079953']
|
152
|
+
@rec_info2.recordIdentifier.map { |n| n.text }.should == ['a8837534']
|
153
|
+
@bnf.recordIdentifier.map { |n| n.text }.should == ['']
|
154
|
+
@rlin.recordIdentifier.map { |n| n.text }.should == ['a4083219']
|
155
|
+
end
|
156
|
+
it "should recognize source attribute" do
|
157
|
+
[@rec_info, @rec_info2].each { |ri| ri.recordIdentifier.source.should == ['SIRSI'] }
|
158
|
+
@bnf.recordIdentifier.source.should == ['BNF 2166']
|
159
|
+
@rlin.recordIdentifier.source.should == ['CStRLIN']
|
160
|
+
end
|
161
|
+
it "should allow a source attribute without element content" do
|
162
|
+
@bnf.recordIdentifier.source.should == ['BNF 2166']
|
163
|
+
@bnf.recordIdentifier.map { |n| n.text }.should == ['']
|
164
|
+
end
|
165
|
+
end # <recordIdentifier>
|
166
|
+
|
167
|
+
context "<recordOrigin> child element" do
|
168
|
+
it "should be a NodeSet" do
|
169
|
+
[@rec_info, @rec_info2, @bnf, @rlin].each { |ri| ri.recordOrigin.should be_an_instance_of(Nokogiri::XML::NodeSet) }
|
170
|
+
end
|
171
|
+
it "recordOrigin NodeSet should have as many Nodes as there are <recordOrigin> elements in the xml" do
|
172
|
+
[@rec_info, @rec_info2, @rlin].each { |ri| ri.recordOrigin.size.should == 0 }
|
173
|
+
@bnf.recordOrigin.size.should == 1
|
174
|
+
end
|
175
|
+
it "text should get element value" do
|
176
|
+
@mods_rec.from_str("<mods #{@ns_decl}><recordInfo><recordOrigin>human prepared</recordOrigin></recordInfo></mods>")
|
177
|
+
@mods_rec.record_info.recordOrigin.map {|n| n.text }.should == ['human prepared']
|
178
|
+
@bnf.recordOrigin.map { |n| n.text }.should == ['']
|
179
|
+
end
|
180
|
+
end # <recordOrigin>
|
181
|
+
|
182
|
+
context "<languageOfCataloging> child element" do
|
183
|
+
it "should be a NodeSet" do
|
184
|
+
[@rec_info, @rec_info2, @bnf, @rlin].each { |ri| ri.languageOfCataloging.should be_an_instance_of(Nokogiri::XML::NodeSet) }
|
185
|
+
end
|
186
|
+
it "languageOfCataloging NodeSet should have as many Nodes as there are <languageOfCataloging> elements in the xml" do
|
187
|
+
[@rec_info2, @bnf].each { |ri| ri.languageOfCataloging.size.should == 1 }
|
188
|
+
[@rec_info, @rlin].each { |ri| ri.languageOfCataloging.size.should == 0 }
|
189
|
+
end
|
190
|
+
it "text should get element value" do
|
191
|
+
# this example is from http://www.loc.gov/standards/mods/v3/mods-userguide-elements.html
|
192
|
+
# though it doesn't match the doc at http://www.loc.gov/standards/mods/mods-outline.html#recordInfo
|
193
|
+
@mods_rec.from_str("<mods #{@ns_decl}><recordInfo><languageOfCataloging authority='iso639-2b'>fre</languageOfCataloging></recordInfo></mods>")
|
194
|
+
@mods_rec.record_info.languageOfCataloging.map { |n| n.text }.should == ['fre']
|
195
|
+
end
|
196
|
+
it "authority should get attribute value" do
|
197
|
+
# this example is from http://www.loc.gov/standards/mods/v3/mods-userguide-elements.html
|
198
|
+
# though it doesn't match the doc at http://www.loc.gov/standards/mods/mods-outline.html#recordInfo
|
199
|
+
@mods_rec.from_str("<mods #{@ns_decl}><recordInfo><languageOfCataloging authority='iso639-2b'>fre</languageOfCataloging></recordInfo></mods>")
|
200
|
+
@mods_rec.record_info.languageOfCataloging.authority.should == ['iso639-2b']
|
201
|
+
end
|
202
|
+
|
203
|
+
# from http://www.loc.gov/standards/mods/userguide/recordinfo.html#languageofcataloging
|
204
|
+
# objectPart attribute defined for consistency with <language> . Unlikely to be used with <languageOfCataloging>
|
205
|
+
it "objectType should get attribute value" do
|
206
|
+
pending "<languageOfCataloging objectType=''> to be implemented ... maybe ..."
|
207
|
+
end
|
208
|
+
|
209
|
+
context "<languageTerm> child element" do
|
210
|
+
it "text should get element value" do
|
211
|
+
@rec_info2.languageOfCataloging.languageTerm.map { |n| n.text }.should == ['eng']
|
212
|
+
@bnf.languageOfCataloging.languageTerm.map { |n| n.text }.should == ['fra']
|
213
|
+
end
|
214
|
+
it "should recognize all authority attributes" do
|
215
|
+
Mods::AUTHORITY_ATTRIBS.each { |a|
|
216
|
+
@mods_rec.from_str("<mods #{@ns_decl}><recordInfo><languageOfCataloging><languageTerm #{a}='attr_val'>zzz</languageTerm></languageOfCataloging></recordInfo></mods>")
|
217
|
+
@mods_rec.record_info.languageOfCataloging.languageTerm.send(a.to_sym).should == ['attr_val']
|
218
|
+
}
|
219
|
+
end
|
220
|
+
it "should recognize the type attribute with type_at term" do
|
221
|
+
@rec_info2.languageOfCataloging.languageTerm.type_at.should == ['code']
|
222
|
+
end
|
223
|
+
end # <languageTerm>
|
224
|
+
|
225
|
+
context "<scriptTerm> child element" do
|
226
|
+
it "should do something" do
|
227
|
+
pending "<recordInfo><languageOfCataloging><scriptTerm> to be implemented"
|
228
|
+
end
|
229
|
+
end
|
230
|
+
end # <languageOfCataloging>
|
231
|
+
|
232
|
+
context "<descriptionStandard> child element" do
|
233
|
+
it "should be a NodeSet" do
|
234
|
+
[@rec_info, @rec_info2, @bnf, @rlin].each { |ri| ri.descriptionStandard.should be_an_instance_of(Nokogiri::XML::NodeSet) }
|
235
|
+
end
|
236
|
+
it "descriptionStandard NodeSet should have as many Nodes as there are <descriptionStandard> elements in the xml" do
|
237
|
+
[@rec_info, @bnf].each { |ri| ri.descriptionStandard.size.should == 0 }
|
238
|
+
[@rec_info2, @rlin].each { |ri| ri.descriptionStandard.size.should == 1 }
|
239
|
+
end
|
240
|
+
it "text should get element value" do
|
241
|
+
@rec_info2.descriptionStandard.map { |n| n.text }.should == ['aacr2']
|
242
|
+
@rlin.descriptionStandard.map { |n| n.text }.should == ['appm']
|
243
|
+
@bnf.descriptionStandard.map { |n| n.text }.should == []
|
244
|
+
end
|
245
|
+
it "should recognize all authority attributes" do
|
246
|
+
Mods::AUTHORITY_ATTRIBS.each { |a|
|
247
|
+
@mods_rec.from_str("<mods #{@ns_decl}><recordInfo><descriptionStandard #{a}='attr_val'>zzz</descriptionStandard></recordInfo></mods>")
|
248
|
+
@mods_rec.record_info.descriptionStandard.send(a.to_sym).should == ['attr_val']
|
249
|
+
}
|
250
|
+
end
|
251
|
+
end # <descriptionStandard>
|
252
|
+
|
253
|
+
end # WITH namespaces
|
254
|
+
|
255
|
+
context "WITHOUT namespaces" do
|
256
|
+
before(:all) do
|
257
|
+
@rec_info = @mods_rec.from_str("<mods><recordInfo>
|
258
|
+
<recordContentSource authority='marcorg'>RQE</recordContentSource>
|
259
|
+
<recordCreationDate encoding='marc'>890517</recordCreationDate>
|
260
|
+
<recordIdentifier source='SIRSI'>a9079953</recordIdentifier>
|
261
|
+
</recordInfo></mods>", false).record_info
|
262
|
+
@rec_info2 = @mods_rec.from_str("<mods><recordInfo>
|
263
|
+
<descriptionStandard>aacr2</descriptionStandard>
|
264
|
+
<recordContentSource authority='marcorg'>AU@</recordContentSource>
|
265
|
+
<recordCreationDate encoding='marc'>050921</recordCreationDate>
|
266
|
+
<recordIdentifier source='SIRSI'>a8837534</recordIdentifier>
|
267
|
+
<languageOfCataloging>
|
268
|
+
<languageTerm authority='iso639-2b' type='code'>eng</languageTerm>
|
269
|
+
</languageOfCataloging>
|
270
|
+
</recordInfo></mods>", false).record_info
|
271
|
+
@bnf = @mods_rec.from_str("<mods><recordInfo>
|
272
|
+
<recordContentSource>TEI Description</recordContentSource>
|
273
|
+
<recordCreationDate encoding='w3cdtf'>2011-12-07</recordCreationDate>
|
274
|
+
<recordIdentifier source='BNF 2166'/>
|
275
|
+
<recordOrigin/>
|
276
|
+
<languageOfCataloging>
|
277
|
+
<languageTerm authority='iso639-2b'>fra</languageTerm>
|
278
|
+
</languageOfCataloging>
|
279
|
+
</recordInfo></mods>", false).record_info
|
280
|
+
@rlin = @mods_rec.from_str("<mods><recordInfo>
|
281
|
+
<descriptionStandard>appm</descriptionStandard>
|
282
|
+
<recordContentSource authority='marcorg'>CSt</recordContentSource>
|
283
|
+
<recordCreationDate encoding='marc'>850416</recordCreationDate>
|
284
|
+
<recordChangeDate encoding='iso8601'>19991012150824.0</recordChangeDate>
|
285
|
+
<recordIdentifier source='CStRLIN'>a4083219</recordIdentifier>
|
286
|
+
</recordInfo></mods>", false).record_info
|
176
287
|
end
|
177
|
-
end # <recordOrigin>
|
178
288
|
|
179
|
-
context "<languageOfCataloging> child element" do
|
180
289
|
it "should be a NodeSet" do
|
181
|
-
[@rec_info, @rec_info2, @bnf, @rlin].each { |ri| ri.
|
290
|
+
[@rec_info, @rec_info2, @bnf, @rlin].each { |ri| ri.should be_an_instance_of(Nokogiri::XML::NodeSet) }
|
182
291
|
end
|
183
|
-
it "
|
184
|
-
[@rec_info2, @bnf].each { |ri| ri.
|
185
|
-
[@rec_info, @rlin].each { |ri| ri.languageOfCataloging.size.should == 0 }
|
292
|
+
it "should have as many members as there are <recordInfo> elements in the xml" do
|
293
|
+
[@rec_info, @rec_info2, @bnf, @rlin].each { |ri| ri.size.should == 1 }
|
186
294
|
end
|
187
|
-
it "
|
188
|
-
|
189
|
-
|
190
|
-
|
191
|
-
|
192
|
-
|
193
|
-
it "authority should get attribute value" do
|
194
|
-
# this example is from http://www.loc.gov/standards/mods/v3/mods-userguide-elements.html
|
195
|
-
# though it doesn't match the doc at http://www.loc.gov/standards/mods/mods-outline.html#recordInfo
|
196
|
-
@mods_rec.from_str("<mods><recordInfo><languageOfCataloging authority='iso639-2b'>fre</languageOfCataloging></recordInfo></mods>")
|
197
|
-
@mods_rec.record_info.languageOfCataloging.authority.should == ['iso639-2b']
|
295
|
+
it "should recognize language attributes on <recordInfo> element" do
|
296
|
+
pending "problem with xml:lang"
|
297
|
+
Mods::LANG_ATTRIBS.each { |a|
|
298
|
+
@mods_rec.from_str("<mods><recordInfo #{a}='val'><recordOrigin>nowhere</recordOrigin></recordInfo></mods>", false)
|
299
|
+
@mods_rec.record_info.send(a.to_sym).should == ['val']
|
300
|
+
}
|
198
301
|
end
|
199
|
-
|
200
|
-
|
201
|
-
|
202
|
-
it "objectType should get attribute value" do
|
203
|
-
pending "<languageOfCataloging objectType=''> to be implemented ... maybe ..."
|
302
|
+
it "should recognize displayLabel attribute on <recordInfo> element" do
|
303
|
+
@mods_rec.from_str("<mods><recordInfo displayLabel='val'><recordOrigin>nowhere</recordOrigin></recordInfo></mods>", false)
|
304
|
+
@mods_rec.record_info.displayLabel.should == ['val']
|
204
305
|
end
|
205
|
-
|
206
|
-
context "<
|
306
|
+
|
307
|
+
context "<recordContentSource> child element" do
|
308
|
+
it "should be a NodeSet" do
|
309
|
+
[@rec_info, @rec_info2, @bnf, @rlin].each { |ri| ri.recordContentSource.should be_an_instance_of(Nokogiri::XML::NodeSet) }
|
310
|
+
end
|
311
|
+
it "recordContentSource NodeSet should have as many Nodes as there are <recordContentSource> elements in the xml" do
|
312
|
+
[@rec_info, @rec_info2, @bnf, @rlin].each { |ri| ri.recordContentSource.size.should == 1 }
|
313
|
+
end
|
207
314
|
it "text should get element value" do
|
208
|
-
@
|
209
|
-
@
|
315
|
+
@rec_info.recordContentSource.map { |n| n.text }.should == ["RQE"]
|
316
|
+
@rec_info2.recordContentSource.map { |n| n.text }.should == ["AU@"]
|
317
|
+
@bnf.recordContentSource.map { |n| n.text }.should == ["TEI Description"]
|
318
|
+
@rlin.recordContentSource.map { |n| n.text }.should == ["CSt"]
|
319
|
+
end
|
320
|
+
it "should recognize authority attribute" do
|
321
|
+
[@rec_info, @rec_info2, @rlin].each { |ri| ri.recordContentSource.authority.should == ['marcorg'] }
|
322
|
+
@bnf.recordContentSource.authority.size.should == 0
|
210
323
|
end
|
211
324
|
it "should recognize all authority attributes" do
|
212
|
-
Mods::AUTHORITY_ATTRIBS.each { |a|
|
213
|
-
@mods_rec.from_str("<mods><recordInfo><
|
214
|
-
@mods_rec.record_info.
|
325
|
+
Mods::AUTHORITY_ATTRIBS.each { |a|
|
326
|
+
@mods_rec.from_str("<mods><recordInfo><recordContentSource #{a}='attr_val'>zzz</recordContentSource></recordInfo></mods>", false)
|
327
|
+
@mods_rec.record_info.recordContentSource.send(a.to_sym).should == ['attr_val']
|
215
328
|
}
|
216
329
|
end
|
217
|
-
|
218
|
-
|
330
|
+
end # <recordContentSource>
|
331
|
+
|
332
|
+
context "<recordCreationDate> child element" do
|
333
|
+
it "should be a NodeSet" do
|
334
|
+
[@rec_info, @rec_info2, @bnf, @rlin].each { |ri| ri.recordCreationDate.should be_an_instance_of(Nokogiri::XML::NodeSet) }
|
335
|
+
end
|
336
|
+
it "recordCreationDate NodeSet should have as many Nodes as there are <recordCreationDate> elements in the xml" do
|
337
|
+
[@rec_info, @rec_info2, @bnf, @rlin].each { |ri| ri.recordCreationDate.size.should == 1 }
|
219
338
|
end
|
220
|
-
|
221
|
-
|
222
|
-
|
223
|
-
|
224
|
-
|
339
|
+
it "text should get element value" do
|
340
|
+
@rec_info.recordCreationDate.map { |n| n.text }.should == ['890517']
|
341
|
+
@rec_info2.recordCreationDate.map { |n| n.text }.should == ['050921']
|
342
|
+
@bnf.recordCreationDate.map { |n| n.text }.should == ['2011-12-07']
|
343
|
+
@rlin.recordCreationDate.map { |n| n.text }.should == ['850416']
|
225
344
|
end
|
226
|
-
|
227
|
-
|
345
|
+
it "should recognize encoding attribute" do
|
346
|
+
[@rec_info, @rec_info2, @rlin].each { |ri| ri.recordCreationDate.encoding.should == ['marc'] }
|
347
|
+
@bnf.recordCreationDate.encoding.should == ['w3cdtf']
|
348
|
+
end
|
349
|
+
it "should recognize all date attributes" do
|
350
|
+
Mods::DATE_ATTRIBS.each { |a|
|
351
|
+
@mods_rec.from_str("<mods><recordInfo><recordCreationDate #{a}='attr_val'>zzz</recordCreationDate></recordInfo></mods>", false)
|
352
|
+
@mods_rec.record_info.recordCreationDate.send(a.to_sym).should == ['attr_val']
|
353
|
+
}
|
354
|
+
end
|
355
|
+
end # <recordCreationDate>
|
228
356
|
|
229
|
-
|
230
|
-
|
231
|
-
|
232
|
-
|
233
|
-
|
234
|
-
|
235
|
-
|
236
|
-
|
237
|
-
|
238
|
-
|
239
|
-
|
240
|
-
|
241
|
-
|
242
|
-
|
243
|
-
|
244
|
-
|
245
|
-
|
246
|
-
|
247
|
-
|
248
|
-
|
357
|
+
context "<recordChangeDate> child element" do
|
358
|
+
it "should be a NodeSet" do
|
359
|
+
[@rec_info, @rec_info2, @bnf, @rlin].each { |ri| ri.recordChangeDate.should be_an_instance_of(Nokogiri::XML::NodeSet) }
|
360
|
+
end
|
361
|
+
it "recordChangeDate NodeSet should have as many Nodes as there are <recordChangeDate> elements in the xml" do
|
362
|
+
[@rec_info, @rec_info2, @bnf].each { |ri| ri.recordChangeDate.size.should == 0 }
|
363
|
+
@rlin.recordChangeDate.size.should == 1
|
364
|
+
end
|
365
|
+
it "text should get element value" do
|
366
|
+
@rlin.recordChangeDate.map { |n| n.text }.should == ['19991012150824.0']
|
367
|
+
end
|
368
|
+
it "should recognize encoding attribute" do
|
369
|
+
@rlin.recordChangeDate.encoding.should == ['iso8601']
|
370
|
+
end
|
371
|
+
it "should recognize all date attributes" do
|
372
|
+
Mods::DATE_ATTRIBS.each { |a|
|
373
|
+
@mods_rec.from_str("<mods><recordInfo><recordChangeDate #{a}='attr_val'>zzz</recordChangeDate></recordInfo></mods>", false)
|
374
|
+
@mods_rec.record_info.recordChangeDate.send(a.to_sym).should == ['attr_val']
|
375
|
+
}
|
376
|
+
end
|
377
|
+
end # <recordChangeDate>
|
378
|
+
|
379
|
+
context "<recordIdentifier> child element" do
|
380
|
+
it "should be a NodeSet" do
|
381
|
+
[@rec_info, @rec_info2, @bnf, @rlin].each { |ri| ri.recordIdentifier.should be_an_instance_of(Nokogiri::XML::NodeSet) }
|
382
|
+
end
|
383
|
+
it "recordIdentifier NodeSet should have as many Nodes as there are <recordIdentifier> elements in the xml" do
|
384
|
+
[@rec_info, @rec_info2, @bnf, @rlin].each { |ri| ri.recordIdentifier.size.should == 1 }
|
385
|
+
end
|
386
|
+
it "text should get element value" do
|
387
|
+
@rec_info.recordIdentifier.map { |n| n.text }.should == ['a9079953']
|
388
|
+
@rec_info2.recordIdentifier.map { |n| n.text }.should == ['a8837534']
|
389
|
+
@bnf.recordIdentifier.map { |n| n.text }.should == ['']
|
390
|
+
@rlin.recordIdentifier.map { |n| n.text }.should == ['a4083219']
|
391
|
+
end
|
392
|
+
it "should recognize source attribute" do
|
393
|
+
[@rec_info, @rec_info2].each { |ri| ri.recordIdentifier.source.should == ['SIRSI'] }
|
394
|
+
@bnf.recordIdentifier.source.should == ['BNF 2166']
|
395
|
+
@rlin.recordIdentifier.source.should == ['CStRLIN']
|
396
|
+
end
|
397
|
+
it "should allow a source attribute without element content" do
|
398
|
+
@bnf.recordIdentifier.source.should == ['BNF 2166']
|
399
|
+
@bnf.recordIdentifier.map { |n| n.text }.should == ['']
|
400
|
+
end
|
401
|
+
end # <recordIdentifier>
|
249
402
|
|
403
|
+
context "<recordOrigin> child element" do
|
404
|
+
it "should be a NodeSet" do
|
405
|
+
[@rec_info, @rec_info2, @bnf, @rlin].each { |ri| ri.recordOrigin.should be_an_instance_of(Nokogiri::XML::NodeSet) }
|
406
|
+
end
|
407
|
+
it "recordOrigin NodeSet should have as many Nodes as there are <recordOrigin> elements in the xml" do
|
408
|
+
[@rec_info, @rec_info2, @rlin].each { |ri| ri.recordOrigin.size.should == 0 }
|
409
|
+
@bnf.recordOrigin.size.should == 1
|
410
|
+
end
|
411
|
+
it "text should get element value" do
|
412
|
+
@mods_rec.from_str("<mods><recordInfo><recordOrigin>human prepared</recordOrigin></recordInfo></mods>", false)
|
413
|
+
@mods_rec.record_info.recordOrigin.map {|n| n.text }.should == ['human prepared']
|
414
|
+
@bnf.recordOrigin.map { |n| n.text }.should == ['']
|
415
|
+
end
|
416
|
+
end # <recordOrigin>
|
417
|
+
|
418
|
+
context "<languageOfCataloging> child element" do
|
419
|
+
it "should be a NodeSet" do
|
420
|
+
[@rec_info, @rec_info2, @bnf, @rlin].each { |ri| ri.languageOfCataloging.should be_an_instance_of(Nokogiri::XML::NodeSet) }
|
421
|
+
end
|
422
|
+
it "languageOfCataloging NodeSet should have as many Nodes as there are <languageOfCataloging> elements in the xml" do
|
423
|
+
[@rec_info2, @bnf].each { |ri| ri.languageOfCataloging.size.should == 1 }
|
424
|
+
[@rec_info, @rlin].each { |ri| ri.languageOfCataloging.size.should == 0 }
|
425
|
+
end
|
426
|
+
it "text should get element value" do
|
427
|
+
# this example is from http://www.loc.gov/standards/mods/v3/mods-userguide-elements.html
|
428
|
+
# though it doesn't match the doc at http://www.loc.gov/standards/mods/mods-outline.html#recordInfo
|
429
|
+
@mods_rec.from_str("<mods><recordInfo><languageOfCataloging authority='iso639-2b'>fre</languageOfCataloging></recordInfo></mods>", false)
|
430
|
+
@mods_rec.record_info.languageOfCataloging.map { |n| n.text }.should == ['fre']
|
431
|
+
end
|
432
|
+
it "authority should get attribute value" do
|
433
|
+
# this example is from http://www.loc.gov/standards/mods/v3/mods-userguide-elements.html
|
434
|
+
# though it doesn't match the doc at http://www.loc.gov/standards/mods/mods-outline.html#recordInfo
|
435
|
+
@mods_rec.from_str("<mods><recordInfo><languageOfCataloging authority='iso639-2b'>fre</languageOfCataloging></recordInfo></mods>", false)
|
436
|
+
@mods_rec.record_info.languageOfCataloging.authority.should == ['iso639-2b']
|
437
|
+
end
|
438
|
+
|
439
|
+
# from http://www.loc.gov/standards/mods/userguide/recordinfo.html#languageofcataloging
|
440
|
+
# objectPart attribute defined for consistency with <language> . Unlikely to be used with <languageOfCataloging>
|
441
|
+
it "objectType should get attribute value" do
|
442
|
+
pending "<languageOfCataloging objectType=''> to be implemented ... maybe ..."
|
443
|
+
end
|
444
|
+
|
445
|
+
context "<languageTerm> child element" do
|
446
|
+
it "text should get element value" do
|
447
|
+
@rec_info2.languageOfCataloging.languageTerm.map { |n| n.text }.should == ['eng']
|
448
|
+
@bnf.languageOfCataloging.languageTerm.map { |n| n.text }.should == ['fra']
|
449
|
+
end
|
450
|
+
it "should recognize all authority attributes" do
|
451
|
+
Mods::AUTHORITY_ATTRIBS.each { |a|
|
452
|
+
@mods_rec.from_str("<mods><recordInfo><languageOfCataloging><languageTerm #{a}='attr_val'>zzz</languageTerm></languageOfCataloging></recordInfo></mods>", false)
|
453
|
+
@mods_rec.record_info.languageOfCataloging.languageTerm.send(a.to_sym).should == ['attr_val']
|
454
|
+
}
|
455
|
+
end
|
456
|
+
it "should recognize the type attribute with type_at term" do
|
457
|
+
@rec_info2.languageOfCataloging.languageTerm.type_at.should == ['code']
|
458
|
+
end
|
459
|
+
end # <languageTerm>
|
460
|
+
|
461
|
+
context "<scriptTerm> child element" do
|
462
|
+
it "should do something" do
|
463
|
+
pending "<recordInfo><languageOfCataloging><scriptTerm> to be implemented"
|
464
|
+
end
|
465
|
+
end
|
466
|
+
end # <languageOfCataloging>
|
467
|
+
|
468
|
+
context "<descriptionStandard> child element" do
|
469
|
+
it "should be a NodeSet" do
|
470
|
+
[@rec_info, @rec_info2, @bnf, @rlin].each { |ri| ri.descriptionStandard.should be_an_instance_of(Nokogiri::XML::NodeSet) }
|
471
|
+
end
|
472
|
+
it "descriptionStandard NodeSet should have as many Nodes as there are <descriptionStandard> elements in the xml" do
|
473
|
+
[@rec_info, @bnf].each { |ri| ri.descriptionStandard.size.should == 0 }
|
474
|
+
[@rec_info2, @rlin].each { |ri| ri.descriptionStandard.size.should == 1 }
|
475
|
+
end
|
476
|
+
it "text should get element value" do
|
477
|
+
@rec_info2.descriptionStandard.map { |n| n.text }.should == ['aacr2']
|
478
|
+
@rlin.descriptionStandard.map { |n| n.text }.should == ['appm']
|
479
|
+
@bnf.descriptionStandard.map { |n| n.text }.should == []
|
480
|
+
end
|
481
|
+
it "should recognize all authority attributes" do
|
482
|
+
Mods::AUTHORITY_ATTRIBS.each { |a|
|
483
|
+
@mods_rec.from_str("<mods><recordInfo><descriptionStandard #{a}='attr_val'>zzz</descriptionStandard></recordInfo></mods>", false)
|
484
|
+
@mods_rec.record_info.descriptionStandard.send(a.to_sym).should == ['attr_val']
|
485
|
+
}
|
486
|
+
end
|
487
|
+
end # <descriptionStandard>
|
488
|
+
|
489
|
+
end # WITHOUT namespaces
|
490
|
+
|
250
491
|
end # basic <record_info> terminology pieces
|
492
|
+
|
251
493
|
end
|