fedex 3.1.0 → 3.3.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.
- 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:
|