ontrac-web-services 0.9.2 → 2.0.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.
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA1:
3
+ metadata.gz: 24a06b1c019fcaf0f2cbef819a1e49a08ae3816c
4
+ data.tar.gz: 171990d6bf720583f218d2a98357d08f783ee04a
5
+ SHA512:
6
+ metadata.gz: 5628443f315087ab0867490564a284581288fcaacad9322341643addd542356341aad80d2cb561b3336c8e0756a109e0539ca208adb35d3298c0749d9d967f40
7
+ data.tar.gz: 817be89a68a55a9cea04402c06b6849b1894020c181df5ff45460dedcca9ba8a9ab3bb1f2d13b23443765bf743e75062bb57c9eb0870cd9d464059e7003978cc
data/README.md CHANGED
@@ -1,48 +1,68 @@
1
1
  # ontrac-web-services
2
2
  ## Description
3
- This gem provides an interface to the OnTrac web services API. It interfaces with its HTTP/POST API to generate labels (looking up shipping rates and tracking coming soon).
3
+ This gem provides an interface to the OnTrac web services API. It interfaces with its HTTP/POST API to generate labels.
4
4
 
5
5
  ## Examples
6
6
  ### Creating a shipment with multiple packages
7
7
 
8
8
  ```ruby
9
- require 'ontrac'
9
+ require 'logger'
10
+ require 'ontrac'
10
11
 
11
- include ::Ontrac::WebServices
12
- include ::Ontrac::WebServices::Definitions
12
+ include ::Ontrac::WebServices
13
+ include ::Ontrac::WebServices::Definitions
13
14
 
14
- credentials = Service::Credentials.new("ACCOUNT #", "PASSWORD", "production")
15
- service = Service.new(credentials)
15
+ logger = Logger.new($stderr)
16
+ credentials = Service::Credentials.new("37", "testpass", "test")
17
+ service = Service.new(credentials, StringIO.new(debug_output = ""))
16
18
 
17
- shipper = ShipperData.new
18
- shipper.name = "Fulfillment Circle"
19
- shipper.address = "343 third street"
20
- shipper.suite = "suite 17"
21
- shipper.city = "sparks"
22
- shipper.state = "nv"
23
- shipper.zip = "89434"
24
- shipper.phone = "(415) 350-2608"
19
+ requests = [ 10.1, 22, 15 ].map do |package_weight|
20
+ ShipmentRequest.new.tap do |request|
21
+ request.shipper = Shipper.new.tap do |shipper|
22
+ shipper.Name = "Fulfillment Circle"
23
+ shipper.Addr1 = "343 Third Street\nSuite 17"
24
+ shipper.City = "sparks"
25
+ shipper.State = "NV"
26
+ shipper.Zip = "89434"
27
+ shipper.Contact = "John D."
28
+ shipper.Phone = "(415) 350-2608"
29
+ end
30
+ request.consignee = Consignee.new.tap do |consignee|
31
+ consignee.Name = "Joe Shmoe"
32
+ consignee.Addr1 = "123 4th St"
33
+ consignee.Addr2 = "Suite 315"
34
+ consignee.City = "San Luis Obispo"
35
+ consignee.State = "CA"
36
+ consignee.Zip = "93401"
37
+ consignee.Phone = "(805) 555-1234"
38
+ end
39
+ request.Service = SERVICE_TYPE_GROUND
40
+ request.SignatureRequired = false
41
+ request.Residential = true
42
+ request.SaturdayDel = false
43
+ request.Declared = 0
44
+ request.Weight = package_weight
45
+ request.LabelType = LABEL_TYPE_PDF
46
+ request.ShipDate = Time.new.strftime("%Y-%m-%d")
47
+ end
48
+ end
25
49
 
26
- recipient = DeliveryData.new
27
- recipient.name = "Joe Shmoe"
28
- recipient.address = "123 4th St"
29
- recipient.address2 = "Suite 315"
30
- recipient.city = "San Luis Obispo"
31
- recipient.state = "CA"
32
- recipient.zip = "93401"
33
- recipient.phone = "(805) 555-1234"
34
-
35
- responses = service.request_shipment(SERVICE_TYPE_GROUND, shipper, recipient, LABEL_TYPE_PDF,
36
- [ 22.0, 15, 10 ]) do |package_data, package_num|
37
-
38
- package_data.package_detail.residential = false
39
- package_data.package_detail.reference = "order #1234"
40
- end
41
-
42
- tracking_numbers = responses.map do |(tracking_number, label, charge)|
43
- puts "tracking number: #{tracking_number}"
44
- puts "charge: #{charge.to_f}"
45
- File.open("#{tracking_number}.pdf", "w") { |f| f << label }
46
- tracking_number
47
- end
50
+ begin
51
+ service.post_shipments(requests).each do |(tracking_number, label, charge)|
52
+ File.open("#{tracking_number}.pdf", "w") { |f| f << label }
53
+ logger.info("label: ./#{tracking_number}.pdf, charge: #{charge}")
54
+ end
55
+ rescue ServiceException => err
56
+ logger.error("OnTrac Service Exception: #{err.message}")
57
+ logger.error("Root Error: #{err.root_error}") if (err.root_error && !err.root_error.empty?)
58
+ err.sub_errors.each do |uid, sub_error|
59
+ logger.error("Sub Error (#{uid}): #{sub_error}")
60
+ end
61
+ raise
62
+ ensure
63
+ if ($! && !debug_output.empty?)
64
+ logger.debug("OnTrac HTTP debug output")
65
+ debug_output.each_line.map(&:strip).each(&logger.method(:debug))
66
+ end
67
+ end
48
68
  ```
@@ -1,3 +1,3 @@
1
1
  module Ontrac
2
- VERSION = "0.9.2"
2
+ VERSION = "2.0.0"
3
3
  end
@@ -1,24 +1,95 @@
1
- module Ontrac::WebServices
2
- module Definitions
3
- SERVICE_TYPE_SUNRISE = 'S'
4
- SERVICE_TYPE_GOLD = 'G'
5
- SERVICE_TYPE_GROUND = 'C'
6
- SERVICE_TYPE_FREIGHT = 'H'
1
+ module Ontrac
2
+ module WebServices
3
+ module Definitions
4
+ class DefinitionBase < Struct
5
+ def initialize(*)
6
+ super
7
+ end
7
8
 
8
- LABEL_TYPE_PDF = 1
9
- LABEL_TYPE_JPG = 2
10
- LABEL_TYPE_BMP = 3
11
- LABEL_TYPE_GIF = 4
12
- LABEL_TYPE_EPL_4X3 = 5
13
- LABEL_TYPE_EPL_4X5 = 6
14
- LABEL_TYPE_ZPL_4X5 = 7
9
+ def to_xml(root_name = nil)
10
+ xml_builder = Nokogiri::XML::Builder.new
11
+ root_name ||= self.class.name.split("::").last
12
+
13
+ xml_builder.send(root_name) do |xml|
14
+ members.each do |field|
15
+ value = send(field)
16
+ if (DefinitionBase === value)
17
+ xml.doc.root << value.to_xml(field)
18
+ else
19
+ xml.send(field, value) unless (value.nil?)
20
+ end
21
+ end
22
+ end
23
+
24
+ xml_builder.doc.root
25
+ end
26
+ end
27
+
28
+ Shipper = DefinitionBase.new(
29
+ :Name,
30
+ :Addr1,
31
+ :City,
32
+ :State,
33
+ :Zip,
34
+ :Contact,
35
+ :Phone
36
+ )
37
+ Consignee = DefinitionBase.new(
38
+ :Name,
39
+ :Addr1,
40
+ :Addr2,
41
+ :Addr3,
42
+ :City,
43
+ :State,
44
+ :Zip,
45
+ :Contact,
46
+ :Phone
47
+ )
48
+ Dim = DefinitionBase.new(
49
+ :Length,
50
+ :Width,
51
+ :Height
52
+ )
53
+ ShipmentRequest = DefinitionBase.new(
54
+ :UID,
55
+ :shipper,
56
+ :consignee,
57
+ :Service,
58
+ :SignatureRequired,
59
+ :Residential,
60
+ :SaturdayDel,
61
+ :Declared,
62
+ :COD,
63
+ :CODType,
64
+ :Weight,
65
+ :Letter,
66
+ :BillTo,
67
+ :Instructions,
68
+ :Reference,
69
+ :Reference2,
70
+ :Reference3,
71
+ :Tracking,
72
+ :DIM,
73
+ :LabelType,
74
+ :ShipEmail,
75
+ :DelEmail,
76
+ :ShipDate,
77
+ :CargoType
78
+ )
79
+
80
+ SERVICE_TYPE_GROUND = "C"
81
+ SERVICE_TYPE_SUNRISE = "S"
82
+ SERVICE_TYPE_SUNRISE_GOLD = "G"
83
+ SERVICE_TYPE_PALLETIZED_FREIGHT = "H"
84
+
85
+ LABEL_TYPE_NONE = 0
86
+ LABEL_TYPE_PDF = 1
87
+ LABEL_TYPE_EPL_4_X_5 = 6
88
+ LABEL_TYPE_ZPL_4_X_5 = 7
89
+
90
+ COD_TYPE_NONE = "NONE"
91
+ COD_TYPE_UNSECURED = "UNSECURED "
92
+ COD_TYPE_SECURED = "SECURED"
93
+ end
15
94
  end
