yob-roxml 3.1.6
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 +7 -0
- data/.gitmodules +3 -0
- data/History.txt +354 -0
- data/LICENSE +20 -0
- data/README.rdoc +195 -0
- data/Rakefile +117 -0
- data/TODO +37 -0
- data/VERSION +1 -0
- data/examples/amazon.rb +35 -0
- data/examples/current_weather.rb +27 -0
- data/examples/dashed_elements.rb +20 -0
- data/examples/library.rb +40 -0
- data/examples/posts.rb +27 -0
- data/examples/rails.rb +70 -0
- data/examples/twitter.rb +37 -0
- data/examples/xml/active_record.xml +70 -0
- data/examples/xml/amazon.xml +133 -0
- data/examples/xml/current_weather.xml +89 -0
- data/examples/xml/dashed_elements.xml +52 -0
- data/examples/xml/posts.xml +23 -0
- data/examples/xml/twitter.xml +422 -0
- data/lib/roxml.rb +556 -0
- data/lib/roxml/definition.rb +238 -0
- data/lib/roxml/hash_definition.rb +25 -0
- data/lib/roxml/xml.rb +40 -0
- data/lib/roxml/xml/parsers/libxml.rb +85 -0
- data/lib/roxml/xml/parsers/nokogiri.rb +82 -0
- data/lib/roxml/xml/references.rb +322 -0
- data/roxml.gemspec +206 -0
- data/spec/definition_spec.rb +494 -0
- data/spec/examples/active_record_spec.rb +40 -0
- data/spec/examples/amazon_spec.rb +54 -0
- data/spec/examples/current_weather_spec.rb +37 -0
- data/spec/examples/dashed_elements_spec.rb +20 -0
- data/spec/examples/library_spec.rb +46 -0
- data/spec/examples/post_spec.rb +24 -0
- data/spec/examples/twitter_spec.rb +32 -0
- data/spec/roxml_spec.rb +372 -0
- data/spec/shared_specs.rb +15 -0
- data/spec/spec.opts +1 -0
- data/spec/spec_helper.rb +14 -0
- data/spec/support/libxml.rb +3 -0
- data/spec/support/nokogiri.rb +3 -0
- data/spec/xml/array_spec.rb +36 -0
- data/spec/xml/attributes_spec.rb +71 -0
- data/spec/xml/encoding_spec.rb +52 -0
- data/spec/xml/namespace_spec.rb +270 -0
- data/spec/xml/namespaces_spec.rb +67 -0
- data/spec/xml/object_spec.rb +82 -0
- data/spec/xml/parser_spec.rb +21 -0
- data/spec/xml/text_spec.rb +71 -0
- data/test/fixtures/book_malformed.xml +5 -0
- data/test/fixtures/book_pair.xml +8 -0
- data/test/fixtures/book_text_with_attribute.xml +5 -0
- data/test/fixtures/book_valid.xml +5 -0
- data/test/fixtures/book_with_authors.xml +7 -0
- data/test/fixtures/book_with_contributions.xml +9 -0
- data/test/fixtures/book_with_contributors.xml +7 -0
- data/test/fixtures/book_with_contributors_attrs.xml +7 -0
- data/test/fixtures/book_with_default_namespace.xml +9 -0
- data/test/fixtures/book_with_depth.xml +6 -0
- data/test/fixtures/book_with_octal_pages.xml +4 -0
- data/test/fixtures/book_with_publisher.xml +7 -0
- data/test/fixtures/book_with_wrapped_attr.xml +3 -0
- data/test/fixtures/dictionary_of_attr_name_clashes.xml +8 -0
- data/test/fixtures/dictionary_of_attrs.xml +6 -0
- data/test/fixtures/dictionary_of_guarded_names.xml +6 -0
- data/test/fixtures/dictionary_of_mixeds.xml +4 -0
- data/test/fixtures/dictionary_of_name_clashes.xml +10 -0
- data/test/fixtures/dictionary_of_names.xml +4 -0
- data/test/fixtures/dictionary_of_texts.xml +10 -0
- data/test/fixtures/library.xml +30 -0
- data/test/fixtures/library_uppercase.xml +30 -0
- data/test/fixtures/muffins.xml +3 -0
- data/test/fixtures/nameless_ageless_youth.xml +2 -0
- data/test/fixtures/node_with_attr_name_conflicts.xml +1 -0
- data/test/fixtures/node_with_name_conflicts.xml +4 -0
- data/test/fixtures/numerology.xml +4 -0
- data/test/fixtures/person.xml +1 -0
- data/test/fixtures/person_with_guarded_mothers.xml +13 -0
- data/test/fixtures/person_with_mothers.xml +10 -0
- data/test/load_test.rb +6 -0
- data/test/mocks/dictionaries.rb +57 -0
- data/test/mocks/mocks.rb +279 -0
- data/test/support/fixtures.rb +11 -0
- data/test/test_helper.rb +34 -0
- data/test/unit/definition_test.rb +235 -0
- data/test/unit/deprecations_test.rb +24 -0
- data/test/unit/to_xml_test.rb +81 -0
- data/test/unit/xml_attribute_test.rb +39 -0
- data/test/unit/xml_block_test.rb +81 -0
- data/test/unit/xml_bool_test.rb +122 -0
- data/test/unit/xml_convention_test.rb +150 -0
- data/test/unit/xml_hash_test.rb +115 -0
- data/test/unit/xml_initialize_test.rb +49 -0
- data/test/unit/xml_name_test.rb +141 -0
- data/test/unit/xml_namespace_test.rb +31 -0
- data/test/unit/xml_object_test.rb +205 -0
- data/test/unit/xml_required_test.rb +94 -0
- data/test/unit/xml_text_test.rb +71 -0
- data/website/index.html +98 -0
- metadata +300 -0
@@ -0,0 +1,15 @@
|
|
1
|
+
require 'spec/spec_helper'
|
2
|
+
|
3
|
+
describe "freezable xml reference", :shared => true do
|
4
|
+
describe "with :frozen option" do
|
5
|
+
it "should be frozen" do
|
6
|
+
@frozen.frozen?.should be_true
|
7
|
+
end
|
8
|
+
end
|
9
|
+
|
10
|
+
describe "without :frozen option" do
|
11
|
+
it "should not be frozen" do
|
12
|
+
@unfrozen.frozen?.should be_false
|
13
|
+
end
|
14
|
+
end
|
15
|
+
end
|
data/spec/spec.opts
ADDED
@@ -0,0 +1 @@
|
|
1
|
+
--colour
|
data/spec/spec_helper.rb
ADDED
@@ -0,0 +1,14 @@
|
|
1
|
+
require 'rubygems'
|
2
|
+
require 'pathname'
|
3
|
+
require 'test/support/fixtures'
|
4
|
+
require 'lib/roxml'
|
5
|
+
|
6
|
+
require 'spec/shared_specs' if defined?(Spec)
|
7
|
+
|
8
|
+
def xml_for(name)
|
9
|
+
Pathname.new(File.dirname(__FILE__)).expand_path.dirname.join("examples/xml/#{name}.xml")
|
10
|
+
end
|
11
|
+
|
12
|
+
class RoxmlObject
|
13
|
+
include ROXML
|
14
|
+
end
|
@@ -0,0 +1,36 @@
|
|
1
|
+
require 'spec/spec_helper'
|
2
|
+
|
3
|
+
module ArraySpec
|
4
|
+
class Book
|
5
|
+
include ROXML
|
6
|
+
xml_reader :id, :as => Integer
|
7
|
+
xml_reader :title
|
8
|
+
end
|
9
|
+
|
10
|
+
class Store
|
11
|
+
include ROXML
|
12
|
+
xml_reader :books, :from => 'books', :as => [Book]
|
13
|
+
end
|
14
|
+
|
15
|
+
class MyXml
|
16
|
+
include ROXML
|
17
|
+
xml_reader :store, :as => Store
|
18
|
+
end
|
19
|
+
end
|
20
|
+
|
21
|
+
|
22
|
+
describe ":as => []" do
|
23
|
+
context "with plural from" do
|
24
|
+
it "should accept the plural name as the name for each item" do
|
25
|
+
ArraySpec::MyXml.from_xml(%(
|
26
|
+
<myxml>
|
27
|
+
<store>
|
28
|
+
<books><id>1</id><title>first book</title></books>
|
29
|
+
<books><id>2</id><title>second book</title></books>
|
30
|
+
<books><id>3</id><title>third book</title></books>
|
31
|
+
</store>
|
32
|
+
</myxml>
|
33
|
+
)).store.books.size.should == 3
|
34
|
+
end
|
35
|
+
end
|
36
|
+
end
|
@@ -0,0 +1,71 @@
|
|
1
|
+
require 'spec/spec_helper'
|
2
|
+
|
3
|
+
describe ROXML::XMLAttributeRef do
|
4
|
+
before do
|
5
|
+
@xml = ROXML::XML.parse_string %(
|
6
|
+
<myxml>
|
7
|
+
<node name="first" />
|
8
|
+
<node name="second" />
|
9
|
+
<node name="third" />
|
10
|
+
</myxml>)
|
11
|
+
end
|
12
|
+
|
13
|
+
context "plain vanilla" do
|
14
|
+
before do
|
15
|
+
@ref = ROXML::XMLAttributeRef.new(OpenStruct.new(:name => 'name', :wrapper => 'node', :array? => false), RoxmlObject.new)
|
16
|
+
end
|
17
|
+
|
18
|
+
it "should return one instance" do
|
19
|
+
@ref.value_in(@xml).should == "first"
|
20
|
+
end
|
21
|
+
it "should output one instance"
|
22
|
+
end
|
23
|
+
|
24
|
+
context "with :as => []" do
|
25
|
+
before do
|
26
|
+
@ref = ROXML::XMLAttributeRef.new(OpenStruct.new(:name => 'name', :wrapper => 'node', :array? => true), RoxmlObject.new)
|
27
|
+
end
|
28
|
+
|
29
|
+
it "should collect all instances" do
|
30
|
+
@ref.value_in(@xml).should == ["first", "second", "third"]
|
31
|
+
end
|
32
|
+
|
33
|
+
it "should output all instances" do
|
34
|
+
xml = ROXML::XML.new_node('myxml')
|
35
|
+
@ref.update_xml(xml, ["first", "second", "third"])
|
36
|
+
xml.to_s.squeeze(' ').should == @xml.root.to_s.squeeze(' ')
|
37
|
+
end
|
38
|
+
end
|
39
|
+
|
40
|
+
context "when the namespaces are different" do
|
41
|
+
before do
|
42
|
+
@xml = ROXML::XML.parse_string %(
|
43
|
+
<document>
|
44
|
+
<myxml xmlns="http://example.com/three" xmlns:one="http://example.com/one" xmlns:two="http://example.com/two">
|
45
|
+
<one:node name="first" />
|
46
|
+
<two:node name="second" />
|
47
|
+
<node name="third" />
|
48
|
+
</myxml>
|
49
|
+
</document>
|
50
|
+
)
|
51
|
+
end
|
52
|
+
|
53
|
+
context "with :namespace => '*'" do
|
54
|
+
before do
|
55
|
+
@ref = ROXML::XMLAttributeRef.new(OpenStruct.new(:name => 'name', :wrapper => 'node', :array? => true, :namespace => '*'), RoxmlObject.new)
|
56
|
+
end
|
57
|
+
|
58
|
+
it "should collect all instances" do
|
59
|
+
pending "Test bug?"
|
60
|
+
@ref.value_in(@xml).should == ["first", "second", "third"]
|
61
|
+
end
|
62
|
+
|
63
|
+
it "should output all instances with namespaces" do
|
64
|
+
pending "Full namespace write support"
|
65
|
+
xml = ROXML::XML.new_node('result')
|
66
|
+
@ref.update_xml(xml, ["first", "second", "third"])
|
67
|
+
xml.should == @xml.root
|
68
|
+
end
|
69
|
+
end
|
70
|
+
end
|
71
|
+
end
|
@@ -0,0 +1,52 @@
|
|
1
|
+
require 'spec/spec_helper'
|
2
|
+
|
3
|
+
describe ROXML, "encoding" do
|
4
|
+
class TestResult
|
5
|
+
include ROXML
|
6
|
+
xml_accessor :message
|
7
|
+
end
|
8
|
+
|
9
|
+
context "when provided non-latin characters" do
|
10
|
+
it "should output those characters as input via methods" do
|
11
|
+
res = TestResult.new
|
12
|
+
res.message = "sadfk одловыа jjklsd " #random russian and english charecters
|
13
|
+
doc = ROXML::XML::Document.new
|
14
|
+
doc.root = res.to_xml
|
15
|
+
if defined?(Nokogiri)
|
16
|
+
doc.at('message').inner_text
|
17
|
+
else
|
18
|
+
doc.find_first('message').inner_xml
|
19
|
+
end.should == "sadfk одловыа jjklsd "
|
20
|
+
end
|
21
|
+
|
22
|
+
it "should output those characters as input via xml" do
|
23
|
+
res = TestResult.from_xml("<test_result><message>sadfk одловыа jjklsd </message></test_result>")
|
24
|
+
doc = ROXML::XML::Document.new
|
25
|
+
doc.root = res.to_xml
|
26
|
+
if defined?(Nokogiri)
|
27
|
+
doc.at('message').inner_text
|
28
|
+
else
|
29
|
+
doc.find_first('message').inner_xml
|
30
|
+
end.should == "sadfk одловыа jjklsd "
|
31
|
+
end
|
32
|
+
|
33
|
+
it "should allow override via the document" do
|
34
|
+
res = TestResult.from_xml("<test_result><message>sadfk одловыа jjklsd </message></test_result>")
|
35
|
+
if defined?(Nokogiri)
|
36
|
+
xml = res.to_xml
|
37
|
+
doc = xml.document
|
38
|
+
doc.root = xml
|
39
|
+
doc.encoding = 'ISO-8859-1'
|
40
|
+
doc.to_s.should include('ISO-8859-1')
|
41
|
+
doc.at('message').inner_text
|
42
|
+
else
|
43
|
+
doc = LibXML::XML::Document.new
|
44
|
+
doc.encoding = LibXML::XML::Encoding::ASCII
|
45
|
+
doc.root = res.to_xml
|
46
|
+
pending "Libxml bug"
|
47
|
+
doc.to_s.should include('ISO-8859-1')
|
48
|
+
doc.find_first('message').inner_xml
|
49
|
+
end.should == "sadfk одловыа jjklsd "
|
50
|
+
end
|
51
|
+
end
|
52
|
+
end
|
@@ -0,0 +1,270 @@
|
|
1
|
+
require 'spec/spec_helper.rb'
|
2
|
+
|
3
|
+
describe ROXML, "with namespaces" do
|
4
|
+
describe "for writing" do
|
5
|
+
before do
|
6
|
+
@xml = <<EOS
|
7
|
+
<?xml version="1.0" encoding="UTF-8"?>
|
8
|
+
<gronk:VApp name="My new vApp" status="1" href="https://vcloud.example.com/vapp/833" type="application/vnd.vmware.vcloud.vapp+xml" xmlns:vmw="http://foo.example.com" xmlns:gronk="http://gronk.example.com">
|
9
|
+
<gronk:NetworkConfig name="Network 1">
|
10
|
+
<vmw:FenceMode>allowInOut</vmw:FenceMode>
|
11
|
+
<vmw:Dhcp>true</vmw:Dhcp>
|
12
|
+
<gronk:errors>
|
13
|
+
<gronk:error>OhNo!</gronk:error>
|
14
|
+
<gronk:error>Another!</gronk:error>
|
15
|
+
</gronk:errors>
|
16
|
+
</gronk:NetworkConfig>
|
17
|
+
<foo />
|
18
|
+
<bar>
|
19
|
+
gronk
|
20
|
+
</bar>
|
21
|
+
</gronk:VApp>
|
22
|
+
EOS
|
23
|
+
end
|
24
|
+
|
25
|
+
class NetworkConfig
|
26
|
+
include ROXML
|
27
|
+
xml_namespace :gronk
|
28
|
+
|
29
|
+
xml_name 'NetworkConfig'
|
30
|
+
xml_reader :name, :from => '@name'
|
31
|
+
xml_reader :errors, :as => []
|
32
|
+
xml_accessor :fence_mode, :from => 'vmw:FenceMode'
|
33
|
+
xml_accessor :dhcp?, :from => 'vmw:Dhcp'
|
34
|
+
end
|
35
|
+
|
36
|
+
class VApp
|
37
|
+
include ROXML
|
38
|
+
xml_namespace :gronk
|
39
|
+
|
40
|
+
xml_name "VApp"
|
41
|
+
xml_reader :name, :from => '@name'
|
42
|
+
xml_reader :status, :from => '@status'
|
43
|
+
xml_reader :href, :from => '@href'
|
44
|
+
xml_reader :type, :from => '@type'
|
45
|
+
xml_accessor :foo, :from => 'foo', :namespace => false
|
46
|
+
xml_accessor :bar, :from => 'bar', :namespace => false
|
47
|
+
xml_accessor :network_configs, :as => [NetworkConfig], :namespace => :gronk
|
48
|
+
end
|
49
|
+
|
50
|
+
describe "#to_xml" do
|
51
|
+
it "should reproduce the input xml" do
|
52
|
+
output = ROXML::XML::Document.new
|
53
|
+
output.root = VApp.from_xml(@xml).to_xml
|
54
|
+
pending "Full namespace write support"
|
55
|
+
output.should == ROXML::XML.parse_string(@xml)
|
56
|
+
end
|
57
|
+
end
|
58
|
+
end
|
59
|
+
|
60
|
+
describe "roxml namespacey declaration", :shared => true do
|
61
|
+
context "with a namespacey :from" do
|
62
|
+
context "and an explicit :namespace" do
|
63
|
+
it "should raise" do
|
64
|
+
proc do
|
65
|
+
Class.new do
|
66
|
+
include ROXML
|
67
|
+
xml_reader :default_namespace_with_namespacey_from_and_explicit_namespace, :from => 'namespacey:with_namespacey_from', :namespace => 'explicit'
|
68
|
+
end
|
69
|
+
end.should raise_error(ROXML::ContradictoryNamespaces)
|
70
|
+
end
|
71
|
+
end
|
72
|
+
|
73
|
+
context "and :namespace => false" do
|
74
|
+
it "should raise" do
|
75
|
+
proc do
|
76
|
+
Class.new do
|
77
|
+
include ROXML
|
78
|
+
xml_reader :default_namespace_with_namespacey_from_and_namespace_false, :from => 'namespacey:with_namespacey_from', :namespace => false
|
79
|
+
end
|
80
|
+
end.should raise_error(ROXML::ContradictoryNamespaces)
|
81
|
+
end
|
82
|
+
end
|
83
|
+
end
|
84
|
+
end
|
85
|
+
|
86
|
+
describe "roxml namespacey declaration with default", :shared => true do
|
87
|
+
it_should_behave_like "roxml namespacey declaration"
|
88
|
+
|
89
|
+
it "should use the default namespace" do
|
90
|
+
@instance.default_namespace.should == 'default namespace node'
|
91
|
+
end
|
92
|
+
|
93
|
+
context "and :namespace => false" do
|
94
|
+
it "should find the namespace-less node" do
|
95
|
+
@instance.default_namespace_with_namespace_false.should == 'namespaceless node'
|
96
|
+
end
|
97
|
+
end
|
98
|
+
|
99
|
+
context "with an explicit :namespace" do
|
100
|
+
it "should use the explicit namespace" do
|
101
|
+
@instance.default_and_explicit_namespace == 'explicit namespace node'
|
102
|
+
end
|
103
|
+
end
|
104
|
+
|
105
|
+
context "with a namespace-less :from" do
|
106
|
+
it "should use the default namespace" do
|
107
|
+
@instance.default_namespace_with_namespaceless_from.should == 'default namespace node'
|
108
|
+
end
|
109
|
+
|
110
|
+
context "and :namespace => false" do
|
111
|
+
it "should find the namespace-less node" do
|
112
|
+
@instance.default_namespace_with_namespaceless_from_and_namespace_false.should == 'namespaceless node'
|
113
|
+
end
|
114
|
+
end
|
115
|
+
|
116
|
+
context "and an explicit :namespace" do
|
117
|
+
it "should use the explicit namespace" do
|
118
|
+
@instance.default_namespace_with_namespaceless_from_and_explicit_namespace.should == 'explicit namespace node'
|
119
|
+
end
|
120
|
+
end
|
121
|
+
end
|
122
|
+
|
123
|
+
context "with a namespacey :from" do
|
124
|
+
it "should use the :from namespace" do
|
125
|
+
@instance.default_namespace_with_namespacey_from.should == 'namespacey node'
|
126
|
+
end
|
127
|
+
end
|
128
|
+
end
|
129
|
+
|
130
|
+
context "with a default namespace declared" do
|
131
|
+
class DefaultNamespaceyObject
|
132
|
+
include ROXML
|
133
|
+
xml_namespace :default_declared
|
134
|
+
|
135
|
+
xml_reader :default_namespace
|
136
|
+
xml_reader :default_namespace_with_namespace_false, :namespace => false
|
137
|
+
xml_reader :default_and_explicit_namespace, :namespace => 'explicit'
|
138
|
+
xml_reader :default_namespace_with_namespaceless_from, :from => 'with_namespaceless_from'
|
139
|
+
xml_reader :default_namespace_with_namespaceless_from_and_explicit_namespace, :from => 'with_namespaceless_from', :namespace => 'explicit'
|
140
|
+
xml_reader :default_namespace_with_namespaceless_from_and_namespace_false, :from => 'with_namespaceless_from', :namespace => false
|
141
|
+
xml_reader :default_namespace_with_namespacey_from, :from => 'namespacey:with_namespacey_from'
|
142
|
+
|
143
|
+
# These are handled in the "roxml namespacey declaration" shared spec
|
144
|
+
# xml_reader :default_namespace_with_namespacey_from_and_namespace_false, :from => 'namespacey:with_namespaceless_from', :namespace => false
|
145
|
+
# xml_reader :default_namespace_with_namespacey_from_and_explicit_namespace, :from => 'namespacey:with_namespaceless_from', :namespace => 'explicit'
|
146
|
+
end
|
147
|
+
|
148
|
+
before do
|
149
|
+
@instance = DefaultNamespaceyObject.from_xml(%{
|
150
|
+
<book xmlns:namespacey="http://www.aws.com/aws" xmlns:default_declared="http://www.aws.com/default" xmlns:explicit="http://www.aws.com/different">
|
151
|
+
<default_declared:default_namespace>default namespace node</default_declared:default_namespace>
|
152
|
+
<namespacey:with_namespacey_from>namespacey node</namespacey:with_namespacey_from>
|
153
|
+
<explicit:with_namespaceless_from>explicit namespace node</explicit:with_namespaceless_from>
|
154
|
+
<with_namespaceless_from>namespaceless node</with_namespaceless_from>
|
155
|
+
<default_declared:with_namespaceless_from>default namespace node</default_declared:with_namespaceless_from>
|
156
|
+
<explicit:default_and_explicit_namespace>explicit namespace node</explicit:default_and_explicit_namespace>
|
157
|
+
<default_namespace_with_namespace_false>namespaceless node</default_namespace_with_namespace_false>
|
158
|
+
</book>
|
159
|
+
})
|
160
|
+
end
|
161
|
+
|
162
|
+
it_should_behave_like "roxml namespacey declaration with default"
|
163
|
+
end
|
164
|
+
|
165
|
+
context "with a default namespace on the root node" do
|
166
|
+
class XmlDefaultNamespaceyObject
|
167
|
+
include ROXML
|
168
|
+
xml_reader :default_namespace
|
169
|
+
xml_reader :default_namespace_with_namespace_false, :namespace => false
|
170
|
+
xml_reader :default_and_explicit_namespace, :namespace => 'explicit'
|
171
|
+
xml_reader :default_namespace_with_namespaceless_from, :from => 'with_namespaceless_from'
|
172
|
+
xml_reader :default_namespace_with_namespaceless_from_and_explicit_namespace, :from => 'with_namespaceless_from', :namespace => 'explicit'
|
173
|
+
xml_reader :default_namespace_with_namespaceless_from_and_namespace_false, :from => 'with_namespaceless_from', :namespace => false
|
174
|
+
xml_reader :default_namespace_with_namespacey_from, :from => 'namespacey:with_namespacey_from'
|
175
|
+
|
176
|
+
# These are handled in the "roxml namespacey declaration" shared spec
|
177
|
+
# xml_reader :default_namespace_with_namespacey_from_and_namespace_false, :from => 'namespacey:with_namespaceless_from', :namespace => false
|
178
|
+
# xml_reader :default_namespace_with_namespacey_from_and_explicit_namespace, :from => 'namespacey:with_namespaceless_from', :namespace => 'explicit'
|
179
|
+
end
|
180
|
+
|
181
|
+
before do
|
182
|
+
@instance = XmlDefaultNamespaceyObject.from_xml(%{
|
183
|
+
<book xmlns="http://www.aws.com/xml_default" xmlns:namespacey="http://www.aws.com/aws" xmlns:default_declared="http://www.aws.com/default" xmlns:explicit="http://www.aws.com/different">
|
184
|
+
<default_namespace>default namespace node</default_namespace>
|
185
|
+
<namespacey:with_namespacey_from>namespacey node</namespacey:with_namespacey_from>
|
186
|
+
<explicit:with_namespaceless_from>explicit namespace node</explicit:with_namespaceless_from>
|
187
|
+
<with_namespaceless_from xmlns="">namespaceless node</with_namespaceless_from>
|
188
|
+
<with_namespaceless_from>default namespace node</with_namespaceless_from>
|
189
|
+
<explicit:default_and_explicit_namespace>explicit namespace node</explicit:default_and_explicit_namespace>
|
190
|
+
<default_namespace_with_namespace_false xmlns="">namespaceless node</default_namespace_with_namespace_false>
|
191
|
+
</book>
|
192
|
+
})
|
193
|
+
end
|
194
|
+
|
195
|
+
it_should_behave_like "roxml namespacey declaration with default"
|
196
|
+
end
|
197
|
+
|
198
|
+
context "without a default namespace" do
|
199
|
+
class NamespaceyObject
|
200
|
+
include ROXML
|
201
|
+
|
202
|
+
xml_reader :no_default_namespace
|
203
|
+
xml_reader :no_default_namespace_with_namespace_false, :namespace => false
|
204
|
+
xml_reader :no_default_but_an_explicit_namespace, :namespace => 'explicit'
|
205
|
+
xml_reader :no_default_namespace_with_namespaceless_from, :from => 'with_namespaceless_from'
|
206
|
+
xml_reader :no_default_namespace_with_namespaceless_from_and_explicit_namespace, :from => 'with_namespaceless_from', :namespace => 'explicit'
|
207
|
+
xml_reader :no_default_namespace_with_namespaceless_from_and_namespace_false, :from => 'with_namespaceless_from', :namespace => false
|
208
|
+
xml_reader :no_default_namespace_with_namespacey_from, :from => 'namespacey:with_namespacey_from'
|
209
|
+
|
210
|
+
# These are handled in the "roxml namespacey declaration" shared spec
|
211
|
+
# xml_reader :no_default_namespace_with_namespacey_from_and_explicit_namespace, :from => 'namespacey:with_namespacey_from', :namespace => 'explicit'
|
212
|
+
# xml_reader :no_default_namespace_with_namespacey_from_and_namespace_false, :from => 'namespacey:with_namespacey_from', :namespace => false
|
213
|
+
end
|
214
|
+
|
215
|
+
before do
|
216
|
+
@instance = NamespaceyObject.from_xml(%{
|
217
|
+
<book xmlns:namespacey="http://www.aws.com/aws" xmlns:explicit="http://www.aws.com/different">
|
218
|
+
<namespacey:with_namespacey_from>namespacey node</namespacey:with_namespacey_from>
|
219
|
+
<explicit:with_namespaceless_from>explicit namespace node</explicit:with_namespaceless_from>
|
220
|
+
<with_namespaceless_from>namespaceless node</with_namespaceless_from>
|
221
|
+
<explicit:no_default_but_an_explicit_namespace>explicit namespace node</explicit:no_default_but_an_explicit_namespace>
|
222
|
+
<no_default_namespace_with_namespace_false>namespaceless node</no_default_namespace_with_namespace_false>
|
223
|
+
<no_default_namespace>namespaceless node</no_default_namespace>
|
224
|
+
</book>
|
225
|
+
})
|
226
|
+
end
|
227
|
+
|
228
|
+
it_should_behave_like "roxml namespacey declaration"
|
229
|
+
|
230
|
+
it "should find the namespace-less node" do
|
231
|
+
@instance.no_default_namespace.should == 'namespaceless node'
|
232
|
+
end
|
233
|
+
|
234
|
+
context "with :namespace => false" do
|
235
|
+
it "should find the namespace-less node" do
|
236
|
+
@instance.no_default_namespace_with_namespace_false.should == 'namespaceless node'
|
237
|
+
end
|
238
|
+
end
|
239
|
+
|
240
|
+
context "with an explicit :namespace" do
|
241
|
+
it "should use the explicit namespace" do
|
242
|
+
@instance.no_default_but_an_explicit_namespace.should == 'explicit namespace node'
|
243
|
+
end
|
244
|
+
end
|
245
|
+
|
246
|
+
context "with a namespace-less :from" do
|
247
|
+
it "should find the namespace-less node" do
|
248
|
+
@instance.no_default_namespace_with_namespaceless_from.should == 'namespaceless node'
|
249
|
+
end
|
250
|
+
|
251
|
+
context "and an explicit :namespace" do
|
252
|
+
it "should use the explicit namespace" do
|
253
|
+
@instance.no_default_namespace_with_namespaceless_from_and_explicit_namespace.should == 'explicit namespace node'
|
254
|
+
end
|
255
|
+
end
|
256
|
+
|
257
|
+
context "with :namespace => false" do
|
258
|
+
it "should find the namespace-less node" do
|
259
|
+
@instance.no_default_namespace_with_namespaceless_from_and_namespace_false.should == 'namespaceless node'
|
260
|
+
end
|
261
|
+
end
|
262
|
+
end
|
263
|
+
|
264
|
+
context "with a namespacey :from" do
|
265
|
+
it "should use the :from namespace" do
|
266
|
+
@instance.no_default_namespace_with_namespacey_from.should == 'namespacey node'
|
267
|
+
end
|
268
|
+
end
|
269
|
+
end
|
270
|
+
end
|