fedex-web-services 1.1.51 → 2.0.1
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.
- checksums.yaml +7 -0
- data/.gitignore +4 -0
- data/Gemfile +4 -0
- data/README.md +113 -0
- data/Rakefile +3 -0
- data/examples/create_shipments.rb +81 -0
- data/fedex-web-services.gemspec +26 -0
- data/lib/fedex_web_services.rb +13 -0
- data/lib/fedex_web_services/api.rb +66 -0
- data/lib/fedex_web_services/close_smart_post_request.rb +23 -0
- data/lib/fedex_web_services/delete_shipment_request.rb +31 -0
- data/lib/fedex_web_services/process_shipment_request.rb +96 -0
- data/lib/fedex_web_services/process_shipment_response.rb +28 -0
- data/lib/fedex_web_services/railtie.rb +7 -0
- data/lib/fedex_web_services/request.rb +57 -0
- data/lib/fedex_web_services/response.rb +16 -0
- data/lib/fedex_web_services/soap.rb +6 -0
- data/lib/fedex_web_services/soap/CloseServiceDefinitions.rb +910 -0
- data/lib/fedex_web_services/soap/CloseServiceDefinitionsDriver.rb +93 -0
- data/lib/fedex_web_services/soap/CloseServiceDefinitionsMappingRegistry.rb +1201 -0
- data/lib/fedex_web_services/soap/RateServiceDefinitions.rb +4318 -0
- data/lib/fedex_web_services/soap/RateServiceDefinitionsDriver.rb +53 -0
- data/lib/fedex_web_services/soap/RateServiceDefinitionsMappingRegistry.rb +4655 -0
- data/lib/fedex_web_services/soap/ShipServiceDefinitions.rb +4911 -0
- data/lib/fedex_web_services/soap/ShipServiceDefinitionsDriver.rb +101 -0
- data/lib/fedex_web_services/soap/ShipServiceDefinitionsMappingRegistry.rb +5405 -0
- data/lib/fedex_web_services/version.rb +3 -0
- data/license.txt +7 -0
- data/tasks/generate_definitions.rake +23 -0
- data/tasks/test.rake +5 -0
- data/test/integration_test.rb +109 -0
- metadata +76 -34
- data/lib/fedex.rb +0 -2
- data/lib/fedex/version.rb +0 -3
- data/lib/fedex/web_services.rb +0 -10
- data/lib/fedex/web_services/definitions.rb +0 -46
- data/lib/fedex/web_services/request/base.rb +0 -69
- data/lib/fedex/web_services/request/delete_shipment.rb +0 -27
- data/lib/fedex/web_services/request/get_rates.rb +0 -61
- data/lib/fedex/web_services/request/process_shipment.rb +0 -76
- data/lib/fedex/web_services/service/base.rb +0 -72
- data/lib/fedex/web_services/service/rate.rb +0 -40
- data/lib/fedex/web_services/service/ship.rb +0 -85
- data/lib/generators/fedex/generate_definitions_generator.rb +0 -38
@@ -1,27 +0,0 @@
|
|
1
|
-
module Fedex::WebServices
|
2
|
-
module Request
|
3
|
-
class DeleteShipment < Base
|
4
|
-
attr_accessor :tracking_id
|
5
|
-
|
6
|
-
def initialize(service, tracking_id)
|
7
|
-
super(service)
|
8
|
-
@tracking_id = tracking_id
|
9
|
-
end
|
10
|
-
|
11
|
-
def remote_method
|
12
|
-
:deleteShipment
|
13
|
-
end
|
14
|
-
|
15
|
-
def contents
|
16
|
-
DeleteShipmentRequest.new.tap do |o|
|
17
|
-
o.webAuthenticationDetail = web_authentication_detail
|
18
|
-
o.version = version
|
19
|
-
o.clientDetail = client_detail
|
20
|
-
o.deletionControl = DeletionControlType::DELETE_ALL_PACKAGES
|
21
|
-
|
22
|
-
o.trackingId = @tracking_id
|
23
|
-
end
|
24
|
-
end
|
25
|
-
end
|
26
|
-
end
|
27
|
-
end
|
@@ -1,61 +0,0 @@
|
|
1
|
-
module Fedex::WebServices
|
2
|
-
module Request
|
3
|
-
class GetRates < Base
|
4
|
-
|
5
|
-
def initialize(service, service_type, rate_request_type, from_address, to_address, weight)
|
6
|
-
|
7
|
-
super(service)
|
8
|
-
|
9
|
-
@service_type = service_type
|
10
|
-
@from_address = from_address
|
11
|
-
@to_address = to_address
|
12
|
-
@rate_request_type = rate_request_type
|
13
|
-
@requested_package_line_items = [
|
14
|
-
RequestedPackageLineItem.new.tap do |o|
|
15
|
-
o.groupPackageCount = 1
|
16
|
-
o.sequenceNumber = 1
|
17
|
-
o.weight = weight
|
18
|
-
end
|
19
|
-
]
|
20
|
-
end
|
21
|
-
|
22
|
-
def remote_method
|
23
|
-
:getRates
|
24
|
-
end
|
25
|
-
|
26
|
-
def contents
|
27
|
-
RateRequest.new.tap do |o|
|
28
|
-
o.webAuthenticationDetail = web_authentication_detail
|
29
|
-
o.version = version
|
30
|
-
o.clientDetail = client_detail
|
31
|
-
|
32
|
-
o.requestedShipment = RequestedShipment.new.tap do |o|
|
33
|
-
o.shipTimestamp = Time.now.iso8601
|
34
|
-
o.serviceType = @service_type
|
35
|
-
o.packagingType = PackagingType::YOUR_PACKAGING
|
36
|
-
|
37
|
-
o.shipper = Party.new.tap do |o|
|
38
|
-
o.address = @from_address
|
39
|
-
end
|
40
|
-
|
41
|
-
o.recipient = Party.new.tap do |o|
|
42
|
-
o.address = @to_address
|
43
|
-
end
|
44
|
-
|
45
|
-
o.shippingChargesPayment = Payment.new.tap do |o|
|
46
|
-
o.paymentType = PaymentType::SENDER
|
47
|
-
o.payor = Payor.new.tap do |o|
|
48
|
-
o.accountNumber = @service.credentials.account_number
|
49
|
-
end
|
50
|
-
end
|
51
|
-
|
52
|
-
o.rateRequestTypes = [ @rate_request_type ]
|
53
|
-
|
54
|
-
o.packageCount = @requested_package_line_items.size
|
55
|
-
o.requestedPackageLineItems = @requested_package_line_items
|
56
|
-
end
|
57
|
-
end
|
58
|
-
end
|
59
|
-
end
|
60
|
-
end
|
61
|
-
end
|
@@ -1,76 +0,0 @@
|
|
1
|
-
module Fedex::WebServices
|
2
|
-
module Request
|
3
|
-
class ProcessShipment < Base
|
4
|
-
|
5
|
-
def self.mps_requests(service, service_type, shipper, recipient,
|
6
|
-
label_specification, package_weights)
|
7
|
-
|
8
|
-
package_weights.map.with_index do |weight, index|
|
9
|
-
requested_package_line_item = RequestedPackageLineItem.new.tap do |o|
|
10
|
-
o.sequenceNumber = index + 1
|
11
|
-
o.weight = weight
|
12
|
-
end
|
13
|
-
|
14
|
-
ProcessShipment.new(
|
15
|
-
service,
|
16
|
-
service_type,
|
17
|
-
shipper,
|
18
|
-
recipient,
|
19
|
-
label_specification,
|
20
|
-
package_weights.size,
|
21
|
-
[ requested_package_line_item ]
|
22
|
-
)
|
23
|
-
end
|
24
|
-
end
|
25
|
-
|
26
|
-
def initialize(service, service_type, shipper, recipient,
|
27
|
-
label_specification, package_count, requested_package_line_items)
|
28
|
-
|
29
|
-
super(service)
|
30
|
-
|
31
|
-
@service_type = service_type
|
32
|
-
@shipper = shipper
|
33
|
-
@recipient = recipient
|
34
|
-
@label_specification = label_specification
|
35
|
-
@package_count = package_count
|
36
|
-
@requested_package_line_items = requested_package_line_items
|
37
|
-
end
|
38
|
-
|
39
|
-
def remote_method
|
40
|
-
:processShipment
|
41
|
-
end
|
42
|
-
|
43
|
-
def contents
|
44
|
-
ProcessShipmentRequest.new.tap do |o|
|
45
|
-
o.webAuthenticationDetail = web_authentication_detail
|
46
|
-
o.version = version
|
47
|
-
o.clientDetail = client_detail
|
48
|
-
|
49
|
-
o.requestedShipment = RequestedShipment.new.tap do |o|
|
50
|
-
o.shipTimestamp = Time.now.iso8601
|
51
|
-
o.dropoffType = DropoffType::REGULAR_PICKUP
|
52
|
-
o.serviceType = @service_type
|
53
|
-
o.packagingType = PackagingType::YOUR_PACKAGING
|
54
|
-
|
55
|
-
o.shipper = @shipper
|
56
|
-
o.recipient = @recipient
|
57
|
-
|
58
|
-
o.shippingChargesPayment = Payment.new.tap do |o|
|
59
|
-
o.paymentType = PaymentType::SENDER
|
60
|
-
o.payor = Payor.new.tap do |o|
|
61
|
-
o.accountNumber = @service.credentials.account_number
|
62
|
-
end
|
63
|
-
end
|
64
|
-
|
65
|
-
o.labelSpecification = @label_specification
|
66
|
-
|
67
|
-
o.rateRequestTypes = [ RateRequestType::LIST ]
|
68
|
-
|
69
|
-
o.requestedPackageLineItems = @requested_package_line_items
|
70
|
-
o.packageCount = @package_count
|
71
|
-
end
|
72
|
-
end
|
73
|
-
end
|
74
|
-
end
|
75
|
-
end
|
76
|
-
end
|
@@ -1,72 +0,0 @@
|
|
1
|
-
require 'stringio'
|
2
|
-
|
3
|
-
module Fedex::WebServices
|
4
|
-
module Service
|
5
|
-
class ServiceException < RuntimeError
|
6
|
-
attr_accessor :details
|
7
|
-
end
|
8
|
-
|
9
|
-
class Base
|
10
|
-
include Fedex::WebServices::Definitions
|
11
|
-
include Fedex::WebServices::Request
|
12
|
-
|
13
|
-
Credentials = Struct.new(
|
14
|
-
:account_number, :meter_number, :key, :password, :environment
|
15
|
-
)
|
16
|
-
|
17
|
-
attr_accessor :credentials
|
18
|
-
attr_reader :wiredump
|
19
|
-
|
20
|
-
def initialize(credentials)
|
21
|
-
@credentials = credentials
|
22
|
-
end
|
23
|
-
|
24
|
-
def service_id
|
25
|
-
raise "service_id must be implemented by subclasses of Service"
|
26
|
-
end
|
27
|
-
|
28
|
-
def service_url
|
29
|
-
(@credentials.environment.to_sym == :production) ?
|
30
|
-
'https://ws.fedex.com:443/web-services' :
|
31
|
-
'https://wsbeta.fedex.com:443/web-services'
|
32
|
-
end
|
33
|
-
|
34
|
-
protected
|
35
|
-
def port
|
36
|
-
raise "port must be implemented by subclasses of Service"
|
37
|
-
end
|
38
|
-
|
39
|
-
private
|
40
|
-
def issue_request(request)
|
41
|
-
port = self.port
|
42
|
-
port.wiredump_dev = StringIO.new(@wiredump = "")
|
43
|
-
|
44
|
-
request_contents = request.contents
|
45
|
-
yield(request_contents) if (block_given?)
|
46
|
-
|
47
|
-
port.send(request.remote_method, request_contents).tap do |response|
|
48
|
-
check_response(response)
|
49
|
-
end
|
50
|
-
rescue Exception => root_exception
|
51
|
-
err = ServiceException.new(root_exception.message)
|
52
|
-
err.details = root_exception.detail.fault.details.validationFailureDetail.message rescue nil
|
53
|
-
err.set_backtrace([ "#{__FILE__}:#{__LINE__ + 1}", *root_exception.backtrace ])
|
54
|
-
raise err
|
55
|
-
end
|
56
|
-
|
57
|
-
def check_response(response)
|
58
|
-
error_notifications = response.notifications.reject do |notification|
|
59
|
-
[
|
60
|
-
NotificationSeverityType::SUCCESS,
|
61
|
-
NotificationSeverityType::NOTE,
|
62
|
-
NotificationSeverityType::WARNING
|
63
|
-
].include?(notification.severity)
|
64
|
-
end
|
65
|
-
|
66
|
-
if (error_notifications.any?)
|
67
|
-
raise error_notifications.map(&:message) * ". "
|
68
|
-
end
|
69
|
-
end
|
70
|
-
end
|
71
|
-
end
|
72
|
-
end
|
@@ -1,40 +0,0 @@
|
|
1
|
-
require 'bigdecimal'
|
2
|
-
|
3
|
-
module Fedex::WebServices
|
4
|
-
module Service
|
5
|
-
class Rate < Base
|
6
|
-
|
7
|
-
def get_rates(service_type, rate_request_type, from, to, weight, &process_contents)
|
8
|
-
request = GetRates.new(self,
|
9
|
-
service_type,
|
10
|
-
rate_request_type,
|
11
|
-
from,
|
12
|
-
to,
|
13
|
-
weight
|
14
|
-
)
|
15
|
-
|
16
|
-
response = issue_request(request, &process_contents)
|
17
|
-
return [ Rate.rate_for(response, rate_request_type), response ]
|
18
|
-
end
|
19
|
-
|
20
|
-
def service_id
|
21
|
-
:crs
|
22
|
-
end
|
23
|
-
|
24
|
-
def self.rate_for(response, rate_request_type)
|
25
|
-
details = response.rateReplyDetails.first.ratedShipmentDetails.select do |detail|
|
26
|
-
detail.shipmentRateDetail.rateType == "PAYOR_#{rate_request_type}_PACKAGE"
|
27
|
-
end
|
28
|
-
|
29
|
-
details.inject(0) do |acc, detail|
|
30
|
-
acc + BigDecimal.new(detail.shipmentRateDetail.totalNetCharge.amount)
|
31
|
-
end
|
32
|
-
end
|
33
|
-
|
34
|
-
protected
|
35
|
-
def port
|
36
|
-
RatePortType.new(service_url)
|
37
|
-
end
|
38
|
-
end
|
39
|
-
end
|
40
|
-
end
|
@@ -1,85 +0,0 @@
|
|
1
|
-
require 'bigdecimal'
|
2
|
-
require 'base64'
|
3
|
-
|
4
|
-
module Fedex::WebServices
|
5
|
-
module Service
|
6
|
-
class Ship < Base
|
7
|
-
|
8
|
-
def service_id
|
9
|
-
:ship
|
10
|
-
end
|
11
|
-
|
12
|
-
def process_shipment(service_type, shipper, recipient,
|
13
|
-
label_specification, package_weights, &process_contents)
|
14
|
-
|
15
|
-
curry_process_contents_callback = ->(request_number) do
|
16
|
-
return ->(request_contents) do
|
17
|
-
process_contents.call(request_contents, request_number) if (process_contents)
|
18
|
-
end
|
19
|
-
end
|
20
|
-
|
21
|
-
requests = ProcessShipment.mps_requests(self,
|
22
|
-
service_type,
|
23
|
-
shipper,
|
24
|
-
recipient,
|
25
|
-
label_specification,
|
26
|
-
package_weights
|
27
|
-
)
|
28
|
-
|
29
|
-
first, rest = requests.first, requests[1..-1]
|
30
|
-
|
31
|
-
first_response = issue_request(first, &curry_process_contents_callback.call(1))
|
32
|
-
|
33
|
-
rest_responses = rest.map.with_index do |request, index|
|
34
|
-
issue_request(request) do |request_contents|
|
35
|
-
request_contents.requestedShipment.masterTrackingId = TrackingId.new.tap do |o|
|
36
|
-
o.trackingNumber = Ship::tracking_number_for(first_response)
|
37
|
-
end
|
38
|
-
|
39
|
-
curry_process_contents_callback.call(index + 2).call(request_contents)
|
40
|
-
end
|
41
|
-
end
|
42
|
-
|
43
|
-
[ first_response, *rest_responses ].map do |response|
|
44
|
-
[
|
45
|
-
self.class.tracking_number_for(response),
|
46
|
-
self.class.label_for(response),
|
47
|
-
self.class.package_rate_for(response),
|
48
|
-
response
|
49
|
-
]
|
50
|
-
end
|
51
|
-
end
|
52
|
-
|
53
|
-
def delete_shipment(*args, &process_contents)
|
54
|
-
issue_request(DeleteShipment.new(self, *args), &process_contents)
|
55
|
-
end
|
56
|
-
|
57
|
-
def self.label_for(response)
|
58
|
-
label = response.completedShipmentDetail.completedPackageDetails.first.label
|
59
|
-
Base64.decode64(label.parts.map { |p| Base64.decode64(p.image) } * "")
|
60
|
-
end
|
61
|
-
|
62
|
-
def self.tracking_number_for(response)
|
63
|
-
response.completedShipmentDetail.completedPackageDetails[0].trackingIds[0].trackingNumber
|
64
|
-
rescue
|
65
|
-
raise "Unable to extract tracking number from response"
|
66
|
-
end
|
67
|
-
|
68
|
-
def self.package_rate_for(response)
|
69
|
-
response.completedShipmentDetail.completedPackageDetails.first.packageRating.
|
70
|
-
packageRateDetails.inject(0) do |acc, rate|
|
71
|
-
rate.rateType == ReturnedRateType::PAYOR_ACCOUNT_PACKAGE ?
|
72
|
-
acc + BigDecimal.new(rate.netCharge.amount) :
|
73
|
-
acc
|
74
|
-
end
|
75
|
-
rescue
|
76
|
-
raise "Unable to extract rate information from response"
|
77
|
-
end
|
78
|
-
|
79
|
-
protected
|
80
|
-
def port
|
81
|
-
ShipPortType.new(service_url)
|
82
|
-
end
|
83
|
-
end
|
84
|
-
end
|
85
|
-
end
|
@@ -1,38 +0,0 @@
|
|
1
|
-
module Fedex
|
2
|
-
module Generators
|
3
|
-
class GenerateDefinitionsGenerator < ::Rails::Generators::Base
|
4
|
-
FEDEX_INITIALIZER_FILE = File.join(Rails.root, 'config', 'initializers', 'fedex.rb')
|
5
|
-
|
6
|
-
class_option :wsdl_dir,
|
7
|
-
default: File.join(%w(lib fedex web_services wsdl)),
|
8
|
-
type: :string,
|
9
|
-
desc: "directory where the fedex wsld files are stored"
|
10
|
-
|
11
|
-
|
12
|
-
class_option :skip_initializer,
|
13
|
-
default: false,
|
14
|
-
type: :boolean,
|
15
|
-
desc: "install a rails initializer to load the wsdl definitions"
|
16
|
-
|
17
|
-
desc "Generate the FedEx WebServices class definitions and create an initializer to load them"
|
18
|
-
|
19
|
-
def install
|
20
|
-
wsdl_dir = options[:wsdl_dir]
|
21
|
-
wsdl_files = Dir.glob(File.join(wsdl_dir, '*.wsdl'))
|
22
|
-
target_lib_dir = File.join(Rails.root, 'lib')
|
23
|
-
|
24
|
-
if (wsdl_files.empty?)
|
25
|
-
say("Could not find any wsdl files in #{wsdl_dir}", :red)
|
26
|
-
else
|
27
|
-
Fedex::WebServices::Definitions.generate_definitions(target_lib_dir, *wsdl_files)
|
28
|
-
say("Added #{File.join(target_lib_dir, Fedex::WebServices::Definitions::MODULE_PATH)}", :green)
|
29
|
-
|
30
|
-
unless (options[:skip_initializer])
|
31
|
-
create_file(FEDEX_INITIALIZER_FILE,
|
32
|
-
"Fedex::WebServices::Definitions.load_definitions('lib')")
|
33
|
-
end
|
34
|
-
end
|
35
|
-
end
|
36
|
-
end
|
37
|
-
end
|
38
|
-
end
|