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 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, :province_code,
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, :total_bilint_weight, :total_freight_discounts, :total_net_charge, :total_taxes, :total_net_freight, :total_surcharges, :total_base_charge
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
- xml.StreetLines @address[:street]
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]
@@ -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, :service_type)
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'
@@ -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
- rate_details = [response[:rate_reply][:rate_reply_details][:rated_shipment_details]].flatten.first[:shipment_rate_detail]
13
- Fedex::Rate.new(rate_details)
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)
@@ -7,7 +7,7 @@ module Fedex
7
7
 
8
8
  def initialize(credentials, options={})
9
9
  super
10
- requires! options
10
+ requires!(options, :service_type)
11
11
  # Label specification is required even if we're not using it.
12
12
  @label_specification = {
13
13
  :label_format_type => 'COMMON2D',
data/lib/fedex/version.rb CHANGED
@@ -1,3 +1,3 @@
1
1
  module Fedex
2
- VERSION = "3.1.0"
2
+ VERSION = "3.3.0"
3
3
  end
@@ -41,16 +41,16 @@ module Fedex
41
41
 
42
42
  context "domestic shipment", :vcr do
43
43
  it "should return a rate" do
44
- rate = fedex.rate({:shipper => shipper, :recipient => recipient, :packages => packages, :service_type => "FEDEX_GROUND"})
45
- rate.should be_an_instance_of(Rate)
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
- rate = fedex.rate({:shipper => shipper, :recipient => canadian_recipient, :packages => packages, :service_type => "FEDEX_GROUND"})
53
- rate.should be_an_instance_of(Rate)
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
- rate = fedex.rate({:shipper => shipper, :recipient => canadian_recipient, :packages => packages, :service_type => "FEDEX_GROUND", :customs_clearance => customs_clearance})
144
- rate.should be_an_instance_of(Rate)
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.1.0
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-08-31 00:00:00.000000000 Z
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: &70277283362620 !ruby/object:Gem::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: *70277283362620
24
+ version_requirements: *70096915868680
25
25
  - !ruby/object:Gem::Dependency
26
26
  name: nokogiri
27
- requirement: &70277283377800 !ruby/object:Gem::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: *70277283377800
35
+ version_requirements: *70096915867780
36
36
  - !ruby/object:Gem::Dependency
37
37
  name: rspec
38
- requirement: &70277283377140 !ruby/object:Gem::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: *70277283377140
46
+ version_requirements: *70096915867020
47
47
  - !ruby/object:Gem::Dependency
48
48
  name: vcr
49
- requirement: &70277283376280 !ruby/object:Gem::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: *70277283376280
57
+ version_requirements: *70096915866260
58
58
  - !ruby/object:Gem::Dependency
59
59
  name: webmock
60
- requirement: &70277283375680 !ruby/object:Gem::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: *70277283375680
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: