mods 0.0.14 → 0.0.15

Sign up to get free protection for your applications and to get access to all the features.
data/lib/mods/reader.rb CHANGED
@@ -3,13 +3,13 @@
3
3
  module Mods
4
4
  class Reader
5
5
 
6
- DEFAULT_NS_AWARE = false
6
+ DEFAULT_NS_AWARE = true
7
7
 
8
8
  # true if the XML parsing should be strict about using namespaces.
9
9
  attr_accessor :namespace_aware
10
10
  attr_reader :mods_ng_xml
11
11
 
12
- # @param ns_aware true if the XML parsing should be strict about using namespaces. Default is false
12
+ # @param ns_aware true if the XML parsing should be strict about using namespaces. Default is true
13
13
  def initialize(ns_aware = DEFAULT_NS_AWARE)
14
14
  @namespace_aware = ns_aware
15
15
  end
@@ -34,7 +34,7 @@ module Mods
34
34
  # @param node (Nokogiri::XML::Node) - Nokogiri::XML::Node that is the top level element of a mods record
35
35
  # @return Nokogiri::XML::Document
36
36
  def from_nk_node(node)
37
- @mods_ng_xml = Nokogiri::XML(node.to_s)
37
+ @mods_ng_xml = Nokogiri::XML(node.to_s, nil, node.document.encoding)
38
38
  normalize_mods
39
39
  @mods_ng_xml
40
40
  end
data/lib/mods/record.rb CHANGED
@@ -22,9 +22,9 @@ module Mods
22
22
  end
23
23
 
24
24
  # convenience method to call Mods::Reader.new.from_str and to nom
25
- # @param ns_aware true if the XML parsing should be strict about using namespaces. Default is false
25
+ # @param ns_aware true if the XML parsing should be strict about using namespaces. Default is true
26
26
  # @param str - a string containing mods xml
27
- def from_str(str, ns_aware = false)
27
+ def from_str(str, ns_aware = true)
28
28
  @mods_ng_xml = Mods::Reader.new(ns_aware).from_str(str)
29
29
  if ns_aware
30
30
  set_terminology_ns(@mods_ng_xml)
@@ -34,9 +34,9 @@ module Mods
34
34
  end
35
35
 
36
36
  # convenience method to call Mods::Reader.new.from_url and to nom
37
- # @param namespace_aware true if the XML parsing should be strict about using namespaces. Default is false
37
+ # @param namespace_aware true if the XML parsing should be strict about using namespaces. Default is true
38
38
  # @param url (String) - url that has mods xml as its content
39
- def from_url(url, namespace_aware = false)
39
+ def from_url(url, namespace_aware = true)
40
40
  @mods_ng_xml = Mods::Reader.new(ns_aware).from_url(url)
41
41
  if ns_aware
42
42
  set_terminology_ns(@mods_ng_xml)
@@ -46,9 +46,9 @@ module Mods
46
46
  end
47
47
 
48
48
  # convenience method to call Mods::Reader.new.from_nk_node and to nom
49
- # @param ns_aware true if the XML parsing should be strict about using namespaces. Default is false
49
+ # @param ns_aware true if the XML parsing should be strict about using namespaces. Default is true
50
50
  # @param node (Nokogiri::XML::Node) - Nokogiri::XML::Node that is the top level element of a mods record
51
- def from_nk_node(node, ns_aware = false)
51
+ def from_nk_node(node, ns_aware = true)
52
52
  @mods_ng_xml = Mods::Reader.new(ns_aware).from_nk_node(node)
53
53
  if ns_aware
54
54
  set_terminology_ns(@mods_ng_xml)
@@ -142,7 +142,6 @@ module Mods
142
142
  result.uniq
143
143
  end
144
144
 
145
-
146
145
  def method_missing method_name, *args
147
146
  if mods_ng_xml.respond_to?(method_name)
148
147
  mods_ng_xml.send(method_name, *args)
data/lib/mods/version.rb CHANGED
@@ -1,4 +1,4 @@
1
1
  module Mods
2
2
  # this is the Ruby Gem version
3
- VERSION = "0.0.14"
3
+ VERSION = "0.0.15"
4
4
  end
@@ -3,89 +3,116 @@ require 'spec_helper'
3
3
  describe "Mods <language> Element" do
4
4
  before(:all) do
5
5
  @mods_rec = Mods::Record.new
6
- @simple = '<mods><language>Greek</language></mods>'
7
- @simple_ln = @mods_rec.from_str(@simple).language
8
- @iso639_2b_code = '<mods><language><languageTerm authority="iso639-2b" type="code">fre</languageTerm></language></mods>'
9
- @iso639_2b_code_ln = @mods_rec.from_str(@iso639_2b_code).language
10
- @iso639_2b_text = '<mods><language><languageTerm authority="iso639-2b" type="text">English</languageTerm></language></mods>'
11
- @iso639_2b_text_ln = @mods_rec.from_str(@iso639_2b_text).language
12
- @mult_codes = '<mods><language><languageTerm authority="iso639-2b" type="code">per ara, dut</languageTerm></language></mods>'
13
- @mult_codes_ln = @mods_rec.from_str(@mult_codes).language
14
- mult_code_terms = '<mods><language><languageTerm authority="iso639-2b" type="code">spa</languageTerm><languageTerm authority="iso639-2b" type="code">dut</languageTerm></language></mods>'
15
- @mult_code_terms = @mods_rec.from_str(mult_code_terms).language
16
- mult_text_terms = '<mods><language><languageTerm authority="iso639-2b" type="text">Chinese</languageTerm><languageTerm authority="iso639-2b" type="text">Spanish</languageTerm></language></mods>'
17
- @mult_text_terms = @mods_rec.from_str(mult_text_terms).language
18
- @ex_array = [@simple_ln, @iso639_2b_code_ln, @iso639_2b_text_ln, @mult_codes_ln, @mult_code_terms, @mult_text_terms]
19
6
  end
20
7
 
21
8
  context "basic <language> terminology pieces" do
22
- before(:all) do
23
- @mods_rec.from_str(@iso639_2b_code)
24
- end
25
- it "should be a NodeSet" do
26
- @ex_array.each { |t| t.should be_an_instance_of(Nokogiri::XML::NodeSet) }
27
- end
28
- it "should have as many members as there are <language> elements in the xml" do
29
- @ex_array.each { |t| t.size.should == 1 }
30
- end
31
9
 
32
- context "<languageTerm> child element" do
33
- it "should understand languageTerm.type_at attribute" do
34
- @iso639_2b_code_ln.languageTerm.type_at.should == ["code"]
10
+ context "namespace aware" do
11
+ before(:all) do
12
+ @ns_decl = "xmlns='#{Mods::MODS_NS}'"
13
+ @iso639_2b_code = "<mods #{@ns_decl}><language><languageTerm authority='iso639-2b' type='code'>fre</languageTerm></language></mods>"
14
+ @iso639_2b_code_ln = @mods_rec.from_str(@iso639_2b_code).language
15
+ mult_code_terms = "<mods #{@ns_decl}><language><languageTerm authority='iso639-2b' type='code'>spa</languageTerm><languageTerm authority='iso639-2b' type='code'>dut</languageTerm></language></mods>"
16
+ @mult_code_terms = @mods_rec.from_str(mult_code_terms).language
17
+ mult_text_terms = "<mods #{@ns_decl}><language><languageTerm authority='iso639-2b' type='text'>Chinese</languageTerm><languageTerm authority='iso639-2b' type='text'>Spanish</languageTerm></language></mods>"
18
+ @mult_text_terms = @mods_rec.from_str(mult_text_terms).language
19
+ @ex_array = [@iso639_2b_code_ln, @mult_code_terms, @mult_text_terms]
35
20
  end
36
- it "should understand languageTerm.authority attribute" do
37
- @iso639_2b_code_ln.languageTerm.authority.should == ["iso639-2b"]
21
+ it "should be a NodeSet" do
22
+ @ex_array.each { |t| t.should be_an_instance_of(Nokogiri::XML::NodeSet) }
38
23
  end
39
- it "should understand languageTerm value" do
40
- @iso639_2b_code_ln.languageTerm.text.should == "fre"
41
- @iso639_2b_code_ln.languageTerm.size.should == 1
24
+ it "should have as many members as there are <language> elements in the xml" do
25
+ @ex_array.each { |t| t.size.should == 1 }
42
26
  end
43
-
44
- it "should recognize all authority attributes" do
45
- Mods::AUTHORITY_ATTRIBS.each { |a|
46
- @mods_rec.from_str("<mods><language><languageTerm #{a}='attr_val'>zzz</languageTerm></language></mods>")
47
- @mods_rec.language.languageTerm.send(a.to_sym).should == ['attr_val']
48
- }
27
+
28
+ context "<languageTerm> child element" do
29
+ it "should understand languageTerm.type_at attribute" do
30
+ @iso639_2b_code_ln.languageTerm.type_at.should == ["code"]
31
+ end
32
+ it "should understand languageTerm.authority attribute" do
33
+ @iso639_2b_code_ln.languageTerm.authority.should == ["iso639-2b"]
34
+ end
35
+ it "should understand languageTerm value" do
36
+ @iso639_2b_code_ln.languageTerm.text.should == "fre"
37
+ @iso639_2b_code_ln.languageTerm.size.should == 1
38
+ end
39
+
40
+ it "should recognize all authority attributes" do
41
+ Mods::AUTHORITY_ATTRIBS.each { |a|
42
+ @mods_rec.from_str("<mods #{@ns_decl}><language><languageTerm #{a}='attr_val'>zzz</languageTerm></language></mods>")
43
+ @mods_rec.language.languageTerm.send(a.to_sym).should == ['attr_val']
44
+ }
45
+ end
46
+ end # <languageTerm>
47
+
48
+ it "should get one language.code_term for each languageTerm element with a type attribute of 'code'" do
49
+ @iso639_2b_code_ln.code_term.size.should == 1
50
+ @iso639_2b_code_ln.code_term.text.should == "fre"
51
+ @mult_code_terms.code_term.size.should == 2
52
+ @mult_code_terms.code_term.first.text.should include("spa")
53
+ @mult_code_terms.code_term[1].text.should == "dut"
49
54
  end
50
- end # <languageTerm>
55
+ it "should get one language.text_term for each languageTerm element with a type attribute of 'text'" do
56
+ @mult_text_terms.text_term.size.should == 2
57
+ @mult_text_terms.text_term.first.text.should include("Chinese")
58
+ @mult_text_terms.text_term[1].text.should == "Spanish"
59
+ end
60
+ end # namespace_aware
61
+
51
62
 
52
- it "should get one language.code_term for each languageTerm element with a type attribute of 'code'" do
53
- @iso639_2b_code_ln.code_term.size.should == 1
54
- @iso639_2b_code_ln.code_term.text.should == "fre"
55
- @mult_code_terms.code_term.size.should == 2
56
- @mult_code_terms.code_term.first.text.should include("spa")
57
- @mult_code_terms.code_term[1].text.should == "dut"
58
- end
59
- it "should get one language.text_term for each languageTerm element with a type attribute of 'text'" do
60
- @mult_text_terms.text_term.size.should == 2
61
- @mult_text_terms.text_term.first.text.should include("Chinese")
62
- @mult_text_terms.text_term[1].text.should == "Spanish"
63
- end
63
+ context "NOT namespace aware" do
64
+ before(:all) do
65
+ @iso639_2b_code = "<mods><language><languageTerm authority='iso639-2b' type='code'>fre</languageTerm></language></mods>"
66
+ @iso639_2b_code_ln = @mods_rec.from_str(@iso639_2b_code, false).language
67
+ mult_code_terms = "<mods><language><languageTerm authority='iso639-2b' type='code'>spa</languageTerm><languageTerm authority='iso639-2b' type='code'>dut</languageTerm></language></mods>"
68
+ @mult_code_terms = @mods_rec.from_str(mult_code_terms, false).language
69
+ mult_text_terms = "<mods><language><languageTerm authority='iso639-2b' type='text'>Chinese</languageTerm><languageTerm authority='iso639-2b' type='text'>Spanish</languageTerm></language></mods>"
70
+ @mult_text_terms = @mods_rec.from_str(mult_text_terms, false).language
71
+ @ex_array = [@iso639_2b_code_ln, @mult_code_terms, @mult_text_terms]
72
+ end
73
+ it "should be a NodeSet" do
74
+ @ex_array.each { |t| t.should be_an_instance_of(Nokogiri::XML::NodeSet) }
75
+ end
76
+ it "should have as many members as there are <language> elements in the xml" do
77
+ @ex_array.each { |t| t.size.should == 1 }
78
+ end
79
+
80
+ context "<languageTerm> child element" do
81
+ it "should understand languageTerm.type_at attribute" do
82
+ @iso639_2b_code_ln.languageTerm.type_at.should == ["code"]
83
+ end
84
+ it "should understand languageTerm.authority attribute" do
85
+ @iso639_2b_code_ln.languageTerm.authority.should == ["iso639-2b"]
86
+ end
87
+ it "should understand languageTerm value" do
88
+ @iso639_2b_code_ln.languageTerm.text.should == "fre"
89
+ @iso639_2b_code_ln.languageTerm.size.should == 1
90
+ end
91
+
92
+ it "should recognize all authority attributes" do
93
+ Mods::AUTHORITY_ATTRIBS.each { |a|
94
+ @mods_rec.from_str("<mods><language><languageTerm #{a}='attr_val'>zzz</languageTerm></language></mods>", false)
95
+ @mods_rec.language.languageTerm.send(a.to_sym).should == ['attr_val']
96
+ }
97
+ end
98
+ end # <languageTerm>
99
+
100
+ it "should get one language.code_term for each languageTerm element with a type attribute of 'code'" do
101
+ @iso639_2b_code_ln.code_term.size.should == 1
102
+ @iso639_2b_code_ln.code_term.text.should == "fre"
103
+ @mult_code_terms.code_term.size.should == 2
104
+ @mult_code_terms.code_term.first.text.should include("spa")
105
+ @mult_code_terms.code_term[1].text.should == "dut"
106
+ end
107
+ it "should get one language.text_term for each languageTerm element with a type attribute of 'text'" do
108
+ @mult_text_terms.text_term.size.should == 2
109
+ @mult_text_terms.text_term.first.text.should include("Chinese")
110
+ @mult_text_terms.text_term[1].text.should == "Spanish"
111
+ end
112
+ end # NOT namespace_aware
113
+
64
114
  end # basic <language> terminology pieces
65
115
 
66
- context "Mods::Record.languages convenience method" do
67
-
68
- it "should translate iso639-2b codes to English" do
69
- @mods_rec.from_str(@iso639_2b_code)
70
- @mods_rec.languages.should == ["French"]
71
- end
72
-
73
- it "should pass thru language values that are already text (not code)" do
74
- @mods_rec.from_str(@iso639_2b_text)
75
- @mods_rec.languages.should == ["English"]
76
- end
77
-
78
- it "should keep values that are not inside <languageTerm> elements" do
79
- @mods_rec.from_str(@simple)
80
- @mods_rec.languages.should == ["Greek"]
81
- end
82
-
83
- it "should create a separate value for each language in a comma, space, or | separated list " do
84
- @mods_rec.from_str(@mult_codes)
85
- @mods_rec.languages.should include("Arabic")
86
- @mods_rec.languages.should include("Persian")
87
- @mods_rec.languages.should include("Dutch; Flemish")
88
- end
89
- end
116
+ # note that Mods::Record.languages tests are in record_spec
90
117
 
