benhutton-active_shipping 0.9.13

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 (54) hide show
  1. data/CHANGELOG +38 -0
  2. data/MIT-LICENSE +20 -0
  3. data/README.markdown +142 -0
  4. data/lib/active_merchant/common.rb +14 -0
  5. data/lib/active_merchant/common/connection.rb +177 -0
  6. data/lib/active_merchant/common/country.rb +328 -0
  7. data/lib/active_merchant/common/error.rb +26 -0
  8. data/lib/active_merchant/common/post_data.rb +24 -0
  9. data/lib/active_merchant/common/posts_data.rb +63 -0
  10. data/lib/active_merchant/common/requires_parameters.rb +16 -0
  11. data/lib/active_merchant/common/utils.rb +22 -0
  12. data/lib/active_merchant/common/validateable.rb +76 -0
  13. data/lib/active_shipping.rb +49 -0
  14. data/lib/active_shipping/shipping/base.rb +13 -0
  15. data/lib/active_shipping/shipping/carrier.rb +70 -0
  16. data/lib/active_shipping/shipping/carriers.rb +20 -0
  17. data/lib/active_shipping/shipping/carriers/bogus_carrier.rb +16 -0
  18. data/lib/active_shipping/shipping/carriers/canada_post.rb +268 -0
  19. data/lib/active_shipping/shipping/carriers/fedex.rb +331 -0
  20. data/lib/active_shipping/shipping/carriers/kunaki.rb +165 -0
  21. data/lib/active_shipping/shipping/carriers/new_zealand_post.rb +139 -0
  22. data/lib/active_shipping/shipping/carriers/shipwire.rb +172 -0
  23. data/lib/active_shipping/shipping/carriers/ups.rb +390 -0
  24. data/lib/active_shipping/shipping/carriers/usps.rb +441 -0
  25. data/lib/active_shipping/shipping/location.rb +109 -0
  26. data/lib/active_shipping/shipping/package.rb +147 -0
  27. data/lib/active_shipping/shipping/rate_estimate.rb +54 -0
  28. data/lib/active_shipping/shipping/rate_response.rb +19 -0
  29. data/lib/active_shipping/shipping/response.rb +46 -0
  30. data/lib/active_shipping/shipping/shipment_event.rb +14 -0
  31. data/lib/active_shipping/shipping/tracking_response.rb +22 -0
  32. data/lib/active_shipping/version.rb +3 -0
  33. data/lib/certs/cacert.pem +7815 -0
  34. data/lib/certs/eParcel.dtd +111 -0
  35. data/lib/vendor/quantified/MIT-LICENSE +22 -0
  36. data/lib/vendor/quantified/README.markdown +49 -0
  37. data/lib/vendor/quantified/Rakefile +21 -0
  38. data/lib/vendor/quantified/init.rb +0 -0
  39. data/lib/vendor/quantified/lib/quantified.rb +8 -0
  40. data/lib/vendor/quantified/lib/quantified/attribute.rb +208 -0
  41. data/lib/vendor/quantified/lib/quantified/length.rb +20 -0
  42. data/lib/vendor/quantified/lib/quantified/mass.rb +19 -0
  43. data/lib/vendor/quantified/test/length_test.rb +92 -0
  44. data/lib/vendor/quantified/test/mass_test.rb +88 -0
  45. data/lib/vendor/quantified/test/test_helper.rb +2 -0
  46. data/lib/vendor/test_helper.rb +13 -0
  47. data/lib/vendor/xml_node/README +36 -0
  48. data/lib/vendor/xml_node/Rakefile +21 -0
  49. data/lib/vendor/xml_node/benchmark/bench_generation.rb +32 -0
  50. data/lib/vendor/xml_node/init.rb +1 -0
  51. data/lib/vendor/xml_node/lib/xml_node.rb +222 -0
  52. data/lib/vendor/xml_node/test/test_generating.rb +94 -0
  53. data/lib/vendor/xml_node/test/test_parsing.rb +43 -0
  54. metadata +125 -0
@@ -0,0 +1,19 @@
1
+ module Quantified
2
+ class Mass < Attribute
3
+ system :metric do
4
+ primitive :gram
5
+
6
+ one :milligram, :is => Mass.new(0.001, :grams)
7
+ one :kilogram, :is => Mass.new(1000, :grams)
8
+ end
9
+
10
+ system :imperial do
11
+ primitive :ounce
12
+ one :ounce, :is => Mass.new(28.349523125, :grams)
13
+
14
+ one :pound, :is => Mass.new(16, :ounces)
15
+ one :stone, :is => Mass.new(14, :pounds)
16
+ one :short_ton, :is => Mass.new(2000, :pounds)
17
+ end
18
+ end
19
+ end
@@ -0,0 +1,92 @@
1
+ require File.dirname(__FILE__) + '/test_helper'
2
+ require 'quantified/length'
3
+
4
+ class LengthTest < Test::Unit::TestCase
5
+ include Quantified
6
+ Length.numeric_methods :metres, :centimetres, :inches, :feet
7
+
8
+ def setup
9
+ @length = Length.new(5, :feet)
10
+ end
11
+
12
+ def test_inspect
13
+ assert_equal "#<Quantified::Length: 5 feet>", @length.inspect
14
+ end
15
+
16
+ def test_to_s
17
+ assert_equal "5 feet", @length.to_s
18
+ end
19
+
20
+ def test_initialize_from_numeric
21
+ assert_equal "5 feet", 5.feet.to_s
22
+ end
23
+
24
+ def test_equalities
25
+ assert_equal 1.feet, (1.0).feet
26
+ # == based on value
27
+ assert_equal 6.feet, Length.new(2, :yards)
28
+ # eql? based on value and unit
29
+ assert !6.feet.eql?(Length.new(2, :yards))
30
+ # equal? based on object identity
31
+ assert !2.feet.equal?(2.feet)
32
+ end
33
+
34
+ def test_convert_yards_to_feet
35
+ assert 6.feet.eql?(Length.new(2, :yards).to_feet)
36
+ end
37
+
38
+ def test_convert_feet_to_yards
39
+ assert Length.new(2, :yards).eql?(6.feet.to_yards)
40
+ end
41
+
42
+ def test_convert_yards_to_millimetres
43
+ assert Length.new(914.4, :millimetres).eql?(Length.new(1, :yards).to_millimetres)
44
+ end
45
+
46
+ def test_convert_millimetres_to_yards
47
+ assert Length.new(1, :yards).eql?(Length.new(914.4, :millimetres).to_yards)
48
+ end
49
+
50
+ def test_convert_metres_to_inches
51
+ assert_equal 1.inches, (0.0254).metres.to_inches
52
+ assert 1.inches.eql?((0.0254).metres.to_inches)
53
+ assert 1.inches.eql?((0.0254).metres.in_inches)
54
+ end
55
+
56
+ def test_comparison_with_numeric
57
+ assert 2.feet > 1
58
+ assert 2.feet == 2
59
+ assert 2.feet <= 2
60
+ assert 2.feet < 3
61
+ end
62
+
63
+ def test_method_missing_to_i
64
+ assert_equal 2, (2.4).feet.to_i
65
+ end
66
+
67
+ def test_method_missing_to_f
68
+ assert_equal 2.4, (2.4).feet.to_f
69
+ end
70
+
71
+ def test_method_missing_minus
72
+ assert_equal 2.feet, 5.feet - 3.feet
73
+ end
74
+
75
+ def test_numeric_methods_not_added_for_some_units
76
+ assert_raises NoMethodError do
77
+ 2.yards
78
+ end
79
+ assert_raises NoMethodError do
80
+ 2.millimetres
81
+ end
82
+ end
83
+
84
+ def test_systems
85
+ assert_equal [:metric, :imperial], Length.systems
86
+ assert_equal [:metres, :centimetres, :millimetres, :kilometres], Length.units(:metric)
87
+ assert_equal [:inches, :feet, :yards, :miles], Length.units(:imperial)
88
+
89
+ assert_equal :metric, 2.centimetres.system
90
+ assert_equal :imperial, 2.feet.system
91
+ end
92
+ end
@@ -0,0 +1,88 @@
1
+ require File.dirname(__FILE__) + '/test_helper'
2
+ require 'quantified/mass'
3
+
4
+ class MassTest < Test::Unit::TestCase
5
+ include Quantified
6
+ Mass.numeric_methods :grams, :kilograms, :ounces, :pounds
7
+
8
+ def setup
9
+ @mass = Mass.new(5, :pounds)
10
+ end
11
+
12
+ def test_inspect
13
+ assert_equal "#<Quantified::Mass: 5 pounds>", @mass.inspect
14
+ end
15
+
16
+ def test_to_s
17
+ assert_equal "5 pounds", @mass.to_s
18
+ end
19
+
20
+ def test_initialize_from_numeric
21
+ assert_equal "5 pounds", 5.pounds.to_s
22
+ end
23
+
24
+ def test_equalities
25
+ assert_equal 1.pounds, (1.0).pounds
26
+ # == based on value
27
+ assert_equal 4000.pounds, Mass.new(2, :short_tons)
28
+ # eql? based on value and unit
29
+ assert !4000.pounds.eql?(Mass.new(2, :short_tons))
30
+ # equal? based on object identity
31
+ assert !2.pounds.equal?(2.pounds)
32
+ end
33
+
34
+ def test_convert_short_tons_to_pounds
35
+ assert 4000.pounds.eql?(Mass.new(2, :short_tons).to_pounds)
36
+ end
37
+
38
+ def test_convert_pounds_to_short_tons
39
+ assert Mass.new(2, :short_tons).eql?(4000.pounds.to_short_tons)
40
+ end
41
+
42
+ def test_convert_short_tons_to_milligrams
43
+ assert Mass.new(907_184_740, :milligrams).eql?(Mass.new(1, :short_tons).to_milligrams)
44
+ end
45
+
46
+ def test_convert_milligrams_to_short_tons
47
+ assert Mass.new(1, :short_tons).eql?(Mass.new(907_184_740, :milligrams).to_short_tons)
48
+ end
49
+
50
+ def test_convert_grams_to_ounces
51
+ assert 1.ounces.eql?((28.349523125).grams.to_ounces)
52
+ assert 1.ounces.eql?((28.349523125).grams.in_ounces)
53
+ end
54
+
55
+ def test_comparison_with_numeric
56
+ assert 2.pounds > 1
57
+ assert 2.pounds == 2
58
+ assert 2.pounds <= 2
59
+ assert 2.pounds < 3
60
+ end
61
+
62
+ def test_method_missing_to_i
63
+ assert_equal 2, (2.4).pounds.to_i
64
+ end
65
+
66
+ def test_method_missing_to_f
67
+ assert_equal 2.4, (2.4).pounds.to_f
68
+ end
69
+
70
+ def test_method_missing_minus
71
+ assert_equal 2.pounds, 5.pounds - 3.pounds
72
+ end
73
+
74
+ def test_numeric_methods_not_added_for_some_units
75
+ assert_raises NoMethodError do
76
+ 2.short_tons
77
+ end
78
+ assert_raises NoMethodError do
79
+ 2.milligrams
80
+ end
81
+ end
82
+
83
+ def test_systems
84
+ assert_equal [:metric, :imperial], Mass.systems
85
+ assert_equal [:grams, :milligrams, :kilograms], Mass.units(:metric)
86
+ assert_equal [:ounces, :pounds, :stones, :short_tons], Mass.units(:imperial)
87
+ end
88
+ end
@@ -0,0 +1,2 @@
1
+ require 'test/unit'
2
+ require File.dirname(__FILE__) + '/../lib/quantified'
@@ -0,0 +1,13 @@
1
+ #!/usr/bin/env ruby
2
+ $:.unshift(File.dirname(__FILE__) + '/../lib')
3
+
4
+
5
+ require 'test/unit'
6
+ require 'active_shipping'
7
+
8
+ begin
9
+ require 'mocha'
10
+ rescue LoadError
11
+ require 'rubygems'
12
+ require 'mocha'
13
+ end
@@ -0,0 +1,36 @@
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... }
@@ -0,0 +1,21 @@
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
@@ -0,0 +1,32 @@
1
+ require "benchmark"
2
+ require File.dirname(__FILE__) + "/../lib/xml_node"
3
+
4
+ class XmlNode
5
+
6
+ def to_xml_as_array
7
+ xml = []
8
+ document = REXML::Document.new
9
+ document << REXML::XMLDecl.new('1.0')
10
+ document << @element
11
+ document.write( xml, 0)
12
+ xml.to_s
13
+ end
14
+
15
+ def to_xml_no_format
16
+ xml = ''
17
+ document = REXML::Document.new
18
+ document << REXML::XMLDecl.new('1.0')
19
+ document << @element
20
+ document.write( xml)
21
+ xml
22
+ end
23
+
24
+ end
25
+
26
+ TESTS = 10000
27
+
28
+ Benchmark.bmbm do |results|
29
+ results.report { TESTS.times do XmlNode.new('feed') { |n| n << XmlNode.new('element', 'test'); n << XmlNode.new('element') }.to_xml end }
30
+ results.report { TESTS.times do XmlNode.new('feed') { |n| n << XmlNode.new('element', 'test'); n << XmlNode.new('element') }.to_xml_as_array end }
31
+ results.report { TESTS.times do XmlNode.new('feed') { |n| n << XmlNode.new('element', 'test'); n << XmlNode.new('element') }.to_xml_no_format end }
32
+ end
@@ -0,0 +1 @@
1
+ # Include hook code here
@@ -0,0 +1,222 @@
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
+ self.xmlschema
30
+ end
31
+ end
32
+
33
+ class DateTime
34
+ def to_xml_value
35
+ self.xmlschema
36
+ end
37
+ end
38
+
39
+ class Date
40
+ def to_xml_value
41
+ self.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
+ if !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
+ self.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
+
222
+ end