16
95
  end
17
-
18
- require 'ontrac/web_services/definitions/base'
19
- require 'ontrac/web_services/definitions/delivery_data'
20
- require 'ontrac/web_services/definitions/package'
21
- require 'ontrac/web_services/definitions/package_data'
22
- require 'ontrac/web_services/definitions/package_detail'
23
- require 'ontrac/web_services/definitions/shipment_request'
24
- require 'ontrac/web_services/definitions/shipper_data'
@@ -1,121 +1,123 @@
1
1
  require 'net/https'
2
2
  require 'nokogiri'
3
3
  require 'base64'
4
+ require 'cgi'
5
+ require 'securerandom'
4
6
 
5
7
  module Ontrac::WebServices
6
- class ServiceException < RuntimeError
7
- attr_accessor :details
8
+ class ServiceException < Exception
9
+ attr_accessor :root_error, :sub_errors
8
10
  end
9
11
 
10
12
  class Service
11
- Credentials = Struct.new(:account, :password, :environment)
13
+ class Credentials
14
+ attr_reader :account, :password, :environment
15
+
16
+ def initialize(account, password, environment)
17
+ @account = account or
18
+ raise ArgumentError.new("Missing OnTrac credential: account")
19
+ @password = password or
20
+ raise ArgumentError.new("Missing OnTrac credential: account")
21
+ @environment = environment or
22
+ raise ArgumentError.new("Missing OnTrac credential: environment")
23
+ end
24
+ end
25
+
26
+ attr_accessor :debug_output
12
27
 
13
- def initialize(credentials)
28
+ def initialize(credentials, debug_output = nil)
14
29
  @credentials = credentials
30
+ self.debug_output = debug_output
15
31
  end
16
32
 
17
- def service_url(request_name)
18
- (@credentials.environment.to_sym == :production) ?
19
- "https://www.shipontrac.net/OnTracAPI/#{request_name}.ashx" :
20
- "https://www.shipontrac.net/OnTracAPItest/#{request_name}.ashx"
21
- end
33
+ def service_url(service_name)
34
+ url_base = (@credentials.environment.to_sym == :production) ?
35
+ "https://www.shipontrac.net/OnTracWebServices/OnTracServices.svc/V2" :
36
+ "https://www.shipontrac.net/OnTracTestWebServices/OnTracServices.svc/V2"
22
37
 
23
- def request_shipment(service, shipper_data, delivery_data,
24
- label_type, package_weights, &process_contents)
25
-
26
- label_base64_encoded =
27
- label_type != Definitions::LABEL_TYPE_EPL_4X3 &&
28
- label_type != Definitions::LABEL_TYPE_EPL_4X5
29
-
30
- request = Definitions::ShipmentRequest.new
31
- request.account = @credentials.account
32
- request.password = @credentials.password
33
-
34
- request.packages = package_weights.map.with_index do |weight, ndx|
35
- Definitions::Package.new.tap do |package|
36
- package.package_data = Definitions::PackageData.new.tap do |data|
37
- data.shipper_data = shipper_data
38
- data.delivery_data = delivery_data
39
-
40
- data.package_detail = Definitions::PackageDetail.new.tap do |detail|
41
- detail.service = service
42
- detail.weight = weight
43
- detail.ship_email = ""
44
- detail.del_email = ""
45
- detail.label_type = label_type
46
- end
47
- end
38
+ "%s/%s/%s?pw=%s" % [
39
+ url_base, @credentials.account, service_name, CGI.escape(@credentials.password)
40
+ ]
41
+ end
48
42
 
49
- process_contents.call(package.package_data, ndx) if (process_contents)
50
- end
43
+ def post_shipments(shipment_requests)
44
+ shipment_requests.map do |shipment_request|
45
+ shipment_request.shipper.Contact ||= ""
46
+ shipment_request.shipper.Phone ||= ""
47
+
48
+ shipment_request.consignee.Addr2 ||= ""
49
+ shipment_request.consignee.Addr3 ||= ""
50
+ shipment_request.consignee.Contact ||= ""
51
+ shipment_request.consignee.Phone ||= ""
52
+
53
+ shipment_request.UID = SecureRandom.hex(16)
54
+ shipment_request.COD ||= 0
55
+ shipment_request.CODType ||= Definitions::COD_TYPE_NONE
56
+ shipment_request.BillTo ||= 0
57
+ shipment_request.Instructions ||= ""
58
+ shipment_request.Reference ||= ""
59
+ shipment_request.Reference2 ||= ""
60
+ shipment_request.Reference3 ||= ""
61
+ shipment_request.Tracking ||= ""
62
+ shipment_request.DIM ||= Definitions::Dim.new(0, 0, 0)
63
+ shipment_request.ShipEmail ||= ""
64
+ shipment_request.DelEmail ||= ""
51
65
  end
52
66
 
53
- package_data_path = "/OnTracShipmentResponse/Package/PackageData"
54
- num_packages = package_weights.size
55
-
56
- request_xml = Nokogiri::XML::Document.new
57
- request_xml << request.to_xml
58
-
59
- issue_request("ShipmentRequest", request_xml) do |response_xml|
60
- %w(Label Tracking Charges/TotalCharge).each do |node_name|
61
- count = response_xml.xpath("count(#{package_data_path}/#{node_name})")
62
- if (response_xml.xpath("count(#{package_data_path}/#{node_name})") != num_packages)
63
- raise "Expected #{num_packages} #{node_name} response(s), received #{count}"
67
+ xml_builder = Nokogiri::XML::Builder.new
68
+ xml_builder.OnTracShipmentRequest do |xml|
69
+ xml.Shipments do |xml|
70
+ shipment_requests.each do |shipment_request|
71
+ xml.parent << shipment_request.to_xml("Shipment")
64
72
  end
65
73
  end
74
+ end
66
75
 
67
- response_xml.xpath("/OnTracShipmentResponse/Package/PackageData").map do |xml|
68
- label_img = xml.xpath("Label").text
69
- label_img = Base64.decode64(label_img) if (label_base64_encoded)
70
-
71
- [
72
- xml.xpath("Tracking").text,
73
- label_img,
74
- Float(xml.xpath("Charges/TotalCharge").text),
75
- xml
76
- ]
77
- end
76
+ response_xml = issue_request('shipments', xml_builder.doc)
77
+ shipment_requests.map do |request|
78
+ uid = request.UID
79
+ shipment_response = response_xml.xpath(
80
+ "/OnTracShipmentResponse/Shipments/Shipment[./UID = '#{uid}']"
81
+ ).first or raise ServiceException.new("Missing package response for #{uid}")
82
+
83
+ label = shipment_response.xpath("Label").text
84
+ label = Base64.decode64(label) if (request.LabelType == Definitions::LABEL_TYPE_PDF)
85
+ [
86
+ shipment_response.xpath("Tracking").text,
87
+ label,
88
+ Float(shipment_response.xpath("TotalChrg").text)
89
+ ]
78
90
  end
79
91
  end
80
92
 
81
93
  private
82
- def issue_request(request_type, request_xml, &process_response)
83
- uri = URI.parse(service_url(request_type))
94
+ def issue_request(service_name, request_xml)
95
+ uri = URI.parse(service_url(service_name))
84
96
  http = Net::HTTP.new(uri.host, uri.port)
97
+ http.set_debug_output(debug_output) if (debug_output)
85
98
  http.use_ssl = true
86
99
 
87
100
  response = http.request_post(uri.request_uri, request_xml.to_s)
88
101
  response_xml = Nokogiri::XML(response.body)
89
102
 
90
103
  check_response(response_xml)
91
- process_response.call(response_xml)
92
- rescue Timeout::Error, SocketError => root_exception
93
- err = ServiceException.new("Network communication error")
94
- err.set_backtrace([ "#{__FILE__}:#{__LINE__ + 1}", *root_exception.backtrace ])
95
- raise err
96
- rescue Exception => root_exception
97
- err = ServiceException.new(root_exception.message)
98
- err.details = { request: request_xml.to_s, response: response.body }
99
- err.set_backtrace([ "#{__FILE__}:#{__LINE__ + 1}", *root_exception.backtrace ])
100
- raise err
104
+ response_xml
101
105
  end
102
106
 
103
107
  def check_response(response_xml)
104
- status = response_xml.xpath("/OnTracShipmentResponse/Status").text
105
- message = response_xml.xpath("/OnTracShipmentResponse/Message").text
106
- package_messages = response_xml.xpath("//PackageData/Message")
107
-
108
- if (status.empty? || status != "1" || response_xml.xpath("//PackageData/Status != 1"))
109
- if (status.empty? && message.empty?)
110
- msg = "OnTrac's label system returned an invalid response"
111
- else
112
- msg = "No status information was returned for the request" if (status.empty?)
113
- msg = message || "The request returned a status of #{status}" if (status != "1")
114
- msg << " -- " + [ *package_messages.to_a ] * " ; " if (!package_messages.empty?)
115
- end
108
+ root_error = response_xml.xpath("/OnTracShipmentResponse/Error").text
109
+ erred_shipments = response_xml.xpath("//Shipment[./Error != '']")
116
110
 
117
- raise msg
118
- end
111
+ return if (root_error.empty? && erred_shipments.empty?)
112
+
113
+ err = ServiceException.new("OnTrac responded with an error")
114
+ err.root_error = root_error
115
+ err.sub_errors = Hash[
116
+ erred_shipments.map do |shipment_response|
117
+ [ shipment_response.xpath("./UID").text, shipment_response.xpath("./Error").text ]
118
+ end
119
+ ]
120
+ raise err
119
121
  end
120
122
  end
121
123
  end
@@ -7,6 +7,7 @@ Gem::Specification.new do |gem|
7
7
  gem.description = %q{Provides an interface to the OnTrac web services API}
8
8
  gem.summary = %q{Interfaces with the OnTrac web services API to look up shipping rates, generate labels, and track shipments}
9
9
  gem.homepage = "https://github.com/brewski/ontrac-web-services"
10
+ gem.license = "MIT"
10
11
 
11
12
  gem.files = `git ls-files`.split($\)
12
13
  gem.executables = gem.files.grep(%r{^bin/}).map{ |f| File.basename(f) }
@@ -16,6 +17,5 @@ Gem::Specification.new do |gem|
16
17
  gem.version = Ontrac::VERSION
17
18
 
18
19
  gem.required_ruby_version = '>= 1.9.0'
19
- gem.add_dependency("activesupport")
20
- gem.add_dependency("nokogiri")
20
+ gem.add_dependency("nokogiri", "~> 1.0")
21
21
  end
metadata CHANGED
@@ -1,48 +1,29 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: ontrac-web-services
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.9.2
5
- prerelease:
4
+ version: 2.0.0
6
5
  platform: ruby
7
6
  authors:
8
7
  - Brian Abreu
9
8
  autorequire:
10
9
  bindir: bin
11
10
  cert_chain: []
12
- date: 2012-12-07 00:00:00.000000000 Z
11
+ date: 2015-08-15 00:00:00.000000000 Z
13
12
  dependencies:
