active_shipping 1.0.0.pre4 → 1.0.0
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.
- checksums.yaml +4 -4
- checksums.yaml.gz.sig +0 -0
- data.tar.gz.sig +0 -0
- data/.yardopts +0 -1
- data/CHANGELOG.md +17 -0
- data/CONTRIBUTING.md +2 -2
- data/Gemfile.activesupport32 +1 -0
- data/README.md +1 -1
- data/Rakefile +1 -1
- data/active_shipping.gemspec +2 -2
- data/lib/active_shipping.rb +2 -3
- data/lib/active_shipping/carriers.rb +1 -0
- data/lib/active_shipping/carriers/canada_post_pws.rb +281 -266
- data/lib/active_shipping/carriers/correios.rb +285 -0
- data/lib/active_shipping/carriers/fedex.rb +205 -199
- data/lib/active_shipping/carriers/stamps.rb +218 -219
- data/lib/active_shipping/carriers/ups.rb +287 -48
- data/lib/active_shipping/carriers/usps.rb +3 -3
- data/lib/active_shipping/delivery_date_estimate.rb +21 -0
- data/lib/active_shipping/delivery_date_estimates_response.rb +11 -0
- data/lib/active_shipping/errors.rb +20 -1
- data/lib/active_shipping/location.rb +0 -5
- data/lib/active_shipping/response.rb +0 -15
- data/lib/active_shipping/version.rb +1 -1
- data/test/credentials.yml +11 -3
- data/test/fixtures/xml/correios/book_response.xml +13 -0
- data/test/fixtures/xml/correios/book_response_invalid.xml +13 -0
- data/test/fixtures/xml/correios/clothes_response.xml +43 -0
- data/test/fixtures/xml/correios/poster_response.xml +23 -0
- data/test/fixtures/xml/correios/shoes_response.xml +43 -0
- data/test/fixtures/xml/fedex/tracking_request.xml +13 -11
- data/test/fixtures/xml/fedex/tracking_response_bad_tracking_number.xml +20 -0
- data/test/fixtures/xml/fedex/tracking_response_delivered_at_door.xml +254 -0
- data/test/fixtures/xml/fedex/tracking_response_delivered_at_facility.xml +403 -0
- data/test/fixtures/xml/fedex/tracking_response_delivered_with_signature.xml +269 -0
- data/test/fixtures/xml/fedex/tracking_response_in_transit.xml +127 -0
- data/test/fixtures/xml/fedex/tracking_response_multiple_results.xml +100 -0
- data/test/fixtures/xml/fedex/tracking_response_not_found.xml +52 -0
- data/test/fixtures/xml/fedex/tracking_response_shipment_exception.xml +209 -0
- data/test/fixtures/xml/ups/delivery_dates_response.xml +140 -0
- data/test/fixtures/xml/ups/package_exceeds_maximum_length.xml +12 -0
- data/test/fixtures/xml/ups/rate_single_service.xml +54 -0
- data/test/fixtures/xml/ups/rescheduled_shipment.xml +204 -0
- data/test/fixtures/xml/ups/test_real_home_as_residential_destination_response.xml +290 -1
- data/test/fixtures/xml/usps/delivered_extended_tracking_response.xml +11 -0
- data/test/remote/canada_post_pws_platform_test.rb +35 -22
- data/test/remote/canada_post_pws_test.rb +32 -40
- data/test/remote/correios_test.rb +83 -0
- data/test/remote/fedex_test.rb +95 -13
- data/test/remote/stamps_test.rb +1 -0
- data/test/remote/ups_test.rb +77 -40
- data/test/remote/usps_test.rb +13 -1
- data/test/test_helper.rb +12 -2
- data/test/unit/carriers/canada_post_pws_rating_test.rb +66 -59
- data/test/unit/carriers/canada_post_pws_shipping_test.rb +34 -23
- data/test/unit/carriers/correios_test.rb +244 -0
- data/test/unit/carriers/fedex_test.rb +161 -156
- data/test/unit/carriers/ups_test.rb +193 -1
- data/test/unit/carriers/usps_test.rb +14 -0
- data/test/unit/location_test.rb +0 -10
- metadata +63 -46
- metadata.gz.sig +0 -0
- data/lib/vendor/test_helper.rb +0 -6
- data/lib/vendor/xml_node/README +0 -36
- data/lib/vendor/xml_node/Rakefile +0 -21
- data/lib/vendor/xml_node/benchmark/bench_generation.rb +0 -30
- data/lib/vendor/xml_node/init.rb +0 -1
- data/lib/vendor/xml_node/lib/xml_node.rb +0 -221
- data/lib/vendor/xml_node/test/test_generating.rb +0 -89
- data/lib/vendor/xml_node/test/test_parsing.rb +0 -40
- data/test/fixtures/xml/fedex/tracking_response.xml +0 -151
- data/test/fixtures/xml/fedex/tracking_response_empty_destination.xml +0 -76
- data/test/fixtures/xml/fedex/tracking_response_no_destination.xml +0 -139
- data/test/fixtures/xml/fedex/tracking_response_no_ship_time.xml +0 -150
- data/test/fixtures/xml/fedex/tracking_response_with_estimated_delivery_date.xml +0 -95
- data/test/fixtures/xml/fedex/tracking_response_with_shipper_address.xml +0 -71
metadata.gz.sig
CHANGED
Binary file
|
data/lib/vendor/test_helper.rb
DELETED
data/lib/vendor/xml_node/README
DELETED
@@ -1,36 +0,0 @@
|
|
1
|
-
XML Node
|
2
|
-
==========
|
3
|
-
|
4
|
-
|
5
|
-
Example for generating xml:
|
6
|
-
|
7
|
-
# Create an atom like document
|
8
|
-
|
9
|
-
root = XmlNode.new 'feed' do |feed|
|
10
|
-
|
11
|
-
feed << XmlNode.new('id', 'tag:atom.com,2007:1')
|
12
|
-
feed << XmlNode.new('title', 'Atom test feed')
|
13
|
-
feed << XmlNode.new('author') do |author|
|
14
|
-
author << XmlNode.new("name", "tobi")
|
15
|
-
author << XmlNode.new("email", "tobi@gmail.com")
|
16
|
-
end
|
17
|
-
|
18
|
-
feed << XmlNode.new('entry') do |entry|
|
19
|
-
entry << XmlNode.new('title', 'First post')
|
20
|
-
entry << XmlNode.new('summary', 'Lorem ipsum', :type => 'xhtml')
|
21
|
-
entry << XmlNode.new('created_at', Time.now)
|
22
|
-
end
|
23
|
-
|
24
|
-
feed << XmlNode.new('dc:published', Time.now)
|
25
|
-
end
|
26
|
-
|
27
|
-
root.to_xml #=> Well formatted xml
|
28
|
-
|
29
|
-
|
30
|
-
Example for parsing xml:
|
31
|
-
|
32
|
-
|
33
|
-
xml = XmlNode.parse('<feed attr="1"><element>text</element><element>text</element></feed>')
|
34
|
-
xml['attr'] #=> '1'
|
35
|
-
xml.children['element'].text #=> 'text'
|
36
|
-
xml.children.each { |e| e... }
|
@@ -1,21 +0,0 @@
|
|
1
|
-
require 'rake'
|
2
|
-
require 'rake/testtask'
|
3
|
-
require 'rake/rdoctask'
|
4
|
-
|
5
|
-
desc 'Default: run unit tests.'
|
6
|
-
task :default => :test
|
7
|
-
|
8
|
-
desc 'Test the plugin.'
|
9
|
-
Rake::TestTask.new(:test) do |t|
|
10
|
-
t.libs << 'lib'
|
11
|
-
t.pattern = 'test/**/test_*.rb'
|
12
|
-
t.verbose = true
|
13
|
-
end
|
14
|
-
|
15
|
-
desc 'Generate documentation for the calculations plugin.'
|
16
|
-
Rake::RDocTask.new(:rdoc) do |rdoc|
|
17
|
-
rdoc.rdoc_dir = 'rdoc'
|
18
|
-
rdoc.title = 'XmlNode'
|
19
|
-
rdoc.options << '--line-numbers --inline-source'
|
20
|
-
rdoc.rdoc_files.include('lib/**/*.rb')
|
21
|
-
end
|
@@ -1,30 +0,0 @@
|
|
1
|
-
require "benchmark"
|
2
|
-
require File.dirname(__FILE__) + "/../lib/xml_node"
|
3
|
-
|
4
|
-
class XmlNode
|
5
|
-
def to_xml_as_array
|
6
|
-
xml = []
|
7
|
-
document = REXML::Document.new
|
8
|
-
document << REXML::XMLDecl.new('1.0')
|
9
|
-
document << @element
|
10
|
-
document.write( xml, 0)
|
11
|
-
xml.to_s
|
12
|
-
end
|
13
|
-
|
14
|
-
def to_xml_no_format
|
15
|
-
xml = ''
|
16
|
-
document = REXML::Document.new
|
17
|
-
document << REXML::XMLDecl.new('1.0')
|
18
|
-
document << @element
|
19
|
-
document.write( xml)
|
20
|
-
xml
|
21
|
-
end
|
22
|
-
end
|
23
|
-
|
24
|
-
TESTS = 10000
|
25
|
-
|
26
|
-
Benchmark.bmbm do |results|
|
27
|
-
results.report { TESTS.times do XmlNode.new('feed') { |n| n << XmlNode.new('element', 'test'); n << XmlNode.new('element') }.to_xml end }
|
28
|
-
results.report { TESTS.times do XmlNode.new('feed') { |n| n << XmlNode.new('element', 'test'); n << XmlNode.new('element') }.to_xml_as_array end }
|
29
|
-
results.report { TESTS.times do XmlNode.new('feed') { |n| n << XmlNode.new('element', 'test'); n << XmlNode.new('element') }.to_xml_no_format end }
|
30
|
-
end
|
data/lib/vendor/xml_node/init.rb
DELETED
@@ -1 +0,0 @@
|
|
1
|
-
# Include hook code here
|
@@ -1,221 +0,0 @@
|
|
1
|
-
require 'rexml/document'
|
2
|
-
|
3
|
-
class Object
|
4
|
-
def to_xml_value
|
5
|
-
to_s
|
6
|
-
end
|
7
|
-
end
|
8
|
-
|
9
|
-
class NilClass
|
10
|
-
def to_xml_value
|
11
|
-
nil
|
12
|
-
end
|
13
|
-
end
|
14
|
-
|
15
|
-
class TrueClass
|
16
|
-
def to_xml_value
|
17
|
-
to_s
|
18
|
-
end
|
19
|
-
end
|
20
|
-
|
21
|
-
class FalseClass
|
22
|
-
def to_xml_value
|
23
|
-
to_s
|
24
|
-
end
|
25
|
-
end
|
26
|
-
|
27
|
-
class Time
|
28
|
-
def to_xml_value
|
29
|
-
xmlschema
|
30
|
-
end
|
31
|
-
end
|
32
|
-
|
33
|
-
class DateTime
|
34
|
-
def to_xml_value
|
35
|
-
xmlschema
|
36
|
-
end
|
37
|
-
end
|
38
|
-
|
39
|
-
class Date
|
40
|
-
def to_xml_value
|
41
|
-
to_time.xmlschema
|
42
|
-
end
|
43
|
-
end
|
44
|
-
|
45
|
-
class REXML::Element
|
46
|
-
def to_xml_element
|
47
|
-
self
|
48
|
-
end
|
49
|
-
end
|
50
|
-
|
51
|
-
class XmlNode
|
52
|
-
attr_accessor :child_nodes
|
53
|
-
attr_reader :element
|
54
|
-
|
55
|
-
class List
|
56
|
-
include Enumerable
|
57
|
-
|
58
|
-
def initialize(parent)
|
59
|
-
@parent = parent
|
60
|
-
@children = {}
|
61
|
-
end
|
62
|
-
|
63
|
-
def [](value)
|
64
|
-
node_for @parent.element.elements[value]
|
65
|
-
end
|
66
|
-
|
67
|
-
def []=(value, key)
|
68
|
-
@parent.element.elements[value.to_s] = key.to_xml_element
|
69
|
-
end
|
70
|
-
|
71
|
-
def each(&block)
|
72
|
-
@parent.element.each_element { |e| yield node_for(e) }
|
73
|
-
end
|
74
|
-
|
75
|
-
private
|
76
|
-
|
77
|
-
def node_for(element)
|
78
|
-
@parent.child_nodes[element] ||= XmlNode.new(element)
|
79
|
-
end
|
80
|
-
end
|
81
|
-
|
82
|
-
# Allows for very pretty xml generation akin to xml builder.
|
83
|
-
#
|
84
|
-
# Example:
|
85
|
-
#
|
86
|
-
# # Create an atom like document
|
87
|
-
# doc = Document.new
|
88
|
-
# doc.root = XmlNode.new 'feed' do |feed|
|
89
|
-
#
|
90
|
-
# feed << XmlNode.new('id', 'tag:atom.com,2007:1')
|
91
|
-
# feed << XmlNode.new('title', 'Atom test feed')
|
92
|
-
# feed << XmlNode.new('author') do |author|
|
93
|
-
# author << XmlNode.new("name", "tobi")
|
94
|
-
# author << XmlNode.new("email", "tobi@gmail.com")
|
95
|
-
# end
|
96
|
-
#
|
97
|
-
# feed << XmlNode.new('entry') do |entry|
|
98
|
-
# entry << XmlNode.new('title', 'First post')
|
99
|
-
# entry << XmlNode.new('summary', 'Lorem ipsum', :type => 'xhtml')
|
100
|
-
# entry << XmlNode.new('created_at', Time.now)
|
101
|
-
# end
|
102
|
-
#
|
103
|
-
# feed << XmlNode.new('dc:published', Time.now)
|
104
|
-
# end
|
105
|
-
#
|
106
|
-
def initialize(node, *args)
|
107
|
-
@element = if node.is_a?(REXML::Element)
|
108
|
-
node
|
109
|
-
else
|
110
|
-
REXML::Element.new(node)
|
111
|
-
end
|
112
|
-
|
113
|
-
@child_nodes = {}
|
114
|
-
|
115
|
-
if attributes = args.last.is_a?(Hash) ? args.pop : nil
|
116
|
-
attributes.each { |k, v| @element.add_attribute(k.to_s, v.to_xml_value) }
|
117
|
-
end
|
118
|
-
|
119
|
-
unless args[0].nil?
|
120
|
-
@element.text = args[0].to_xml_value
|
121
|
-
end
|
122
|
-
|
123
|
-
if block_given?
|
124
|
-
yield self
|
125
|
-
end
|
126
|
-
end
|
127
|
-
|
128
|
-
def self.parse(xml)
|
129
|
-
new(REXML::Document.new(xml).root)
|
130
|
-
end
|
131
|
-
|
132
|
-
def children
|
133
|
-
XmlNode::List.new(self)
|
134
|
-
end
|
135
|
-
|
136
|
-
def []=(key, value)
|
137
|
-
@element.attributes[key.to_s] = value.to_xml_value
|
138
|
-
end
|
139
|
-
|
140
|
-
def [](key)
|
141
|
-
@element.attributes[key]
|
142
|
-
end
|
143
|
-
|
144
|
-
# Add a namespace to the node
|
145
|
-
# Example
|
146
|
-
#
|
147
|
-
# node.namespace 'http://www.w3.org/2005/Atom'
|
148
|
-
# node.namespace :opensearch, 'http://a9.com/-/spec/opensearch/1.1/'
|
149
|
-
#
|
150
|
-
def namespace(*args)
|
151
|
-
args[0] = args[0].to_s if args[0].is_a?(Symbol)
|
152
|
-
@element.add_namespace(*args)
|
153
|
-
end
|
154
|
-
|
155
|
-
def cdata=(value)
|
156
|
-
new_cdata = REXML::CData.new( value )
|
157
|
-
@element.children.each do |c|
|
158
|
-
if c.is_a?(REXML::CData)
|
159
|
-
return @element.replace_child(c, new_cdata)
|
160
|
-
end
|
161
|
-
end
|
162
|
-
@element << new_cdata
|
163
|
-
rescue RuntimeError => e
|
164
|
-
@element << REXML::Text.new(e.message)
|
165
|
-
end
|
166
|
-
|
167
|
-
def cdata
|
168
|
-
@element.cdatas.first.to_s
|
169
|
-
end
|
170
|
-
|
171
|
-
def name
|
172
|
-
@element.name
|
173
|
-
end
|
174
|
-
|
175
|
-
def text=(value)
|
176
|
-
@element.text = REXML::Text.new( value )
|
177
|
-
end
|
178
|
-
|
179
|
-
def text
|
180
|
-
@element.text
|
181
|
-
end
|
182
|
-
|
183
|
-
def find(scope, xpath)
|
184
|
-
case scope
|
185
|
-
when :first
|
186
|
-
elem = @element.elements[xpath]
|
187
|
-
elem.nil? ? nil : child_nodes[elem] ||= XmlNode.new(elem)
|
188
|
-
when :all
|
189
|
-
@element.elements.to_a(xpath).collect { |e| child_nodes[e] ||= XmlNode.new(e) }
|
190
|
-
end
|
191
|
-
end
|
192
|
-
|
193
|
-
def <<(elem)
|
194
|
-
case elem
|
195
|
-
when nil then return
|
196
|
-
when Array
|
197
|
-
elem.each { |e| @element << e.to_xml_element }
|
198
|
-
else
|
199
|
-
@element << elem.to_xml_element
|
200
|
-
end
|
201
|
-
end
|
202
|
-
|
203
|
-
def to_xml_element
|
204
|
-
@element
|
205
|
-
end
|
206
|
-
|
207
|
-
def to_s
|
208
|
-
@element.to_s
|
209
|
-
end
|
210
|
-
|
211
|
-
# Use to get pretty formatted xml including DECL
|
212
|
-
# instructions
|
213
|
-
def to_xml
|
214
|
-
xml = []
|
215
|
-
document = REXML::Document.new
|
216
|
-
document << REXML::XMLDecl.new('1.0')
|
217
|
-
document << @element
|
218
|
-
document.write( xml, 0)
|
219
|
-
xml.join
|
220
|
-
end
|
221
|
-
end
|
@@ -1,89 +0,0 @@
|
|
1
|
-
require 'rubygems'
|
2
|
-
require 'active_support'
|
3
|
-
require "test/unit"
|
4
|
-
|
5
|
-
require File.dirname(__FILE__) + "/../lib/xml_node"
|
6
|
-
|
7
|
-
class TestXmlNode < Test::Unit::TestCase
|
8
|
-
def test_init_sanity
|
9
|
-
assert_raise(ArgumentError) { XmlNode.new }
|
10
|
-
assert_nothing_raised { XmlNode.new('feed') }
|
11
|
-
assert_nothing_raised { XmlNode.new('feed', 'content') }
|
12
|
-
assert_nothing_raised { XmlNode.new('feed', :attribute => true) }
|
13
|
-
assert_nothing_raised { XmlNode.new('feed', 'content', :attribute => true) }
|
14
|
-
end
|
15
|
-
|
16
|
-
def test_element_generation
|
17
|
-
assert_equal '<feed/>', XmlNode.new('feed').to_s
|
18
|
-
assert_equal '<feed>content</feed>', XmlNode.new('feed', 'content').to_s
|
19
|
-
assert_equal "<feed attr='true'>content</feed>", XmlNode.new('feed', 'content', :attr => true).to_s
|
20
|
-
assert_equal "<feed attr='true'/>", XmlNode.new('feed', :attr => true).to_s
|
21
|
-
end
|
22
|
-
|
23
|
-
def test_nesting
|
24
|
-
assert_equal '<feed><element/></feed>', XmlNode.new('feed') { |n| n << XmlNode.new('element') }.to_s
|
25
|
-
assert_equal '<feed><element><id>1</id></element></feed>', XmlNode.new('feed') { |n| n << XmlNode.new('element') { |n| n << XmlNode.new('id', '1') } }.to_s
|
26
|
-
end
|
27
|
-
|
28
|
-
def test_cdata
|
29
|
-
node = XmlNode.new('feed')
|
30
|
-
node.text = '...'
|
31
|
-
node.cdata = 'Goodbye world'
|
32
|
-
node.cdata = 'Hello world'
|
33
|
-
|
34
|
-
assert_equal '<feed>...<![CDATA[Hello world]]></feed>', node.to_s
|
35
|
-
assert_equal 'Hello world', node.cdata
|
36
|
-
assert_equal '...', node.text
|
37
|
-
end
|
38
|
-
|
39
|
-
def test_text
|
40
|
-
node = XmlNode.new('feed')
|
41
|
-
node.text = 'Hello world'
|
42
|
-
|
43
|
-
assert_equal '<feed>Hello world</feed>', node.to_s
|
44
|
-
assert_equal 'Hello world', node.text
|
45
|
-
end
|
46
|
-
|
47
|
-
def test_attributes
|
48
|
-
node = XmlNode.new('feed')
|
49
|
-
node['attr'] = 1
|
50
|
-
assert_equal '1', node['attr']
|
51
|
-
end
|
52
|
-
|
53
|
-
def test_namespace
|
54
|
-
node = XmlNode.new('feed')
|
55
|
-
node.namespace 'http://www.w3.org/2005/Atom'
|
56
|
-
assert_equal "<feed xmlns='http://www.w3.org/2005/Atom'/>", node.to_s
|
57
|
-
end
|
58
|
-
|
59
|
-
def test_named_namespace
|
60
|
-
node = XmlNode.new('feed')
|
61
|
-
node.namespace :opensearch, 'http://a9.com/-/spec/opensearch/1.1/'
|
62
|
-
assert_equal "<feed xmlns:opensearch='http://a9.com/-/spec/opensearch/1.1/'/>", node.to_s
|
63
|
-
end
|
64
|
-
|
65
|
-
def test_generate_nice_xml
|
66
|
-
assert_equal "<?xml version='1.0'?>\n<feed>\n <element>test</element>\n <element/>\n</feed>", XmlNode.new('feed') { |n| n << XmlNode.new('element', 'test'); n << XmlNode.new('element') }.to_xml
|
67
|
-
end
|
68
|
-
|
69
|
-
def test_add_array_of_nodes
|
70
|
-
assert_equal '<feed><e>1</e><e>2</e><e>3</e></feed>', XmlNode.new('feed') { |n| n << [1, 2, 3].collect { |i| XmlNode.new('e', i) } }.to_s
|
71
|
-
end
|
72
|
-
|
73
|
-
def test_boolean
|
74
|
-
assert_equal '<boolean>true</boolean>', XmlNode.new('boolean', true).to_s
|
75
|
-
assert_equal '<boolean>false</boolean>', XmlNode.new('boolean', false).to_s
|
76
|
-
end
|
77
|
-
|
78
|
-
def test_nil
|
79
|
-
assert_equal '<nil/>', XmlNode.new('nil', nil).to_s
|
80
|
-
end
|
81
|
-
|
82
|
-
def test_dont_choke_on_nil_pushing
|
83
|
-
feed = XmlNode.new 'feed'
|
84
|
-
assert_nothing_raised do
|
85
|
-
feed << nil
|
86
|
-
end
|
87
|
-
assert_equal '<feed/>', feed.to_s
|
88
|
-
end
|
89
|
-
end
|
@@ -1,40 +0,0 @@
|
|
1
|
-
require 'rubygems'
|
2
|
-
require 'active_support'
|
3
|
-
require "test/unit"
|
4
|
-
|
5
|
-
require File.dirname(__FILE__) + "/../lib/xml_node"
|
6
|
-
|
7
|
-
class TestXmlNode < Test::Unit::TestCase
|
8
|
-
def test_parse_sanity
|
9
|
-
assert_raises(ArgumentError) { XmlNode.parse }
|
10
|
-
assert_nothing_raised { XmlNode.parse('<feed/>') }
|
11
|
-
end
|
12
|
-
|
13
|
-
def test_parse_attributes
|
14
|
-
node = XmlNode.parse('<feed attr="1"/>')
|
15
|
-
assert_equal '1', node['attr']
|
16
|
-
assert_equal nil, node['attr2']
|
17
|
-
end
|
18
|
-
|
19
|
-
def test_parse_children
|
20
|
-
node = XmlNode.parse('<feed><element>text</element></feed>')
|
21
|
-
assert_equal XmlNode, node.children['element'].class
|
22
|
-
assert_equal 'text', node.children['element'].text
|
23
|
-
end
|
24
|
-
|
25
|
-
def test_enumerate_children
|
26
|
-
count = 0
|
27
|
-
XmlNode.parse('<feed><element>text</element><element>text</element></feed>').children.each { count += 1 }
|
28
|
-
assert_equal 2, count
|
29
|
-
end
|
30
|
-
|
31
|
-
def test_find_first
|
32
|
-
xml = XmlNode.parse('<feed><elem>1</elem><elem>2</elem><elem>3</elem></feed>')
|
33
|
-
assert_equal '1', xml.find(:first, '//elem').text
|
34
|
-
end
|
35
|
-
|
36
|
-
def test_find_all
|
37
|
-
xml = XmlNode.parse('<feed><elem>1</elem><elem>2</elem><elem>3</elem></feed>')
|
38
|
-
assert_equal %w(1 2 3), xml.find(:all, '//elem').collect(&:text)
|
39
|
-
end
|
40
|
-
end
|