active_shipping 0.12.4 → 0.12.5

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 (44) hide show
  1. checksums.yaml +4 -4
  2. data/lib/active_shipping.rb +2 -1
  3. data/lib/active_shipping/shipping/base.rb +2 -2
  4. data/lib/active_shipping/shipping/carrier.rb +16 -13
  5. data/lib/active_shipping/shipping/carriers/benchmark_carrier.rb +3 -4
  6. data/lib/active_shipping/shipping/carriers/bogus_carrier.rb +1 -3
  7. data/lib/active_shipping/shipping/carriers/canada_post.rb +33 -44
  8. data/lib/active_shipping/shipping/carriers/canada_post_pws.rb +72 -81
  9. data/lib/active_shipping/shipping/carriers/fedex.rb +118 -109
  10. data/lib/active_shipping/shipping/carriers/kunaki.rb +33 -32
  11. data/lib/active_shipping/shipping/carriers/new_zealand_post.rb +9 -16
  12. data/lib/active_shipping/shipping/carriers/shipwire.rb +36 -35
  13. data/lib/active_shipping/shipping/carriers/stamps.rb +39 -51
  14. data/lib/active_shipping/shipping/carriers/ups.rb +280 -116
  15. data/lib/active_shipping/shipping/carriers/ups.rb.orig +456 -0
  16. data/lib/active_shipping/shipping/carriers/usps.rb +145 -100
  17. data/lib/active_shipping/shipping/carriers/usps.rb.orig +616 -0
  18. data/lib/active_shipping/shipping/errors.rb +1 -1
  19. data/lib/active_shipping/shipping/label_response.rb +25 -0
  20. data/lib/active_shipping/shipping/location.rb +18 -16
  21. data/lib/active_shipping/shipping/package.rb +51 -54
  22. data/lib/active_shipping/shipping/rate_estimate.rb +10 -12
  23. data/lib/active_shipping/shipping/rate_response.rb +3 -7
  24. data/lib/active_shipping/shipping/response.rb +6 -9
  25. data/lib/active_shipping/shipping/shipment_event.rb +2 -4
  26. data/lib/active_shipping/shipping/shipment_packer.rb +32 -17
  27. data/lib/active_shipping/shipping/shipping_response.rb +2 -4
  28. data/lib/active_shipping/shipping/tracking_response.rb +3 -5
  29. data/lib/active_shipping/version.rb +1 -1
  30. data/lib/vendor/quantified/lib/quantified/attribute.rb +79 -80
  31. data/lib/vendor/quantified/lib/quantified/length.rb +5 -5
  32. data/lib/vendor/quantified/lib/quantified/mass.rb +4 -4
  33. data/lib/vendor/quantified/test/length_test.rb +19 -15
  34. data/lib/vendor/quantified/test/mass_test.rb +14 -14
  35. data/lib/vendor/quantified/test/test_helper.rb +1 -2
  36. data/lib/vendor/test_helper.rb +0 -1
  37. data/lib/vendor/xml_node/benchmark/bench_generation.rb +2 -4
  38. data/lib/vendor/xml_node/lib/xml_node.rb +54 -55
  39. data/lib/vendor/xml_node/test/test_generating.rb +23 -28
  40. data/lib/vendor/xml_node/test/test_parsing.rb +5 -8
  41. metadata +6 -25
  42. checksums.yaml.gz.sig +0 -1
  43. data.tar.gz.sig +0 -0
  44. metadata.gz.sig +0 -0
@@ -6,4 +6,4 @@ module ActiveMerchant
6
6
  end
7
7
  end
8
8
  end
9
- end
9
+ end
@@ -0,0 +1,25 @@
1
+ module ActiveMerchant #:nodoc:
2
+ module Shipping
3
+ # This is UPS specific for now; the hash is not at all generic
4
+ # or common between carriers.
5
+
6
+ class LabelResponse < Response
7
+ attr :params # maybe?
8
+
9
+ def initialize(success, message, params = {}, options = {})
10
+ @params = params
11
+ super
12
+ end
13
+
14
+ def labels
15
+ return @labels if @labels
16
+ packages = params["ShipmentResults"]["PackageResults"]
17
+ packages = [packages] if Hash === packages
18
+ @labels = packages.map do |package|
19
+ { :tracking_number => package["TrackingNumber"],
20
+ :image => package["LabelImage"] }
21
+ end
22
+ end
23
+ end
24
+ end
25
+ end
@@ -1,8 +1,8 @@
1
1
  module ActiveMerchant #:nodoc:
2
2
  module Shipping #:nodoc:
3
3
  class Location
4
- ADDRESS_TYPES = %w{residential commercial po_box}
5
-
4
+ ADDRESS_TYPES = %w(residential commercial po_box)
5
+
6
6
  attr_reader :options,
7
7
  :country,
8
8
  :postal_code,
@@ -16,14 +16,14 @@ module ActiveMerchant #:nodoc:
16
16
  :fax,
17
17
  :address_type,
18
18
  :company_name
19
-
19
+
20
20
  alias_method :zip, :postal_code
21
21
  alias_method :postal, :postal_code
22
22
  alias_method :state, :province
23
23
  alias_method :territory, :province
24
24
  alias_method :region, :province
25
25
  alias_method :company, :company_name
26
-
26
+
27
27
  def initialize(options = {})
28
28
  @country = (options[:country].nil? or options[:country].is_a?(ActiveMerchant::Country)) ?
29
29
  options[:country] :
@@ -41,8 +41,8 @@ module ActiveMerchant #:nodoc:
41
41
 
42
42
  self.address_type = options[:address_type]
43
43
  end
44
-
45
- def self.from(object, options={})
44
+
45
+ def self.from(object, options = {})
46
46
  return object if object.is_a? ActiveMerchant::Shipping::Location
47
47
  attr_mappings = {
48
48
  :name => [:name],
@@ -74,13 +74,13 @@ module ActiveMerchant #:nodoc:
74
74
  end
75
75
  end
76
76
  attributes.delete(:address_type) unless ADDRESS_TYPES.include?(attributes[:address_type].to_s)
77
- self.new(attributes.update(options))
77
+ new(attributes.update(options))
78
78
  end
79
-
79
+
80
80
  def country_code(format = :alpha2)
81
81
  @country.nil? ? nil : @country.code(format).value
82
82
  end
83
-
83
+
84
84
  def residential?; @address_type == 'residential' end
85
85
  def commercial?; @address_type == 'commercial' end
86
86
  def po_box?; @address_type == 'po_box' end
@@ -109,7 +109,7 @@ module ActiveMerchant #:nodoc:
109
109
  }
110
110
  end
111
111
 
112
- def to_xml(options={})
112
+ def to_xml(options = {})
113
113
  options[:root] ||= "location"
114
114
  to_hash.to_xml(options)
115
115
  end
@@ -117,15 +117,15 @@ module ActiveMerchant #:nodoc:
117
117
  def to_s
118
118
  prettyprint.gsub(/\n/, ' ')
119
119
  end
120
-
120
+
121
121
  def prettyprint
122
122
  chunks = []
123
- chunks << [@name, @address1,@address2,@address3].reject {|e| e.blank?}.join("\n")
124
- chunks << [@city,@province,@postal_code].reject {|e| e.blank?}.join(', ')
123
+ chunks << [@name, @address1, @address2, @address3].reject(&:blank?).join("\n")
124
+ chunks << [@city, @province, @postal_code].reject(&:blank?).join(', ')
125
125
  chunks << @country
126
- chunks.reject {|e| e.blank?}.join("\n")
126
+ chunks.reject(&:blank?).join("\n")
127
127
  end
128
-
128
+
129
129
  def inspect
130
130
  string = prettyprint
131
131
  string << "\nPhone: #{@phone}" unless @phone.blank?
@@ -144,7 +144,9 @@ module ActiveMerchant #:nodoc:
144
144
  end
145
145
  end
146
146
 
147
+ def address2_and_3
148
+ [address2, address3].reject(&:blank?).join(", ")
149
+ end
147
150
  end
148
-
149
151
  end
150
152
  end
@@ -1,7 +1,7 @@
1
1
  module ActiveMerchant #:nodoc:
2
2
  module Shipping #:nodoc:
3
- # A package item is a unique item(s) that is physically in a package.
4
- # A single package can have many items. This is only required
3
+ # A package item is a unique item(s) that is physically in a package.
4
+ # A single package can have many items. This is only required
5
5
  # for shipping methods (label creation) right now.
6
6
  class PackageItem
7
7
  include Quantified
@@ -12,8 +12,8 @@ module ActiveMerchant #:nodoc:
12
12
  @name = name
13
13
 
14
14
  imperial = (options[:units] == :imperial) ||
15
- (grams_or_ounces.respond_to?(:unit) && m.unit.to_sym == :imperial)
16
-
15
+ (grams_or_ounces.respond_to?(:unit) && m.unit.to_sym == :imperial)
16
+
17
17
  @unit_system = imperial ? :imperial : :metric
18
18
 
19
19
  @weight = attribute_from_metric_or_imperial(grams_or_ounces, Mass, :grams, :ounces)
@@ -36,28 +36,28 @@ module ActiveMerchant #:nodoc:
36
36
  @unit_system == :imperial ? m.in_ounces : m
37
37
  end
38
38
  when :billable
39
- [ weight, weight(:type => :volumetric) ].max
39
+ [weight, weight(:type => :volumetric)].max
40
40
  end
41
41
  end
42
42
  alias_method :mass, :weight
43
43
 
44
- def ounces(options={})
44
+ def ounces(options = {})
45
45
  weight(options).in_ounces.amount
46
46
  end
47
47
  alias_method :oz, :ounces
48
-
49
- def grams(options={})
48
+
49
+ def grams(options = {})
50
50
  weight(options).in_grams.amount
51
51
  end
52
52
  alias_method :g, :grams
53
-
54
- def pounds(options={})
53
+
54
+ def pounds(options = {})
55
55
  weight(options).in_pounds.amount
56
56
  end
57
57
  alias_method :lb, :pounds
58
58
  alias_method :lbs, :pounds
59
-
60
- def kilograms(options={})
59
+
60
+ def kilograms(options = {})
61
61
  weight(options).in_kilograms.amount
62
62
  end
63
63
  alias_method :kg, :kilograms
@@ -72,12 +72,11 @@ module ActiveMerchant #:nodoc:
72
72
  return klass.new(obj, (@unit_system == :imperial ? imperial_unit : metric_unit))
73
73
  end
74
74
  end
75
-
76
75
  end
77
76
 
78
77
  class Package
79
78
  include Quantified
80
-
79
+
81
80
  cattr_accessor :default_options
82
81
  attr_reader :options, :value, :currency
83
82
 
@@ -88,36 +87,35 @@ module ActiveMerchant #:nodoc:
88
87
  options = @@default_options.update(options) if @@default_options
89
88
  options.symbolize_keys!
90
89
  @options = options
91
-
92
- @dimensions = [dimensions].flatten.reject {|d| d.nil?}
93
90
 
94
-
91
+ @dimensions = [dimensions].flatten.reject(&:nil?)
92
+
95
93
  imperial = (options[:units] == :imperial) ||
96
- ([grams_or_ounces, *dimensions].all? {|m| m.respond_to?(:unit) && m.unit.to_sym == :imperial})
97
-
94
+ ([grams_or_ounces, *dimensions].all? { |m| m.respond_to?(:unit) && m.unit.to_sym == :imperial })
95
+
98
96
  weight_imperial = dimensions_imperial = imperial if options.include?(:units)
99
97
 
100
98
  if options.include?(:weight_units)
101
99
  weight_imperial = (options[:weight_units] == :imperial) ||
102
- (grams_or_ounces.respond_to?(:unit) && m.unit.to_sym == :imperial)
100
+ (grams_or_ounces.respond_to?(:unit) && m.unit.to_sym == :imperial)
103
101
  end
104
102
 
105
103
  if options.include?(:dim_units)
106
104
  dimensions_imperial = (options[:dim_units] == :imperial) ||
107
- (dimensions && dimensions.all? {|m| m.respond_to?(:unit) && m.unit.to_sym == :imperial})
105
+ (dimensions && dimensions.all? { |m| m.respond_to?(:unit) && m.unit.to_sym == :imperial })
108
106
  end
109
-
107
+
110
108
  @weight_unit_system = weight_imperial ? :imperial : :metric
111
109
  @dimensions_unit_system = dimensions_imperial ? :imperial : :metric
112
-
110
+
113
111
  @weight = attribute_from_metric_or_imperial(grams_or_ounces, Mass, @weight_unit_system, :grams, :ounces)
114
-
112
+
115
113
  if @dimensions.blank?
116
114
  @dimensions = [Length.new(0, (dimensions_imperial ? :inches : :centimetres))] * 3
117
115
  else
118
116
  process_dimensions
119
117
  end
120
-
118
+
121
119
  @value = Package.cents_from(options[:value])
122
120
  @currency = options[:currency] || (options[:value].currency if options[:value].respond_to?(:currency))
123
121
  @cylinder = (options[:cylinder] || options[:tube]) ? true : false
@@ -125,7 +123,7 @@ module ActiveMerchant #:nodoc:
125
123
  @oversized = options[:oversized] ? true : false
126
124
  @unpackaged = options[:unpackaged] ? true : false
127
125
  end
128
-
126
+
129
127
  def unpackaged?
130
128
  @unpackaged
131
129
  end
@@ -133,48 +131,48 @@ module ActiveMerchant #:nodoc:
133
131
  def oversized?