14
- - !ruby/object:Gem::Dependency
15
- name: activesupport
16
- requirement: !ruby/object:Gem::Requirement
17
- none: false
18
- requirements:
19
- - - ! '>='
20
- - !ruby/object:Gem::Version
21
- version: '0'
22
- type: :runtime
23
- prerelease: false
24
- version_requirements: !ruby/object:Gem::Requirement
25
- none: false
26
- requirements:
27
- - - ! '>='
28
- - !ruby/object:Gem::Version
29
- version: '0'
30
13
  - !ruby/object:Gem::Dependency
31
14
  name: nokogiri
32
15
  requirement: !ruby/object:Gem::Requirement
33
- none: false
34
16
  requirements:
35
- - - ! '>='
17
+ - - "~>"
36
18
  - !ruby/object:Gem::Version
37
- version: '0'
19
+ version: '1.0'
38
20
  type: :runtime
39
21
  prerelease: false
40
22
  version_requirements: !ruby/object:Gem::Requirement
41
- none: false
42
23
  requirements:
43
- - - ! '>='
24
+ - - "~>"
44
25
  - !ruby/object:Gem::Version
45
- version: '0'
26
+ version: '1.0'
46
27
  description: Provides an interface to the OnTrac web services API
47
28
  email:
48
29
  - brian@nuts.com
@@ -50,7 +31,7 @@ executables: []
50
31
  extensions: []
51
32
  extra_rdoc_files: []
52
33
  files:
53
- - .gitignore
34
+ - ".gitignore"
54
35
  - Gemfile
55
36
  - LICENSE
56
37
  - README.md
@@ -59,38 +40,31 @@ files:
59
40
  - lib/ontrac/version.rb
60
41
  - lib/ontrac/web_services.rb
61
42
  - lib/ontrac/web_services/definitions.rb
62
- - lib/ontrac/web_services/definitions/base.rb
63
- - lib/ontrac/web_services/definitions/delivery_data.rb
64
- - lib/ontrac/web_services/definitions/package.rb
65
- - lib/ontrac/web_services/definitions/package_data.rb
66
- - lib/ontrac/web_services/definitions/package_detail.rb
67
- - lib/ontrac/web_services/definitions/shipment_request.rb
68
- - lib/ontrac/web_services/definitions/shipper_data.rb
69
43
  - lib/ontrac/web_services/service.rb
70
44
  - ontrac-web-services.gemspec
71
45
  homepage: https://github.com/brewski/ontrac-web-services
72
- licenses: []
46
+ licenses:
47
+ - MIT
48
+ metadata: {}
73
49
  post_install_message:
74
50
  rdoc_options: []
75
51
  require_paths:
76
52
  - lib
77
53
  required_ruby_version: !ruby/object:Gem::Requirement
78
- none: false
79
54
  requirements:
80
- - - ! '>='
55
+ - - ">="
81
56
  - !ruby/object:Gem::Version
82
57
  version: 1.9.0
83
58
  required_rubygems_version: !ruby/object:Gem::Requirement
84
- none: false
85
59
  requirements:
86
- - - ! '>='
60
+ - - ">="
87
61
  - !ruby/object:Gem::Version
88
62
  version: '0'
89
63
  requirements: []
90
64
  rubyforge_project:
91
- rubygems_version: 1.8.23
65
+ rubygems_version: 2.2.3
92
66
  signing_key:
93
- specification_version: 3
67
+ specification_version: 4
94
68
  summary: Interfaces with the OnTrac web services API to look up shipping rates, generate
95
69
  labels, and track shipments
96
70
  test_files: []
