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.
Files changed (44) hide show
  1. checksums.yaml +7 -0
  2. data/.gitignore +4 -0
  3. data/Gemfile +4 -0
  4. data/README.md +113 -0
  5. data/Rakefile +3 -0
  6. data/examples/create_shipments.rb +81 -0
  7. data/fedex-web-services.gemspec +26 -0
  8. data/lib/fedex_web_services.rb +13 -0
  9. data/lib/fedex_web_services/api.rb +66 -0
  10. data/lib/fedex_web_services/close_smart_post_request.rb +23 -0
  11. data/lib/fedex_web_services/delete_shipment_request.rb +31 -0
  12. data/lib/fedex_web_services/process_shipment_request.rb +96 -0
  13. data/lib/fedex_web_services/process_shipment_response.rb +28 -0
  14. data/lib/fedex_web_services/railtie.rb +7 -0
  15. data/lib/fedex_web_services/request.rb +57 -0
  16. data/lib/fedex_web_services/response.rb +16 -0
  17. data/lib/fedex_web_services/soap.rb +6 -0
  18. data/lib/fedex_web_services/soap/CloseServiceDefinitions.rb +910 -0
  19. data/lib/fedex_web_services/soap/CloseServiceDefinitionsDriver.rb +93 -0
  20. data/lib/fedex_web_services/soap/CloseServiceDefinitionsMappingRegistry.rb +1201 -0
  21. data/lib/fedex_web_services/soap/RateServiceDefinitions.rb +4318 -0
  22. data/lib/fedex_web_services/soap/RateServiceDefinitionsDriver.rb +53 -0
  23. data/lib/fedex_web_services/soap/RateServiceDefinitionsMappingRegistry.rb +4655 -0
  24. data/lib/fedex_web_services/soap/ShipServiceDefinitions.rb +4911 -0
  25. data/lib/fedex_web_services/soap/ShipServiceDefinitionsDriver.rb +101 -0
  26. data/lib/fedex_web_services/soap/ShipServiceDefinitionsMappingRegistry.rb +5405 -0
  27. data/lib/fedex_web_services/version.rb +3 -0
  28. data/license.txt +7 -0
  29. data/tasks/generate_definitions.rake +23 -0
  30. data/tasks/test.rake +5 -0
  31. data/test/integration_test.rb +109 -0
  32. metadata +76 -34
  33. data/lib/fedex.rb +0 -2
  34. data/lib/fedex/version.rb +0 -3
  35. data/lib/fedex/web_services.rb +0 -10
  36. data/lib/fedex/web_services/definitions.rb +0 -46
  37. data/lib/fedex/web_services/request/base.rb +0 -69
  38. data/lib/fedex/web_services/request/delete_shipment.rb +0 -27
  39. data/lib/fedex/web_services/request/get_rates.rb +0 -61
  40. data/lib/fedex/web_services/request/process_shipment.rb +0 -76
  41. data/lib/fedex/web_services/service/base.rb +0 -72
  42. data/lib/fedex/web_services/service/rate.rb +0 -40
  43. data/lib/fedex/web_services/service/ship.rb +0 -85
  44. 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