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.
Files changed (76) hide show
  1. checksums.yaml +4 -4
  2. checksums.yaml.gz.sig +0 -0
  3. data.tar.gz.sig +0 -0
  4. data/.yardopts +0 -1
  5. data/CHANGELOG.md +17 -0
  6. data/CONTRIBUTING.md +2 -2
  7. data/Gemfile.activesupport32 +1 -0
  8. data/README.md +1 -1
  9. data/Rakefile +1 -1
  10. data/active_shipping.gemspec +2 -2
  11. data/lib/active_shipping.rb +2 -3
  12. data/lib/active_shipping/carriers.rb +1 -0
  13. data/lib/active_shipping/carriers/canada_post_pws.rb +281 -266
  14. data/lib/active_shipping/carriers/correios.rb +285 -0
  15. data/lib/active_shipping/carriers/fedex.rb +205 -199
  16. data/lib/active_shipping/carriers/stamps.rb +218 -219
  17. data/lib/active_shipping/carriers/ups.rb +287 -48
  18. data/lib/active_shipping/carriers/usps.rb +3 -3
  19. data/lib/active_shipping/delivery_date_estimate.rb +21 -0
  20. data/lib/active_shipping/delivery_date_estimates_response.rb +11 -0
  21. data/lib/active_shipping/errors.rb +20 -1
  22. data/lib/active_shipping/location.rb +0 -5
  23. data/lib/active_shipping/response.rb +0 -15
  24. data/lib/active_shipping/version.rb +1 -1
  25. data/test/credentials.yml +11 -3
  26. data/test/fixtures/xml/correios/book_response.xml +13 -0
  27. data/test/fixtures/xml/correios/book_response_invalid.xml +13 -0
  28. data/test/fixtures/xml/correios/clothes_response.xml +43 -0
  29. data/test/fixtures/xml/correios/poster_response.xml +23 -0
  30. data/test/fixtures/xml/correios/shoes_response.xml +43 -0
  31. data/test/fixtures/xml/fedex/tracking_request.xml +13 -11
  32. data/test/fixtures/xml/fedex/tracking_response_bad_tracking_number.xml +20 -0
  33. data/test/fixtures/xml/fedex/tracking_response_delivered_at_door.xml +254 -0
  34. data/test/fixtures/xml/fedex/tracking_response_delivered_at_facility.xml +403 -0
  35. data/test/fixtures/xml/fedex/tracking_response_delivered_with_signature.xml +269 -0
  36. data/test/fixtures/xml/fedex/tracking_response_in_transit.xml +127 -0
  37. data/test/fixtures/xml/fedex/tracking_response_multiple_results.xml +100 -0
  38. data/test/fixtures/xml/fedex/tracking_response_not_found.xml +52 -0
  39. data/test/fixtures/xml/fedex/tracking_response_shipment_exception.xml +209 -0
  40. data/test/fixtures/xml/ups/delivery_dates_response.xml +140 -0
  41. data/test/fixtures/xml/ups/package_exceeds_maximum_length.xml +12 -0
  42. data/test/fixtures/xml/ups/rate_single_service.xml +54 -0
  43. data/test/fixtures/xml/ups/rescheduled_shipment.xml +204 -0
  44. data/test/fixtures/xml/ups/test_real_home_as_residential_destination_response.xml +290 -1
  45. data/test/fixtures/xml/usps/delivered_extended_tracking_response.xml +11 -0
  46. data/test/remote/canada_post_pws_platform_test.rb +35 -22
  47. data/test/remote/canada_post_pws_test.rb +32 -40
  48. data/test/remote/correios_test.rb +83 -0
  49. data/test/remote/fedex_test.rb +95 -13
  50. data/test/remote/stamps_test.rb +1 -0
  51. data/test/remote/ups_test.rb +77 -40
  52. data/test/remote/usps_test.rb +13 -1
  53. data/test/test_helper.rb +12 -2
  54. data/test/unit/carriers/canada_post_pws_rating_test.rb +66 -59
  55. data/test/unit/carriers/canada_post_pws_shipping_test.rb +34 -23
  56. data/test/unit/carriers/correios_test.rb +244 -0
  57. data/test/unit/carriers/fedex_test.rb +161 -156
  58. data/test/unit/carriers/ups_test.rb +193 -1
  59. data/test/unit/carriers/usps_test.rb +14 -0
  60. data/test/unit/location_test.rb +0 -10
  61. metadata +63 -46
  62. metadata.gz.sig +0 -0
  63. data/lib/vendor/test_helper.rb +0 -6
  64. data/lib/vendor/xml_node/README +0 -36
  65. data/lib/vendor/xml_node/Rakefile +0 -21
  66. data/lib/vendor/xml_node/benchmark/bench_generation.rb +0 -30
  67. data/lib/vendor/xml_node/init.rb +0 -1
  68. data/lib/vendor/xml_node/lib/xml_node.rb +0 -221
  69. data/lib/vendor/xml_node/test/test_generating.rb +0 -89
  70. data/lib/vendor/xml_node/test/test_parsing.rb +0 -40
  71. data/test/fixtures/xml/fedex/tracking_response.xml +0 -151
  72. data/test/fixtures/xml/fedex/tracking_response_empty_destination.xml +0 -76
  73. data/test/fixtures/xml/fedex/tracking_response_no_destination.xml +0 -139
  74. data/test/fixtures/xml/fedex/tracking_response_no_ship_time.xml +0 -150
  75. data/test/fixtures/xml/fedex/tracking_response_with_estimated_delivery_date.xml +0 -95
  76. data/test/fixtures/xml/fedex/tracking_response_with_shipper_address.xml +0 -71
metadata.gz.sig CHANGED
Binary file
@@ -1,6 +0,0 @@
1
- #!/usr/bin/env ruby
2
- $:.unshift(File.dirname(__FILE__) + '/../lib')
3
-
4
- require 'test/unit'
5
- require 'active_shipping'
6
- require 'mocha'
@@ -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
@@ -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