@@ -1,43 +0,0 @@
1
- require 'active_support'
2
- require 'nokogiri'
3
-
4
- module Ontrac::WebServices::Definitions
5
- class Base
6
- include Nokogiri
7
-
8
- def self.attr_accessor(*args)
9
- (@attributes ||= []).concat(args)
10
- super
11
- end
12
-
13
- def self.attributes
14
- return (@attributes ||= [])
15
- end
16
-
17
- def self.basename
18
- ActiveSupport::Inflector.camelize(self.name.gsub(/^.*::/, ''))
19
- end
20
-
21
- def to_xml
22
- xml_builder = Nokogiri::XML::Builder.new
23
-
24
- xml_builder.send(self.class.basename) do |xml|
25
- self.class.attributes.each do |attribute_name|
26
- (values = *self.send(attribute_name)).each do |attribute_value|
27
- xml_attr_name = respond_to?("#{attribute_name}_to_xml_name") ?
28
- send("#{attribute_name}_to_xml_name") :
29
- ActiveSupport::Inflector.camelize(attribute_name, false)
30
-
31
- if (attribute_value.is_a?(Base))
32
- xml.doc.root << attribute_value.to_xml
33
- else
34
- xml.send(xml_attr_name, attribute_value)
35
- end
36
- end
37
- end
38
- end
39
-
40
- xml_builder.doc.root
41
- end
42
- end
43
- end
@@ -1,32 +0,0 @@
1
- module Ontrac
2
- module WebServices
3
- module Definitions
4
- class DeliveryData < Base
5
- attr_accessor :name
6
- attr_accessor :address
7
- attr_accessor :address2
8
- attr_accessor :address3
9
- attr_accessor :city
10
- attr_accessor :state
11
- attr_accessor :zip
12
- attr_accessor :phone
13
- attr_accessor :contact
14
- end
15
- end
16
- end
17
- end
18
-
19
- # [ DeliveryData, Package, PackageData, PackageDetail, ShipmentRequest, ShipperData ].map do |cls|
20
- # accessors = cls.attributes.map { |a| " attr_accessor :#{a.to_s.underscore}" }
21
- # <<-CLSDEF
22
- # module Ontrac
23
- # module WebServices
24
- # module Definitions
25
- # class #{cls.name.split("::").last} < Base
26
- # #{accessors * "\n"}
27
- # end
28
- # end
29
- # end
30
- # end
31
- # CLSDEF
32
- # end
@@ -1,9 +0,0 @@
1
- module Ontrac
2
- module WebServices
3
- module Definitions
4
- class Package < Base
5
- attr_accessor :package_data
6
- end
7
- end
8
- end
9
- end
@@ -1,16 +0,0 @@
1
- module Ontrac
2
- module WebServices
3
- module Definitions
4
- class PackageData < Base
5
- attr_accessor :uid
6
- attr_accessor :shipper_data
7
- attr_accessor :delivery_data
8
- attr_accessor :package_detail
9
-
10
- def uid_to_xml_name
11
- "UID"
12
- end
13
- end
14
- end
15
- end
16
- end
@@ -1,29 +0,0 @@
1
- module Ontrac
2
- module WebServices
3
- module Definitions
4
- class PackageDetail < Base
5
- attr_accessor :ship_date
6
- attr_accessor :reference
7
- attr_accessor :tracking
8
- attr_accessor :service
9
- attr_accessor :declared
10
- attr_accessor :cod
11
- attr_accessor :cod_type
12
- attr_accessor :saturday_delivery
13
- attr_accessor :signature_rqd
14
- attr_accessor :type
15
- attr_accessor :weight
16
- attr_accessor :bill_to
17
- attr_accessor :instructions
18
- attr_accessor :ship_email
19
- attr_accessor :del_email
20
- attr_accessor :label_type
21
- attr_accessor :residential
22
-
23
- def cod_type_to_xml_name
24
- "cod_Type"
25
- end
26
- end
27
- end
28
- end
29
- end
@@ -1,16 +0,0 @@
1
- module Ontrac
2
- module WebServices
3
- module Definitions
4
- class ShipmentRequest < Base
5
- attr_accessor :account
6
- attr_accessor :password
7
- attr_accessor :request_reference
8
- attr_accessor :packages
9
-
10
- def self.basename
11
- "OntracShipmentRequest"
12
- end
13
- end
14
- end
15
- end
16
- end
@@ -1,16 +0,0 @@
1
- module Ontrac
2
- module WebServices
3
- module Definitions
4
- class ShipperData < Base
5
- attr_accessor :name
6
- attr_accessor :address
7
- attr_accessor :suite
8
- attr_accessor :city
9
- attr_accessor :state
10
- attr_accessor :zip
11
- attr_accessor :phone
12
- attr_accessor :contact
13
- end
14
- end
15
- end
16
- end