134
132
  @oversized
135
133
  end
136
-
134
+
137
135
  def cylinder?
138
136
  @cylinder
139
137
  end
140
138
  alias_method :tube?, :cylinder?
141
-
139
+
142
140
  def gift?; @gift end
143
-
144
- def ounces(options={})
141
+
142
+ def ounces(options = {})
145
143
  weight(options).in_ounces.amount
146
144
  end
147
145
  alias_method :oz, :ounces
148
-
149
- def grams(options={})
146
+
147
+ def grams(options = {})
150
148
  weight(options).in_grams.amount
151
149
  end
152
150
  alias_method :g, :grams
153
-
154
- def pounds(options={})
151
+
152
+ def pounds(options = {})
155
153
  weight(options).in_pounds.amount
156
154
  end
157
155
  alias_method :lb, :pounds
158
156
  alias_method :lbs, :pounds
159
-
160
- def kilograms(options={})
157
+
158
+ def kilograms(options = {})
161
159
  weight(options).in_kilograms.amount
162
160
  end
163
161
  alias_method :kg, :kilograms
164
162
  alias_method :kgs, :kilograms
165
-
166
- def inches(measurement=nil)
167
- @inches ||= @dimensions.map {|m| m.in_inches.amount }
163
+
164
+ def inches(measurement = nil)
165
+ @inches ||= @dimensions.map { |m| m.in_inches.amount }
168
166
  measurement.nil? ? @inches : measure(measurement, @inches)
169
167
  end
170
168
  alias_method :in, :inches
171
-
172
- def centimetres(measurement=nil)
173
- @centimetres ||= @dimensions.map {|m| m.in_centimetres.amount }
169
+
170
+ def centimetres(measurement = nil)
171
+ @centimetres ||= @dimensions.map { |m| m.in_centimetres.amount }
174
172
  measurement.nil? ? @centimetres : measure(measurement, @centimetres)
175
173
  end
176
174
  alias_method :cm, :centimetres
177
-
175
+
178
176
  def weight(options = {})
179
177
  case options[:type]
180
178
  when nil, :actual
@@ -185,11 +183,11 @@ module ActiveMerchant #:nodoc:
185
183
  @weight_unit_system == :imperial ? m.in_ounces : m
186
184
  end
187
185
  when :billable
188
- [ weight, weight(:type => :volumetric) ].max
186
+ [weight, weight(:type => :volumetric)].max
189
187
  end
190
188
  end
191
189
  alias_method :mass, :weight
192
-
190
+
193
191
  def self.cents_from(money)
194
192
  return nil if money.nil?
195
193
  if money.respond_to?(:cents)
@@ -205,7 +203,7 @@ module ActiveMerchant #:nodoc:
205
203
  end
206
204
  end
207
205
  end
208
-
206
+
209
207
  private
210
208
 
211
209
  def attribute_from_metric_or_imperial(obj, klass, unit_system, metric_unit, imperial_unit)
@@ -215,20 +213,20 @@ module ActiveMerchant #:nodoc:
215
213
  return klass.new(obj, (unit_system == :imperial ? imperial_unit : metric_unit))
216
214
  end
217
215
  end
218
-
216
+
219
217
  def measure(measurement, ary)
220
218
  case measurement
221
- when Fixnum then ary[measurement]
219
+ when Fixnum then ary[measurement]
222
220
  when :x, :max, :length, :long then ary[2]
223
221
  when :y, :mid, :width, :wide then ary[1]
224
- when :z, :min, :height,:depth,:high,:deep then ary[0]
225
- when :girth, :around,:circumference
222
+ when :z, :min, :height, :depth, :high, :deep then ary[0]
223
+ when :girth, :around, :circumference
226
224
  self.cylinder? ? (Math::PI * (ary[0] + ary[1]) / 2) : (2 * ary[0]) + (2 * ary[1])
227
- when :volume then self.cylinder? ? (Math::PI * (ary[0] + ary[1]) / 4)**2 * ary[2] : measure(:box_volume,ary)
225
+ when :volume then self.cylinder? ? (Math::PI * (ary[0] + ary[1]) / 4)**2 * ary[2] : measure(:box_volume, ary)
228
226
  when :box_volume then ary[0] * ary[1] * ary[2]
229
227
  end
230
228
  end
231
-
229
+
232
230
  def process_dimensions
233
231
  @dimensions = @dimensions.map do |l|
234
232
  attribute_from_metric_or_imperial(l, Length, @dimensions_unit_system, :centimetres, :inches)
@@ -236,11 +234,10 @@ module ActiveMerchant #:nodoc:
236
234
  # [1,2] => [1,1,2]
237
235
  # [5] => [5,5,5]
238
236
  # etc..
239
- 2.downto(@dimensions.length) do |n|
237
+ 2.downto(@dimensions.length) do |_n|
240
238
  @dimensions.unshift(@dimensions[0])
241
239
  end
242
240
  end
243
-
244
241
  end
245
242
  end
246
243
  end
@@ -1,6 +1,5 @@
1
1
  module ActiveMerchant #:nodoc:
2
2
  module Shipping #:nodoc:
3
-
4
3
  class RateEstimate
5
4
  attr_reader :origin # Location objects
6
5
  attr_reader :destination
@@ -9,20 +8,20 @@ module ActiveMerchant #:nodoc:
9
8
  attr_reader :service_name # name of service ("First Class Ground", etc.)
10
9
  attr_reader :service_code
11
10
  attr_reader :currency # 'USD', 'CAD', etc.
12
- # http://en.wikipedia.org/wiki/ISO_4217
11
+ # http://en.wikipedia.org/wiki/ISO_4217
13
12
  attr_reader :shipping_date
14
13
  attr_reader :delivery_date # Usually only available for express shipments
15
14
  attr_reader :delivery_range # Min and max delivery estimate in days
16
15
  attr_reader :negotiated_rate
17
16
  attr_reader :insurance_price
18
17
 
19
- def initialize(origin, destination, carrier, service_name, options={})
18
+ def initialize(origin, destination, carrier, service_name, options = {})
20
19
  @origin, @destination, @carrier, @service_name = origin, destination, carrier, service_name
21
20
  @service_code = options[:service_code]
22
21
  if options[:package_rates]
23
- @package_rates = options[:package_rates].map {|p| p.update({:rate => Package.cents_from(p[:rate])}) }
22
+ @package_rates = options[:package_rates].map { |p| p.update(:rate => Package.cents_from(p[:rate])) }
24
23
  else
25
- @package_rates = Array(options[:packages]).map {|p| {:package => p}}
24
+ @package_rates = Array(options[:packages]).map { |p| {:package => p} }
26
25
  end
27
26
  @total_price = Package.cents_from(options[:total_price])
28
27
  @negotiated_rate = options[:negotiated_rate] ? Package.cents_from(options[:negotiated_rate]) : nil
@@ -34,15 +33,13 @@ module ActiveMerchant #:nodoc:
34
33
  end
35
34
 
36
35
  def total_price
37
- begin
38
- @total_price || @package_rates.sum {|p| p[:rate]}
39
- rescue NoMethodError
40
- raise ArgumentError.new("RateEstimate must have a total_price set, or have a full set of valid package rates.")
41
- end
36
+ @total_price || @package_rates.sum { |p| p[:rate] }
37
+ rescue NoMethodError
38
+ raise ArgumentError.new("RateEstimate must have a total_price set, or have a full set of valid package rates.")
42
39
  end
43
40
  alias_method :price, :total_price
44
41
 
45
- def add(package,rate=nil)
42
+ def add(package, rate = nil)
46
43
  cents = Package.cents_from(rate)
47
44
  raise ArgumentError.new("New packages must have valid rate information since this RateEstimate has no total_price set.") if cents.nil? and total_price.nil?
48
45
  @package_rates << {:package => package, :rate => cents}
@@ -50,7 +47,7 @@ module ActiveMerchant #:nodoc:
50
47
  end
51
48
 
52
49
  def packages
53
- package_rates.map {|p| p[:package]}
50
+ package_rates.map { |p| p[:package] }
54
51
  end
55
52
 
56
53
  def package_count
@@ -58,6 +55,7 @@ module ActiveMerchant #:nodoc:
58
55
  end
59
56
 
60
57
  private
58
+
61
59
  def date_for(date)
62
60
  date && DateTime.strptime(date.to_s, "%Y-%m-%d")
63
61
  rescue ArgumentError
@@ -1,19 +1,15 @@
1
1
  module ActiveMerchant #:nodoc:
2
2
  module Shipping
3
-
4
3
  class RateResponse < Response
5
-
6
4
  attr_reader :rates
7
-
5
+
8
6
  def initialize(success, message, params = {}, options = {})
9
7
  @rates = Array(options[:estimates] || options[:rates] || options[:rate_estimates])
10
8
  super
11
9
  end
12
-
10
+
13
11
  alias_method :estimates, :rates
14
12
  alias_method :rate_estimates, :rates
15
-
16
13
  end
17
-
18
14
  end
19
- end
15
+ end