91
118
  end
@@ -3,143 +3,293 @@ require 'spec_helper'
3
3
  describe "Mods <location> Element" do
4
4
  before(:all) do
5
5
  @mods_rec = Mods::Record.new
6
- @url_and_phys = '<mods><location>
7
- <url displayLabel="Digital collection of 46 images available online" usage="primary display">http://searchworks.stanford.edu/?f%5Bcollection%5D%5B%5D=The+Reid+W.+Dennis+Collection+of+California+Lithographs&amp;view=gallery</url>
8
- </location><location>
9
- <physicalLocation>Department of Special Collections, Stanford University Libraries, Stanford, CA 94305.</physicalLocation>
10
- </location></mods>'
11
- # from http://www.loc.gov/standards/mods/v3/mods-userguide-elements.html !!
12
- # sublocation is not allowed directly under location
13
- @incorrect = '<mods><location>
14
- <physicalLocation>Library of Congress </physicalLocation>
15
- <sublocation>Prints and Photographs Division Washington, D.C. 20540 USA</sublocation>
16
- <shelfLocator>DAG no. 1410</shelfLocator>
17
- </location></mods>'
18
6
  end
19
7
 
20
8
  context "basic location terminology pieces" do
21
9
 
22
- context "physicalLocation child element" do
10
+ context "WITH namespaces" do
23
11
  before(:all) do
24
- @phys_loc_only = '<mods><location><physicalLocation>here</physicalLocation></location></mods>'
25
- @phys_loc_authority = '<mods><location><physicalLocation authority="marcorg">MnRM</physicalLocation></location></mods>'
12
+ @ns_decl = "xmlns='#{Mods::MODS_NS}'"
13
+ @url_and_phys = "<mods #{@ns_decl}><location>
14
+ <url displayLabel='Digital collection of 46 images available online' usage='primary display'>http://searchworks.stanford.edu/?f%5Bcollection%5D%5B%5D=The+Reid+W.+Dennis+Collection+of+California+Lithographs&amp;view=gallery</url>
15
+ </location><location>
16
+ <physicalLocation>Department of Special Collections, Stanford University Libraries, Stanford, CA 94305.</physicalLocation>
17
+ </location></mods>"
18
+ # from http://www.loc.gov/standards/mods/v3/mods-userguide-elements.html !!
19
+ # sublocation is not allowed directly under location
20
+ @incorrect = "<mods #{@ns_decl}><location>
21
+ <physicalLocation>Library of Congress </physicalLocation>
22
+ <sublocation>Prints and Photographs Division Washington, D.C. 20540 USA</sublocation>
23
+ <shelfLocator>DAG no. 1410</shelfLocator>
24
+ </location></mods>"
26
25
  end
27
- it "should have access to text value of element" do
28
- @mods_rec.from_str(@phys_loc_only)
29
- @mods_rec.location.physicalLocation.text.should == "here"
30
- @mods_rec.from_str(@phys_loc_authority)
31
- @mods_rec.location.physicalLocation.map { |n| n.text }.should == ["MnRM"]
26
+
27
+ context "physicalLocation child element" do
28
+ before(:all) do
29
+ @phys_loc_only = "<mods #{@ns_decl}><location><physicalLocation>here</physicalLocation></location></mods>"
30
+ @phys_loc_authority = "<mods #{@ns_decl}><location><physicalLocation authority='marcorg'>MnRM</physicalLocation></location></mods>"
31
+ end
32
+ it "should have access to text value of element" do
33
+ @mods_rec.from_str(@phys_loc_only)
34
+ @mods_rec.location.physicalLocation.text.should == "here"
35
+ @mods_rec.from_str(@phys_loc_authority)
36
+ @mods_rec.location.physicalLocation.map { |n| n.text }.should == ["MnRM"]
37
+ end
38
+ it "should recognize authority attribute" do
39
+ @mods_rec.from_str(@phys_loc_authority)
40
+ @mods_rec.location.physicalLocation.authority.should == ["marcorg"]
41
+ end
42
+ it "should recognize displayLabel attribute" do
43
+ @mods_rec.from_str("<mods #{@ns_decl}><location><physicalLocation displayLabel='Correspondence'>some address</physicalLocation></location></mods>")
44
+ @mods_rec.location.physicalLocation.displayLabel.should == ["Correspondence"]
45
+ end
32
46
  end
33
- it "should recognize authority attribute" do
34
- @mods_rec.from_str(@phys_loc_authority)
35
- @mods_rec.location.physicalLocation.authority.should == ["marcorg"]
47
+
48
+ it "shelfLocator child element" do
49
+ shelf_loc = "<mods #{@ns_decl}><location>
50
+ <physicalLocation>Library of Congress </physicalLocation>
51
+ <shelfLocator>DAG no. 1410</shelfLocator>
52
+ </location></mods>"
53
+ @mods_rec.from_str(shelf_loc)
54
+ @mods_rec.location.shelfLocator.map { |n| n.text }.should == ["DAG no. 1410"]
36
55
  end
37
- it "should recognize displayLabel attribute" do
38
- @mods_rec.from_str('<mods><location><physicalLocation displayLabel="Correspondence">some address</physicalLocation></location></mods>')
39
- @mods_rec.location.physicalLocation.displayLabel.should == ["Correspondence"]
40
- end
41
- end
42
-
43
- it "shelfLocator child element" do
44
- shelf_loc = '<mods><location>
45
- <physicalLocation>Library of Congress </physicalLocation>
46
- <shelfLocator>DAG no. 1410</shelfLocator>
47
- </location></mods>'
48
- @mods_rec.from_str(shelf_loc)
49
- @mods_rec.location.shelfLocator.map { |n| n.text }.should == ["DAG no. 1410"]
50
- end
51
56
 
52
- context "url child element" do
53
- before(:all) do
54
- @empty_loc_url = '<mods><location><url/></location></mods>'
55
- @mult_flavor_loc_urls = '<mods><location>
56
- <url access="preview">http://preview.org</url>
57
- <url access="object in context">http://context.org</url>
58
- <url access="raw object">http://object.org</url>
59
- </location></mods>'
57
+ context "url child element" do
58
+ before(:all) do
59
+ @empty_loc_url = "<mods #{@ns_decl}><location><url/></location></mods>"
60
+ @mult_flavor_loc_urls = "<mods #{@ns_decl}><location>
61
+ <url access='preview'>http://preview.org</url>
62
+ <url access='object in context'>http://context.org</url>
63
+ <url access='raw object'>http://object.org</url>
64
+ </location></mods>"
65
+ end
66
+ it "should have access to text value of element" do
67
+ urls = @mods_rec.from_str(@mult_flavor_loc_urls).location.url.map { |e| e.text }
68
+ urls.size.should == 3
69
+ urls.should include("http://preview.org")
70
+ urls.should include("http://context.org")
71
+ urls.should include("http://object.org")
72
+ end
73
+ context "attributes" do
74
+ before(:all) do
75
+ @url_attribs = "<mods #{@ns_decl}><location>
76
+ <url displayLabel='Digital collection of 46 images available online' usage='primary display'>http://searchworks.stanford.edu/?f%5Bcollection%5D%5B%5D=The+Reid+W.+Dennis+Collection+of+California+Lithographs&amp;view=gallery</url>
77
+ </location></mods>"
78
+ end
79
+ it "should recognize displayLabel attribute" do
80
+ @mods_rec.from_str(@url_attribs).location.url.displayLabel.should == ["Digital collection of 46 images available online"]
81
+ end
82
+ it "should recognize access attribute" do
83
+ vals = @mods_rec.from_str(@mult_flavor_loc_urls).location.url.access
84
+ vals.size.should == 3
85
+ vals.should include("preview")
86
+ vals.should include("object in context")
87
+ vals.should include("raw object")
88
+ end
89
+ it "should recognize usage attribute" do
90
+ @mods_rec.from_str(@url_attribs).location.url.usage.should == ["primary display"]
91
+ end
92
+ it "should recognize note attribute" do
93
+ @mods_rec.from_str("<mods #{@ns_decl}><location><url note='something'>http://somewhere.org</url></location></mods>")
94
+ @mods_rec.location.url.note.should == ["something"]
95
+ end
96
+ it "should recognize dateLastAccessed attribute" do
97
+ @mods_rec.from_str("<mods #{@ns_decl}><location><url dateLastAccessed='something'>http://somewhere.org</url></location></mods>")
98
+ @mods_rec.location.url.dateLastAccessed.should == ["something"]
99
+ end
100
+ end # attributes
101
+ it "should have array with empty string for single empty url element" do
102
+ @mods_rec.from_str(@empty_loc_url).location.url.map { |n| n.text }.should == [""]
103
+ end
104
+ end # url child element
105
+
106
+ it "holdingSimple child element" do
107
+ xml = "<mods #{@ns_decl}><location>
108
+ <physicalLocation authority='marcorg'>MnRM</physicalLocation>
109
+ <holdingSimple>
110
+ <copyInformation>
111
+ <sublocation>Patient reading room</sublocation>
112
+ <shelfLocator>QH511.A1J68</shelfLocator>
113
+ <enumerationAndChronology unitType='1'> v.1-v.8 1970-1976</enumerationAndChronology>
114
+ </copyInformation>
115
+ </holdingSimple></location></mods>"
116
+ @mods_rec.from_str(xml).location.holdingSimple.should be_an_instance_of(Nokogiri::XML::NodeSet)
117
+ @mods_rec.from_str(xml).location.holdingSimple.first.should be_an_instance_of(Nokogiri::XML::Element)
60
118
  end
61
- it "should have access to text value of element" do
62
- urls = @mods_rec.from_str(@mult_flavor_loc_urls).location.url.map { |e| e.text }
63
- urls.size.should == 3
64
- urls.should include("http://preview.org")
65
- urls.should include("http://context.org")
66
- urls.should include("http://object.org")
119
+ it "holdingComplex child element" do
120
+ xml = "<mods #{@ns_decl}>
121
+ <location>
122
+ <physicalLocation>Menlo Park Public Library</physicalLocation>
123
+ <holdingExternal>
124
+ <holding xmlns:iso20775='info:ofi/fmt:xml:xsd:iso20775' xsi:schemaLocation='info:ofi/fmt:xml:xsd:iso20775 http://www.loc.gov/standards/iso20775/N130_ISOholdings_v6_1.xsd'>
125
+ <institutionIdentifier>
126
+ <value>JRF</value>
127
+ <typeOrSource>
128
+ <pointer>http://worldcat.org/registry/institutions/</pointer>
129
+ </typeOrSource>
130
+ </institutionIdentifier>
131
+ <physicalLocation>Menlo Park Public Library</physicalLocation>
132
+ <physicalAddress>
133
+ <text>Menlo Park, CA 94025 United States </text>
134
+ </physicalAddress>
135
+ <electronicAddress>
136
+ <text>http://www.worldcat.org/wcpa/oclc/15550774? page=frame&amp;url=%3D%3FUTF-8%3FB%FaHR0cDovL2NhdGFsb2cucGxzaW5mby5vcmcvc2VhcmNoL2kwMTk1MDM4NjMw%3F%3D&amp;title=Menlo+Park+Public+Library&amp;linktype=opac&amp;detail=JRF%3AMenlo+Park+Public+Library%3APublic&amp;app=wcapi&amp;id=OCL-OCLC+Staff+use</text>
137
+ </electronicAddress>
138
+ <holdingSimple>
139
+ <copiesSummary>
140
+ <copiesCount>1</copiesCount>
141
+ </copiesSummary>
142
+ </holdingSimple>
143
+ </holding>
144
+ </holdingExternal>
145
+ </mods>"
146
+ @mods_rec.from_str(xml).location.holdingExternal.should be_an_instance_of(Nokogiri::XML::NodeSet)
147
+ @mods_rec.from_str(xml).location.holdingExternal.first.should be_an_instance_of(Nokogiri::XML::Element)
67
148
  end
68
- context "attributes" do
149
+
150
+ end # WITH namespaces
151
+
152
+ context "WITHOUT namespaces" do
153
+ before(:all) do
154
+ @url_and_phys = '<mods><location>
155
+ <url displayLabel="Digital collection of 46 images available online" usage="primary display">http://searchworks.stanford.edu/?f%5Bcollection%5D%5B%5D=The+Reid+W.+Dennis+Collection+of+California+Lithographs&amp;view=gallery</url>
156
+ </location><location>
157
+ <physicalLocation>Department of Special Collections, Stanford University Libraries, Stanford, CA 94305.</physicalLocation>
158
+ </location></mods>'
159
+ # from http://www.loc.gov/standards/mods/v3/mods-userguide-elements.html !!
160
+ # sublocation is not allowed directly under location
161
+ @incorrect = '<mods><location>
162
+ <physicalLocation>Library of Congress </physicalLocation>
163
+ <sublocation>Prints and Photographs Division Washington, D.C. 20540 USA</sublocation>
164
+ <shelfLocator>DAG no. 1410</shelfLocator>
165
+ </location></mods>'
166
+ end
167
+
168
+ context "physicalLocation child element" do
69
169
  before(:all) do
70
- @url_attribs = '<mods><location>
71
- <url displayLabel="Digital collection of 46 images available online" usage="primary display">http://searchworks.stanford.edu/?f%5Bcollection%5D%5B%5D=The+Reid+W.+Dennis+Collection+of+California+Lithographs&amp;view=gallery</url>
72
- </location></mods>'
170
+ @phys_loc_only = '<mods><location><physicalLocation>here</physicalLocation></location></mods>'
171
+ @phys_loc_authority = '<mods><location><physicalLocation authority="marcorg">MnRM</physicalLocation></location></mods>'
73
172
  end
74
- it "should recognize displayLabel attribute" do
75
- @mods_rec.from_str(@url_attribs).location.url.displayLabel.should == ["Digital collection of 46 images available online"]
173
+ it "should have access to text value of element" do
174
+ @mods_rec.from_str(@phys_loc_only, false)
175
+ @mods_rec.location.physicalLocation.text.should == "here"
176
+ @mods_rec.from_str(@phys_loc_authority, false)
177
+ @mods_rec.location.physicalLocation.map { |n| n.text }.should == ["MnRM"]
76
178
  end
77
- it "should recognize access attribute" do
78
- vals = @mods_rec.from_str(@mult_flavor_loc_urls).location.url.access
79
- vals.size.should == 3
80
- vals.should include("preview")
81
- vals.should include("object in context")
82
- vals.should include("raw object")
179
+ it "should recognize authority attribute" do
180
+ @mods_rec.from_str(@phys_loc_authority, false)
181
+ @mods_rec.location.physicalLocation.authority.should == ["marcorg"]
83
182
  end
