fedex 3.4.0 → 3.6.0

Sign up to get free protection for your applications and to get access to all the features.
data/.gitignore CHANGED
@@ -12,3 +12,4 @@ spec/vcr
12
12
  *.bbprojectd
13
13
  .DS_Store
14
14
  hacks
15
+ .ruby-version
data/Readme.md CHANGED
@@ -1,5 +1,5 @@
1
1
  # Fedex Rate Web Service
2
-
2
+ ## Fedex API Shipment Version: 13
3
3
 
4
4
  For more information visit [Fedex Web Services for Shipping](https://www.fedex.com/wpor/web/jsp/drclinks.jsp?links=wss/index.html).
5
5
 
@@ -11,14 +11,6 @@ Note: Please make sure to test your results.
11
11
 
12
12
  # Installation:
13
13
 
14
- Rails 3.x using Bundler's Gemfile:
15
-
16
- ```ruby
17
- gem 'fedex'
18
- ````
19
-
20
- Rails 2.x or without Rails or Bundler:
21
-
22
14
  ```ruby
23
15
  gem install fedex
24
16
  ```
@@ -28,6 +20,7 @@ gem install fedex
28
20
  Define the shipper:
29
21
 
30
22
  ```ruby
23
+
31
24
  shipper = { :name => "Sender",
32
25
  :company => "Company",
33
26
  :phone_number => "555-555-5555",
@@ -68,7 +61,7 @@ packages << {
68
61
  ```
69
62
 
70
63
  By default packaging type is "YOUR PACKAGING" and the drop off type is "REGULAR PICKUP".
71
- If you need something different you can pass an extra hash for shipping options
64
+ If you need something different you can pass an extra hash for shipping options.
72
65
 
73
66
  ```ruby
74
67
  shipping_options = {
@@ -77,6 +70,20 @@ shipping_options = {
77
70
  }
78
71
  ```
79
72
 
73
+ By default the shipping charges will be assigned to the sender. If you may
74
+ change this by passing an extra hash of payment options.
75
+
76
+ ```ruby
77
+ payment_options = {
78
+ :type => "THIRD_PARTY",
79
+ :account_number => "123456789",
80
+ :name => "Third Party Payor",
81
+ :company => "Company",
82
+ :phone_number => "555-555-5555",
83
+ :country_code => "US"
84
+ }
85
+ ```
86
+
80
87
  Create a `Fedex::Shipment` object using your FedEx credentials; mode should be
81
88
  either production or development depending on what Fedex environment you want to use.
82
89
 
@@ -252,6 +259,7 @@ Fedex::Shipment::DROP_OFF_TYPES
252
259
  - [yevgenko] (https://github.com/yevgenko) (Yevgeniy Viktorov)
253
260
  - [smartacus] (https://github.com/smartacus) (Michael Lippold)
254
261
  - [jonathandean] (https://github.com/jonathandean) (Jonathan Dean)
262
+ - and more... (https://github.com/jazminschroeder/fedex/graphs/contributors)
255
263
 
256
264
  # Copyright/License:
257
265
  Copyright 2011 [Jazmin Schroeder](http://jazminschroeder.com)
data/fedex.gemspec CHANGED
@@ -22,6 +22,7 @@ Gem::Specification.new do |s|
22
22
  s.add_development_dependency "rspec", '~> 2.9.0'
23
23
  s.add_development_dependency 'vcr', '~> 2.0.0'
24
24
  s.add_development_dependency 'webmock', '~> 1.8.0'
25
+ s.add_development_dependency 'pry'
25
26
  # s.add_runtime_dependency "rest-client"
26
27
 
27
28
  s.files = `git ls-files`.split("\n")
@@ -36,7 +36,7 @@ module Fedex
36
36
  # Build xml Fedex Web Service request
37
37
  def build_xml
38
38
  builder = Nokogiri::XML::Builder.new do |xml|
39
- xml.AddressValidationRequest(:xmlns => "http://fedex.com/ws/addressvalidation/v2"){
39
+ xml.AddressValidationRequest(:xmlns => "http://fedex.com/ws/addressvalidation/v#{service[:version]}"){
40
40
  add_web_authentication_detail(xml)
41
41
  add_client_detail(xml)
42
42
  add_version(xml)
@@ -32,6 +32,9 @@ module Fedex
32
32
  # Recipient Custom ID Type
33
33
  RECIPIENT_CUSTOM_ID_TYPE = %w(COMPANY INDIVIDUAL PASSPORT)
34
34
 
35
+ # List of available Payment Types
36
+ PAYMENT_TYPE = %w(RECIPIENT SENDER THIRD_PARTY)
37
+
35
38
  # In order to use Fedex rates API you must first apply for a developer(and later production keys),
36
39
  # Visit {http://www.fedex.com/us/developer/ Fedex Developer Center} for more information about how to obtain your keys.
37
40
  # @param [String] key - Fedex web service key
@@ -44,9 +47,11 @@ module Fedex
44
47
  def initialize(credentials, options={})
45
48
  requires!(options, :shipper, :recipient, :packages)
46
49
  @credentials = credentials
47
- @shipper, @recipient, @packages, @service_type, @customs_clearance, @debug = options[:shipper], options[:recipient], options[:packages], options[:service_type], options[:customs_clearance], options[:debug]
50
+ @shipper, @recipient, @packages, @service_type, @customs_clearance_detail, @debug = options[:shipper], options[:recipient], options[:packages], options[:service_type], options[:customs_clearance_detail], options[:debug]
48
51
  @debug = ENV['DEBUG'] == 'true'
49
52
  @shipping_options = options[:shipping_options] ||={}
53
+ @payment_options = options[:payment_options] ||={}
54
+ requires!(@payment_options, :type, :account_number, :name, :company, :phone_number, :country_code) if @payment_options.length > 0
50
55
  # Expects hash with addr and port
51
56
  if options[:http_proxy]
52
57
  self.class.http_proxy options[:http_proxy][:host], options[:http_proxy][:port]
@@ -101,7 +106,7 @@ module Fedex
101
106
  add_shipper(xml)
102
107
  add_recipient(xml)
103
108
  add_shipping_charges_payment(xml)
104
- add_customs_clearance(xml) if @customs_clearance
109
+ add_customs_clearance(xml) if @customs_clearance_detail
105
110
  xml.RateRequestTypes "ACCOUNT"
106
111
  add_packages(xml)
107
112
  }
@@ -151,20 +156,20 @@ module Fedex
151
156
  # Add shipping charges to xml request
152
157
  def add_shipping_charges_payment(xml)
153
158
  xml.ShippingChargesPayment{
154
- xml.PaymentType "SENDER"
159
+ xml.PaymentType @payment_options[:type] || "SENDER"
155
160
  xml.Payor{
156
- if service[:version] >= 12
161
+ if service[:version].to_i >= Fedex::API_VERSION.to_i
157
162
  xml.ResponsibleParty {
158
- xml.AccountNumber @credentials.account_number
163
+ xml.AccountNumber @payment_options[:account_number] || @credentials.account_number
159
164
  xml.Contact {
160
- xml.PersonName @shipper[:name]
161
- xml.CompanyName @shipper[:company]
162
- xml.PhoneNumber @shipper[:phone_number]
165
+ xml.PersonName @payment_options[:name] || @shipper[:name]
166
+ xml.CompanyName @payment_options[:company] || @shipper[:company]
167
+ xml.PhoneNumber @payment_options[:phone_number] || @shipper[:phone_number]
163
168
  }
164
169
  }
165
170
  else
166
- xml.AccountNumber @credentials.account_number
167
- xml.CountryCode @shipper[:country_code]
171
+ xml.AccountNumber @payment_options[:account_number] || @credentials.account_number
172
+ xml.CountryCode @payment_options[:country_code] || @shipper[:country_code]
168
173
  end
169
174
  }
170
175
  }
@@ -271,7 +276,7 @@ module Fedex
271
276
  # Add customs clearance(for international shipments)
272
277
  def add_customs_clearance(xml)
273
278
  xml.CustomsClearanceDetail{
274
- hash_to_xml(xml, @customs_clearance)
279
+ hash_to_xml(xml, @customs_clearance_detail)
275
280
  }
276
281
  end
277
282
 
@@ -38,7 +38,7 @@ module Fedex
38
38
  add_shipper(xml)
39
39
  add_recipient(xml)
40
40
  add_shipping_charges_payment(xml)
41
- add_customs_clearance(xml) if @customs_clearance
41
+ add_customs_clearance(xml) if @customs_clearance_detail
42
42
  xml.RateRequestTypes "ACCOUNT"
43
43
  add_packages(xml)
44
44
  }
@@ -59,7 +59,7 @@ module Fedex
59
59
  end
60
60
 
61
61
  def service
62
- { :id => 'crs', :version => 10 }
62
+ { :id => 'crs', :version => Fedex::API_VERSION }
63
63
  end
64
64
 
65
65
  # Successful request
@@ -45,7 +45,7 @@ module Fedex
45
45
  add_recipient(xml)
46
46
  add_shipping_charges_payment(xml)
47
47
  add_special_services(xml) if @shipping_options[:return_reason]
48
- add_customs_clearance(xml) if @customs_clearance
48
+ add_customs_clearance(xml) if @customs_clearance_detail
49
49
  add_custom_components(xml)
50
50
  xml.RateRequestTypes "ACCOUNT"
51
51
  add_packages(xml)
@@ -96,7 +96,7 @@ module Fedex
96
96
  # Build xml Fedex Web Service request
97
97
  def build_xml
98
98
  builder = Nokogiri::XML::Builder.new do |xml|
99
- xml.ProcessShipmentRequest(:xmlns => "http://fedex.com/ws/ship/v12"){
99
+ xml.ProcessShipmentRequest(:xmlns => "http://fedex.com/ws/ship/v#{service[:version]}"){
100
100
  add_web_authentication_detail(xml)
101
101
  add_client_detail(xml)
102
102
  add_version(xml)
@@ -107,7 +107,7 @@ module Fedex
107
107
  end
108
108
 
109
109
  def service
110
- { :id => 'ship', :version => 12 }
110
+ { :id => 'ship', :version => Fedex::API_VERSION }
111
111
  end
112
112
 
113
113
  # Successful request
data/lib/fedex/version.rb CHANGED
@@ -1,3 +1,4 @@
1
1
  module Fedex
2
- VERSION = "3.4.0"
2
+ VERSION = "3.6.0"
3
+ API_VERSION = "13"
3
4
  end
@@ -93,7 +93,7 @@ module Fedex
93
93
  :packages => packages,
94
94
  :service_type => "INTERNATIONAL_PRIORITY",
95
95
  :shipping_details => shipping_options,
96
- :customs_clearance => customs,
96
+ :customs_clearance_detail => customs,
97
97
  :shipping_document => document,
98
98
  :filenames => filenames
99
99
  }
@@ -177,7 +177,7 @@ module Fedex
177
177
  }
178
178
 
179
179
  it "returns multiple rates" do
180
- rates.count.should > 1
180
+ rates.count.should >= 1
181
181
  end
182
182
 
183
183
  context "each rate" do
@@ -21,6 +21,9 @@ describe Fedex::Request::Shipment do
21
21
  let(:shipping_options) do
22
22
  { :packaging_type => "YOUR_PACKAGING", :drop_off_type => "REGULAR_PICKUP" }
23
23
  end
24
+ let(:payment_options) do
25
+ { :type => "SENDER", :account_number => fedex_credentials[:account_number], :name => "Sender", :company => "Company", :phone_number => "555-555-5555", :country_code => "US" }
26
+ end
24
27
 
25
28
  let(:filename) {
26
29
  require 'tmpdir'
@@ -39,6 +42,15 @@ describe Fedex::Request::Shipment do
39
42
 
40
43
  @shipment.class.should_not == Fedex::RateError
41
44
  end
45
+
46
+ it "succeeds with payments_options" do
47
+ expect {
48
+ @shipment = fedex.ship(options.merge(:payment_options => payment_options))
49
+ }.to_not raise_error
50
+
51
+ @shipment.class.should_not == Fedex::RateError
52
+ end
53
+
42
54
  end
43
55
 
44
56
  context 'without service_type specified', :vcr do
@@ -51,7 +63,18 @@ describe Fedex::Request::Shipment do
51
63
  @shipment = fedex.ship(options)
52
64
  }.to raise_error('Missing Required Parameter service_type')
53
65
  end
66
+ end
67
+
68
+ context 'with invalid payment_options' do
69
+ let(:options) do
70
+ {:shipper => shipper, :recipient => recipient, :packages => packages, :filename => filename, :payment_options => payment_options.merge(:account_number => nil)}
71
+ end
54
72
 
73
+ it 'raises error' do
74
+ expect {
75
+ @shipment = fedex.ship(options)
76
+ }.to raise_error('Missing Required Parameter account_number')
77
+ end
55
78
  end
56
79
 
57
80
  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.0
4
+ version: 3.6.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-11 00:00:00.000000000 Z
12
+ date: 2014-03-17 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: httparty
16
- requirement: &70203879296160 !ruby/object:Gem::Requirement
16
+ requirement: &70272120492060 !ruby/object:Gem::Requirement
17
17
  none: false
18
18
  requirements:
19
19
  - - ~>
@@ -21,10 +21,10 @@ dependencies:
21
21
  version: 0.12.0
22
22
  type: :runtime
23
23
  prerelease: false
24
- version_requirements: *70203879296160
24
+ version_requirements: *70272120492060
25
25
  - !ruby/object:Gem::Dependency
26
26
  name: nokogiri
27
- requirement: &70203879295600 !ruby/object:Gem::Requirement
27
+ requirement: &70272120491560 !ruby/object:Gem::Requirement
28
28
  none: false
29
29
  requirements:
30
30
  - - ~>
@@ -32,10 +32,10 @@ dependencies:
32
32
  version: 1.6.0
33
33
  type: :runtime
34
34
  prerelease: false
35
- version_requirements: *70203879295600
35
+ version_requirements: *70272120491560
36
36
  - !ruby/object:Gem::Dependency
37
37
  name: rspec
38
- requirement: &70203879295140 !ruby/object:Gem::Requirement
38
+ requirement: &70272120491080 !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: *70203879295140
46
+ version_requirements: *70272120491080
47
47
  - !ruby/object:Gem::Dependency
48
48
  name: vcr
49
- requirement: &70203879294660 !ruby/object:Gem::Requirement
49
+ requirement: &70272120490580 !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: *70203879294660
57
+ version_requirements: *70272120490580
58
58
  - !ruby/object:Gem::Dependency
59
59
  name: webmock
60
- requirement: &70203879294200 !ruby/object:Gem::Requirement
60
+ requirement: &70272120490100 !ruby/object:Gem::Requirement
61
61
  none: false
62
62
  requirements:
63
63
  - - ~>
@@ -65,7 +65,18 @@ dependencies:
65
65
  version: 1.8.0
66
66
  type: :development
67
67
  prerelease: false
68
- version_requirements: *70203879294200
68
+ version_requirements: *70272120490100
69
+ - !ruby/object:Gem::Dependency
70
+ name: pry
71
+ requirement: &70272120489720 !ruby/object:Gem::Requirement
72
+ none: false
73
+ requirements:
74
+ - - ! '>='
75
+ - !ruby/object:Gem::Version
76
+ version: '0'
77
+ type: :development
78
+ prerelease: false
79
+ version_requirements: *70272120489720
69
80
  description: Provides an interface to Fedex Web Services(version 10) - shipping rates,
70
81
  generate labels and address validation
71
82
  email: