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 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: