fedex 3.1.0 → 3.3.0
Sign up to get free protection for your applications and to get access to all the features.
- data/lib/fedex/address.rb +4 -3
- data/lib/fedex/rate.rb +3 -2
- data/lib/fedex/request/address.rb +4 -1
- data/lib/fedex/request/base.rb +1 -1
- data/lib/fedex/request/rate.rb +9 -3
- data/lib/fedex/request/shipment.rb +1 -1
- data/lib/fedex/version.rb +1 -1
- data/spec/lib/fedex/rate_spec.rb +70 -7
- data/spec/lib/fedex/shipment_spec.rb +18 -4
- metadata +12 -12
data/lib/fedex/address.rb
CHANGED
@@ -2,8 +2,8 @@ module Fedex
|
|
2
2
|
class Address
|
3
3
|
|
4
4
|
attr_reader :changes, :score, :confirmed, :available, :status, :residential,
|
5
|
-
:business, :street_lines, :city, :state,
|
6
|
-
:postal_code, :country_code
|
5
|
+
:business, :company, :street_lines, :city, :state,
|
6
|
+
:province_code, :postal_code, :country_code
|
7
7
|
|
8
8
|
def initialize(options)
|
9
9
|
@changes = options[:changes]
|
@@ -17,6 +17,7 @@ module Fedex
|
|
17
17
|
|
18
18
|
address = options[:address]
|
19
19
|
|
20
|
+
@company = options[:company_name]
|
20
21
|
@street_lines = address[:street_lines]
|
21
22
|
@city = address[:city]
|
22
23
|
@state = address[:state_or_province_code]
|
@@ -27,4 +28,4 @@ module Fedex
|
|
27
28
|
@options = options
|
28
29
|
end
|
29
30
|
end
|
30
|
-
end
|
31
|
+
end
|
data/lib/fedex/rate.rb
CHANGED
@@ -18,8 +18,9 @@ module Fedex
|
|
18
18
|
# @total_net_freight #The freight charge minus dicounts
|
19
19
|
# @total_surcharges #The total amount of all surcharges applied to this shipment
|
20
20
|
# @total_base_charge #The total base charge
|
21
|
-
attr_accessor :rate_type, :rate_zone, :
|
21
|
+
attr_accessor :service_type, :rate_type, :rate_zone, :total_billing_weight, :total_freight_discounts, :total_net_charge, :total_taxes, :total_net_freight, :total_surcharges, :total_base_charge
|
22
22
|
def initialize(options = {})
|
23
|
+
@service_type = options[:service_type]
|
23
24
|
@rate_type = options[:rate_type]
|
24
25
|
@rate_zone = options[:rate_zone]
|
25
26
|
@total_billing_weight = "#{options[:total_billing_weight][:value]} #{options[:total_billing_weight][:units]}"
|
@@ -33,4 +34,4 @@ module Fedex
|
|
33
34
|
@total_rebates = (options[:total_rebates]||{})[:amount]
|
34
35
|
end
|
35
36
|
end
|
36
|
-
end
|
37
|
+
end
|
@@ -67,8 +67,11 @@ module Fedex
|
|
67
67
|
|
68
68
|
def add_address_to_validate(xml)
|
69
69
|
xml.AddressesToValidate{
|
70
|
+
xml.CompanyName @address[:company] unless @address[:company].nil? or @address[:company].empty?
|
70
71
|
xml.Address{
|
71
|
-
|
72
|
+
Array(@address[:street]).take(2).each do |address_line|
|
73
|
+
xml.StreetLines address_line
|
74
|
+
end
|
72
75
|
xml.City @address[:city]
|
73
76
|
xml.StateOrProvinceCode @address[:state]
|
74
77
|
xml.PostalCode @address[:postal_code]
|
data/lib/fedex/request/base.rb
CHANGED
@@ -42,7 +42,7 @@ module Fedex
|
|
42
42
|
#
|
43
43
|
# return a Fedex::Request::Base object
|
44
44
|
def initialize(credentials, options={})
|
45
|
-
requires!(options, :shipper, :recipient, :packages
|
45
|
+
requires!(options, :shipper, :recipient, :packages)
|
46
46
|
@credentials = credentials
|
47
47
|
@shipper, @recipient, @packages, @service_type, @customs_clearance, @debug = options[:shipper], options[:recipient], options[:packages], options[:service_type], options[:customs_clearance], options[:debug]
|
48
48
|
@debug = ENV['DEBUG'] == 'true'
|
data/lib/fedex/request/rate.rb
CHANGED
@@ -9,8 +9,14 @@ module Fedex
|
|
9
9
|
puts api_response if @debug
|
10
10
|
response = parse_response(api_response)
|
11
11
|
if success?(response)
|
12
|
-
|
13
|
-
|
12
|
+
rate_reply_details = response[:rate_reply][:rate_reply_details] || []
|
13
|
+
rate_reply_details = [rate_reply_details] if rate_reply_details.is_a?(Hash)
|
14
|
+
|
15
|
+
rate_reply_details.map do |rate_reply|
|
16
|
+
rate_details = [rate_reply[:rated_shipment_details]].flatten.first[:shipment_rate_detail]
|
17
|
+
rate_details.merge!(service_type: rate_reply[:service_type])
|
18
|
+
Fedex::Rate.new(rate_details)
|
19
|
+
end
|
14
20
|
else
|
15
21
|
error_message = if response[:rate_reply]
|
16
22
|
[response[:rate_reply][:notifications]].flatten.first[:message]
|
@@ -27,7 +33,7 @@ module Fedex
|
|
27
33
|
def add_requested_shipment(xml)
|
28
34
|
xml.RequestedShipment{
|
29
35
|
xml.DropoffType @shipping_options[:drop_off_type] ||= "REGULAR_PICKUP"
|
30
|
-
xml.ServiceType service_type
|
36
|
+
xml.ServiceType service_type if service_type
|
31
37
|
xml.PackagingType @shipping_options[:packaging_type] ||= "YOUR_PACKAGING"
|
32
38
|
add_shipper(xml)
|
33
39
|
add_recipient(xml)
|
data/lib/fedex/version.rb
CHANGED
data/spec/lib/fedex/rate_spec.rb
CHANGED
@@ -41,16 +41,16 @@ module Fedex
|
|
41
41
|
|
42
42
|
context "domestic shipment", :vcr do
|
43
43
|
it "should return a rate" do
|
44
|
-
|
45
|
-
|
44
|
+
rates = fedex.rate({:shipper => shipper, :recipient => recipient, :packages => packages, :service_type => "FEDEX_GROUND"})
|
45
|
+
rates.first.should be_an_instance_of(Rate)
|
46
46
|
end
|
47
47
|
end
|
48
48
|
|
49
49
|
context "canadian shipment", :vcr do
|
50
50
|
it "should return a rate" do
|
51
51
|
canadian_recipient = {:name => "Recipient", :company => "Company", :phone_number => "555-555-5555", :address=>"Address Line 1", :city => "Richmond", :state => "BC", :postal_code => "V7C4V4", :country_code => "CA", :residential => "true" }
|
52
|
-
|
53
|
-
|
52
|
+
rates = fedex.rate({:shipper => shipper, :recipient => canadian_recipient, :packages => packages, :service_type => "FEDEX_GROUND"})
|
53
|
+
rates.first.should be_an_instance_of(Rate)
|
54
54
|
end
|
55
55
|
end
|
56
56
|
|
@@ -140,10 +140,73 @@ module Fedex
|
|
140
140
|
]
|
141
141
|
|
142
142
|
customs_clearance = { :broker => broker, :clearance_brokerage => clearance_brokerage, :importer_of_record => importer_of_record, :recipient_customs_id => recipient_customs_id, :duties_payment => duties_payment, :commodities => commodities }
|
143
|
-
|
144
|
-
|
143
|
+
rates = fedex.rate({:shipper => shipper, :recipient => canadian_recipient, :packages => packages, :service_type => "FEDEX_GROUND", :customs_clearance => customs_clearance})
|
144
|
+
rates.first.should be_an_instance_of(Rate)
|
145
145
|
end
|
146
146
|
end
|
147
|
+
|
148
|
+
context "with service type specified", :vcr do
|
149
|
+
|
150
|
+
let(:rates) {
|
151
|
+
fedex.rate({
|
152
|
+
:shipper => shipper,
|
153
|
+
:recipient => recipient,
|
154
|
+
:packages => packages,
|
155
|
+
:service_type => "FEDEX_GROUND"
|
156
|
+
})
|
157
|
+
}
|
158
|
+
|
159
|
+
it "returns a single rate" do
|
160
|
+
rates.count.should eq 1
|
161
|
+
end
|
162
|
+
|
163
|
+
it "has service_type attribute" do
|
164
|
+
rates.first.service_type == 'FEDEX_GROUND'
|
165
|
+
end
|
166
|
+
|
167
|
+
end
|
168
|
+
|
169
|
+
context "with no service type specified", :vcr do
|
170
|
+
|
171
|
+
let(:rates) {
|
172
|
+
fedex.rate({
|
173
|
+
:shipper => shipper,
|
174
|
+
:recipient => recipient,
|
175
|
+
:packages => packages
|
176
|
+
})
|
177
|
+
}
|
178
|
+
|
179
|
+
it "returns multiple rates" do
|
180
|
+
rates.count.should > 1
|
181
|
+
end
|
182
|
+
|
183
|
+
context "each rate" do
|
184
|
+
|
185
|
+
it 'has service type attribute' do
|
186
|
+
rates.first.should respond_to(:service_type)
|
187
|
+
end
|
188
|
+
|
189
|
+
end
|
190
|
+
|
191
|
+
end
|
192
|
+
|
193
|
+
context "when there are no valid services available", :vcr do
|
194
|
+
|
195
|
+
let(:bad_shipper) { shipper.merge(state: 'Anywhere') }
|
196
|
+
let(:rates) {
|
197
|
+
fedex.rate({
|
198
|
+
:shipper => bad_shipper,
|
199
|
+
:recipient => recipient,
|
200
|
+
:packages => packages
|
201
|
+
})
|
202
|
+
}
|
203
|
+
|
204
|
+
it 'returns empty array' do
|
205
|
+
rates.should eq []
|
206
|
+
end
|
207
|
+
|
208
|
+
end
|
209
|
+
|
147
210
|
end
|
148
211
|
end
|
149
|
-
end
|
212
|
+
end
|
@@ -22,11 +22,12 @@ describe Fedex::Request::Shipment do
|
|
22
22
|
{ :packaging_type => "YOUR_PACKAGING", :drop_off_type => "REGULAR_PICKUP" }
|
23
23
|
end
|
24
24
|
|
25
|
+
let(:filename) {
|
26
|
+
require 'tmpdir'
|
27
|
+
File.join(Dir.tmpdir, "label#{rand(15000)}.pdf")
|
28
|
+
}
|
29
|
+
|
25
30
|
context "domestic shipment", :vcr do
|
26
|
-
let(:filename) {
|
27
|
-
require 'tmpdir'
|
28
|
-
File.join(Dir.tmpdir, "label#{rand(15000)}.pdf")
|
29
|
-
}
|
30
31
|
let(:options) do
|
31
32
|
{:shipper => shipper, :recipient => recipient, :packages => packages, :service_type => "FEDEX_GROUND", :filename => filename}
|
32
33
|
end
|
@@ -40,5 +41,18 @@ describe Fedex::Request::Shipment do
|
|
40
41
|
end
|
41
42
|
end
|
42
43
|
|
44
|
+
context 'without service_type specified', :vcr do
|
45
|
+
let(:options) do
|
46
|
+
{:shipper => shipper, :recipient => recipient, :packages => packages, :filename => filename}
|
47
|
+
end
|
48
|
+
|
49
|
+
it 'raises error' do
|
50
|
+
expect {
|
51
|
+
@shipment = fedex.ship(options)
|
52
|
+
}.to raise_error('Missing Required Parameter service_type')
|
53
|
+
end
|
54
|
+
|
55
|
+
end
|
56
|
+
|
43
57
|
end
|
44
58
|
end
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: fedex
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 3.
|
4
|
+
version: 3.3.0
|
5
5
|
prerelease:
|
6
6
|
platform: ruby
|
7
7
|
authors:
|
@@ -9,11 +9,11 @@ authors:
|
|
9
9
|
autorequire:
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
|
-
date: 2013-
|
12
|
+
date: 2013-11-15 00:00:00.000000000 Z
|
13
13
|
dependencies:
|
14
14
|
- !ruby/object:Gem::Dependency
|
15
15
|
name: httparty
|
16
|
-
requirement: &
|
16
|
+
requirement: &70096915868680 !ruby/object:Gem::Requirement
|
17
17
|
none: false
|
18
18
|
requirements:
|
19
19
|
- - ~>
|
@@ -21,10 +21,10 @@ dependencies:
|
|
21
21
|
version: 0.11.0
|
22
22
|
type: :runtime
|
23
23
|
prerelease: false
|
24
|
-
version_requirements: *
|
24
|
+
version_requirements: *70096915868680
|
25
25
|
- !ruby/object:Gem::Dependency
|
26
26
|
name: nokogiri
|
27
|
-
requirement: &
|
27
|
+
requirement: &70096915867780 !ruby/object:Gem::Requirement
|
28
28
|
none: false
|
29
29
|
requirements:
|
30
30
|
- - ~>
|
@@ -32,10 +32,10 @@ dependencies:
|
|
32
32
|
version: 1.5.0
|
33
33
|
type: :runtime
|
34
34
|
prerelease: false
|
35
|
-
version_requirements: *
|
35
|
+
version_requirements: *70096915867780
|
36
36
|
- !ruby/object:Gem::Dependency
|
37
37
|
name: rspec
|
38
|
-
requirement: &
|
38
|
+
requirement: &70096915867020 !ruby/object:Gem::Requirement
|
39
39
|
none: false
|
40
40
|
requirements:
|
41
41
|
- - ~>
|
@@ -43,10 +43,10 @@ dependencies:
|
|
43
43
|
version: 2.9.0
|
44
44
|
type: :development
|
45
45
|
prerelease: false
|
46
|
-
version_requirements: *
|
46
|
+
version_requirements: *70096915867020
|
47
47
|
- !ruby/object:Gem::Dependency
|
48
48
|
name: vcr
|
49
|
-
requirement: &
|
49
|
+
requirement: &70096915866260 !ruby/object:Gem::Requirement
|
50
50
|
none: false
|
51
51
|
requirements:
|
52
52
|
- - ~>
|
@@ -54,10 +54,10 @@ dependencies:
|
|
54
54
|
version: 2.0.0
|
55
55
|
type: :development
|
56
56
|
prerelease: false
|
57
|
-
version_requirements: *
|
57
|
+
version_requirements: *70096915866260
|
58
58
|
- !ruby/object:Gem::Dependency
|
59
59
|
name: webmock
|
60
|
-
requirement: &
|
60
|
+
requirement: &70096915865600 !ruby/object:Gem::Requirement
|
61
61
|
none: false
|
62
62
|
requirements:
|
63
63
|
- - ~>
|
@@ -65,7 +65,7 @@ dependencies:
|
|
65
65
|
version: 1.8.0
|
66
66
|
type: :development
|
67
67
|
prerelease: false
|
68
|
-
version_requirements: *
|
68
|
+
version_requirements: *70096915865600
|
69
69
|
description: Provides an interface to Fedex Web Services(version 10) - shipping rates,
|
70
70
|
generate labels and address validation
|
71
71
|
email:
|