84
- it "should recognize usage attribute" do
85
- @mods_rec.from_str(@url_attribs).location.url.usage.should == ["primary display"]
183
+ it "should recognize displayLabel attribute" do
184
+ @mods_rec.from_str('<mods><location><physicalLocation displayLabel="Correspondence">some address</physicalLocation></location></mods>', false)
185
+ @mods_rec.location.physicalLocation.displayLabel.should == ["Correspondence"]
186
+ end
187
+ end
188
+
189
+ it "shelfLocator child element" do
190
+ shelf_loc = '<mods><location>
191
+ <physicalLocation>Library of Congress </physicalLocation>
192
+ <shelfLocator>DAG no. 1410</shelfLocator>
193
+ </location></mods>'
194
+ @mods_rec.from_str(shelf_loc, false)
195
+ @mods_rec.location.shelfLocator.map { |n| n.text }.should == ["DAG no. 1410"]
196
+ end
197
+
198
+ context "url child element" do
199
+ before(:all) do
200
+ @empty_loc_url = '<mods><location><url/></location></mods>'
201
+ @mult_flavor_loc_urls = '<mods><location>
202
+ <url access="preview">http://preview.org</url>
203
+ <url access="object in context">http://context.org</url>
204
+ <url access="raw object">http://object.org</url>
205
+ </location></mods>'
86
206
  end
87
- it "should recognize note attribute" do
88
- @mods_rec.from_str('<mods><location><url note="something">http://somewhere.org</url></location></mods>')
89
- @mods_rec.location.url.note.should == ["something"]
207
+ it "should have access to text value of element" do
208
+ urls = @mods_rec.from_str(@mult_flavor_loc_urls, false).location.url.map { |e| e.text }
209
+ urls.size.should == 3
210
+ urls.should include("http://preview.org")
211
+ urls.should include("http://context.org")
212
+ urls.should include("http://object.org")
90
213
  end
91
- it "should recognize dateLastAccessed attribute" do
92
- @mods_rec.from_str('<mods><location><url dateLastAccessed="something">http://somewhere.org</url></location></mods>')
93
- @mods_rec.location.url.dateLastAccessed.should == ["something"]
214
+ context "attributes" do
215
+ before(:all) do
216
+ @url_attribs = '<mods><location>
217
+ <url displayLabel="Digital collection of 46 images available online" usage="primary display">http://searchworks.stanford.edu/?f%5Bcollection%5D%5B%5D=The+Reid+W.+Dennis+Collection+of+California+Lithographs&amp;view=gallery</url>
218
+ </location></mods>'
219
+ end
220
+ it "should recognize displayLabel attribute" do
221
+ @mods_rec.from_str(@url_attribs, false).location.url.displayLabel.should == ["Digital collection of 46 images available online"]
222
+ end
223
+ it "should recognize access attribute" do
224
+ vals = @mods_rec.from_str(@mult_flavor_loc_urls, false).location.url.access
225
+ vals.size.should == 3
226
+ vals.should include("preview")
227
+ vals.should include("object in context")
228
+ vals.should include("raw object")
229
+ end
230
+ it "should recognize usage attribute" do
231
+ @mods_rec.from_str(@url_attribs, false).location.url.usage.should == ["primary display"]
232
+ end
233
+ it "should recognize note attribute" do
234
+ @mods_rec.from_str('<mods><location><url note="something">http://somewhere.org</url></location></mods>', false)
235
+ @mods_rec.location.url.note.should == ["something"]
236
+ end
237
+ it "should recognize dateLastAccessed attribute" do
238
+ @mods_rec.from_str('<mods><location><url dateLastAccessed="something">http://somewhere.org</url></location></mods>', false)
239
+ @mods_rec.location.url.dateLastAccessed.should == ["something"]
240
+ end
241
+ end # attributes
242
+ it "should have array with empty string for single empty url element" do
243
+ @mods_rec.from_str(@empty_loc_url, false).location.url.map { |n| n.text }.should == [""]
94
244
  end
95
- end # attributes
96
- it "should have array with empty string for single empty url element" do
97
- @mods_rec.from_str(@empty_loc_url).location.url.map { |n| n.text }.should == [""]
245
+ end # url child element
246
+
247
+ it "holdingSimple child element" do
248
+ xml = '<mods><location>
249
+ <physicalLocation authority="marcorg">MnRM</physicalLocation>
250
+ <holdingSimple>
251
+ <copyInformation>
252
+ <sublocation>Patient reading room</sublocation>
253
+ <shelfLocator>QH511.A1J68</shelfLocator>
254
+ <enumerationAndChronology unitType="1"> v.1-v.8 1970-1976</enumerationAndChronology>
255
+ </copyInformation>
256
+ </holdingSimple></location></mods>'
257
+ @mods_rec.from_str(xml, false).location.holdingSimple.should be_an_instance_of(Nokogiri::XML::NodeSet)
258
+ @mods_rec.from_str(xml, false).location.holdingSimple.first.should be_an_instance_of(Nokogiri::XML::Element)
98
259
  end
99
- end # url child element
100
-
101
- it "holdingSimple child element" do
102
- xml = '<mods><location>
103
- <physicalLocation authority="marcorg">MnRM</physicalLocation>
104
- <holdingSimple>
105
- <copyInformation>
106
- <sublocation>Patient reading room</sublocation>
107
- <shelfLocator>QH511.A1J68</shelfLocator>
108
- <enumerationAndChronology unitType="1"> v.1-v.8 1970-1976</enumerationAndChronology>
109
- </copyInformation>
110
- </holdingSimple></location></mods>'
111
- @mods_rec.from_str(xml).location.holdingSimple.should be_an_instance_of(Nokogiri::XML::NodeSet)
112
- @mods_rec.from_str(xml).location.holdingSimple.first.should be_an_instance_of(Nokogiri::XML::Element)
113
- end
114
- it "holdingComplex child element" do
115
- xml = '<mods>
116
- <location>
117
- <physicalLocation>Menlo Park Public Library</physicalLocation>
118
- <holdingExternal>
119
- <holding xmlns:iso20775="info:ofi/fmt:xml:xsd:iso20775" xsi:schemaLocation="info:ofi/fmt:xml:xsd:iso20775 http://www.loc.gov/standards/iso20775/N130_ISOholdings_v6_1.xsd">
120
- <institutionIdentifier>
121
- <value>JRF</value>
122
- <typeOrSource>
123
- <pointer>http://worldcat.org/registry/institutions/</pointer>
124
- </typeOrSource>
125
- </institutionIdentifier>
126
- <physicalLocation>Menlo Park Public Library</physicalLocation>
127
- <physicalAddress>
128
- <text>Menlo Park, CA 94025 United States </text>
129
- </physicalAddress>
130
- <electronicAddress>
131
- <text>http://www.worldcat.org/wcpa/oclc/15550774? page=frame&amp;url=%3D%3FUTF-8%3FB%FaHR0cDovL2NhdGFsb2cucGxzaW5mby5vcmcvc2VhcmNoL2kwMTk1MDM4NjMw%3F%3D&amp;title=Menlo+Park+Public+Library&amp;linktype=opac&amp;detail=JRF%3AMenlo+Park+Public+Library%3APublic&amp;app=wcapi&amp;id=OCL-OCLC+Staff+use</text>
132
- </electronicAddress>
133
- <holdingSimple>
134
- <copiesSummary>
135
- <copiesCount>1</copiesCount>
136
- </copiesSummary>
137
- </holdingSimple>
138
- </holding>
139
- </holdingExternal>
140
- </mods>'
141
- @mods_rec.from_str(xml).location.holdingExternal.should be_an_instance_of(Nokogiri::XML::NodeSet)
142
- @mods_rec.from_str(xml).location.holdingExternal.first.should be_an_instance_of(Nokogiri::XML::Element)
143
- end
260
+ it "holdingComplex child element" do
261
+ xml = '<mods>
262
+ <location>
263
+ <physicalLocation>Menlo Park Public Library</physicalLocation>
264
+ <holdingExternal>
265
+ <holding xmlns:iso20775="info:ofi/fmt:xml:xsd:iso20775" xsi:schemaLocation="info:ofi/fmt:xml:xsd:iso20775 http://www.loc.gov/standards/iso20775/N130_ISOholdings_v6_1.xsd">
266
+ <institutionIdentifier>
267
+ <value>JRF</value>
268
+ <typeOrSource>
269
+ <pointer>http://worldcat.org/registry/institutions/</pointer>
270
+ </typeOrSource>
271
+ </institutionIdentifier>
272
+ <physicalLocation>Menlo Park Public Library</physicalLocation>
273
+ <physicalAddress>
274
+ <text>Menlo Park, CA 94025 United States </text>
275
+ </physicalAddress>
276
+ <electronicAddress>
277
+ <text>http://www.worldcat.org/wcpa/oclc/15550774? page=frame&amp;url=%3D%3FUTF-8%3FB%FaHR0cDovL2NhdGFsb2cucGxzaW5mby5vcmcvc2VhcmNoL2kwMTk1MDM4NjMw%3F%3D&amp;title=Menlo+Park+Public+Library&amp;linktype=opac&amp;detail=JRF%3AMenlo+Park+Public+Library%3APublic&amp;app=wcapi&amp;id=OCL-OCLC+Staff+use</text>
278
+ </electronicAddress>
279
+ <holdingSimple>
280
+ <copiesSummary>
281
+ <copiesCount>1</copiesCount>
282
+ </copiesSummary>
283
+ </holdingSimple>
284
+ </holding>
285
+ </holdingExternal>
286
+ </mods>'
287
+ @mods_rec.from_str(xml, false).location.holdingExternal.should be_an_instance_of(Nokogiri::XML::NodeSet)
288
+ @mods_rec.from_str(xml, false).location.holdingExternal.first.should be_an_instance_of(Nokogiri::XML::Element)
289
+ end
290
+
291
+ end # WITHOUT namespaces
292
+
144
293
  end
294
+
145
295
  end