trackerific 0.7.2 → 0.7.3
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/Gemfile.lock +1 -1
- data/README.rdoc +2 -1
- data/lib/dependencies.rb +9 -0
- data/lib/trackerific.rb +5 -19
- data/lib/trackerific/builders.rb +12 -0
- data/lib/trackerific/builders/base/soap.rb +14 -16
- data/lib/trackerific/builders/base/xml.rb +22 -28
- data/lib/trackerific/builders/fedex.rb +66 -44
- data/lib/trackerific/builders/ups.rb +28 -24
- data/lib/trackerific/builders/usps.rb +15 -13
- data/lib/trackerific/parsers.rb +8 -0
- data/lib/trackerific/parsers/base.rb +24 -28
- data/lib/trackerific/parsers/fedex.rb +43 -47
- data/lib/trackerific/parsers/ups.rb +49 -53
- data/lib/trackerific/parsers/usps.rb +44 -48
- data/lib/trackerific/services.rb +10 -0
- data/lib/trackerific/services/base.rb +82 -55
- data/lib/trackerific/services/concerns/soap.rb +10 -40
- data/lib/trackerific/services/concerns/xml.rb +15 -37
- data/lib/trackerific/services/fedex.rb +9 -19
- data/lib/trackerific/services/mock_service.rb +26 -37
- data/lib/trackerific/services/ups.rb +11 -24
- data/lib/trackerific/services/usps.rb +23 -35
- data/lib/trackerific/soap.rb +5 -0
- data/lib/trackerific/soap/wsdl.rb +8 -12
- data/lib/trackerific/version.rb +1 -1
- data/spec/lib/trackerific/services/base_spec.rb +21 -4
- data/spec/lib/trackerific/services/concerns/soap_spec.rb +6 -21
- data/spec/lib/trackerific/services/concerns/xml_spec.rb +5 -18
- data/spec/lib/trackerific/services/mock_service_spec.rb +12 -0
- data/spec/lib/trackerific/services/usps_spec.rb +4 -4
- data/spec/lib/trackerific/version_spec.rb +1 -1
- data/spec/support/test_concerns.rb +15 -0
- metadata +8 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: fb9a2f038fb1728c6dd60128d782e5fae4d89d85
|
4
|
+
data.tar.gz: 43fd9368b5d08f8f7f75307ba579ac2734b615b1
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 001ff6e68f9078c5241368d5910f1225fba1c51cfea39d19a150eb0a715cce9e709a2474f954b66e9d21dc5d29568ccd7236a5932ba25e686e1b66ea60caee8b
|
7
|
+
data.tar.gz: 0ea9be6f1b79664e963534e3e542b87a9f5c50407df442867ebf251dbb19c7e21cd965b75a7bf11c679733a1641bde1b8087e7f3db286caa810d2deb1c26f251
|
data/Gemfile.lock
CHANGED
data/README.rdoc
CHANGED
@@ -33,7 +33,8 @@ You will need to configure the credentials for each service you're utilizing.
|
|
33
33
|
Services without credentials will not be accessed by the gem.
|
34
34
|
|
35
35
|
Trackerific.configure do |config|
|
36
|
-
config.fedex = {
|
36
|
+
config.fedex = { key: 'key', password: 'password', account_number: 'acct',
|
37
|
+
meter_number: '123' }
|
37
38
|
config.ups = { key: 'key', user_id: 'userid', password: 'secret' }
|
38
39
|
config.usps = { user_id: 'userid' }
|
39
40
|
end
|
data/lib/dependencies.rb
ADDED
data/lib/trackerific.rb
CHANGED
@@ -1,28 +1,14 @@
|
|
1
|
-
require '
|
2
|
-
|
3
|
-
require 'securerandom'
|
4
|
-
require 'date'
|
5
|
-
require 'savon'
|
6
|
-
require 'httparty'
|
7
|
-
require 'builder'
|
1
|
+
require 'dependencies'
|
2
|
+
|
8
3
|
require 'trackerific/version'
|
9
4
|
require 'trackerific/environment'
|
10
5
|
require 'trackerific/error'
|
11
6
|
require 'trackerific/details'
|
12
7
|
require 'trackerific/event'
|
13
|
-
require 'trackerific/soap
|
14
|
-
require 'trackerific/builders
|
15
|
-
require 'trackerific/
|
16
|
-
require 'trackerific/parsers/base'
|
17
|
-
require 'trackerific/services/concerns/soap'
|
18
|
-
require 'trackerific/services/concerns/xml'
|
8
|
+
require 'trackerific/soap'
|
9
|
+
require 'trackerific/builders'
|
10
|
+
require 'trackerific/parsers'
|
19
11
|
require 'trackerific/services'
|
20
|
-
require 'trackerific/services/base'
|
21
|
-
|
22
|
-
# add tracking services here
|
23
|
-
require 'trackerific/services/fedex'
|
24
|
-
require 'trackerific/services/ups'
|
25
|
-
require 'trackerific/services/usps'
|
26
12
|
|
27
13
|
module Trackerific
|
28
14
|
include ActiveSupport::Configurable
|
@@ -0,0 +1,12 @@
|
|
1
|
+
module Trackerific
|
2
|
+
module Builders
|
3
|
+
module Base
|
4
|
+
require 'trackerific/builders/base/soap'
|
5
|
+
require 'trackerific/builders/base/xml'
|
6
|
+
end
|
7
|
+
|
8
|
+
require 'trackerific/builders/fedex'
|
9
|
+
require 'trackerific/builders/ups'
|
10
|
+
require 'trackerific/builders/usps'
|
11
|
+
end
|
12
|
+
end
|
@@ -1,21 +1,19 @@
|
|
1
|
-
|
2
|
-
|
3
|
-
|
4
|
-
|
5
|
-
attr_reader :hash
|
1
|
+
# Base class for SOAP request builders
|
2
|
+
# @api public
|
3
|
+
class Trackerific::Builders::Base::SOAP < Struct
|
4
|
+
attr_reader :hash
|
6
5
|
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
|
6
|
+
def initialize(*args)
|
7
|
+
super(*args)
|
8
|
+
@hash = build
|
9
|
+
end
|
11
10
|
|
12
|
-
|
11
|
+
protected
|
13
12
|
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
end
|
13
|
+
# Implement this method in your builder
|
14
|
+
# @api public
|
15
|
+
def build
|
16
|
+
raise NotImplementedError,
|
17
|
+
"Implement this method in your builder subclass", caller
|
20
18
|
end
|
21
19
|
end
|
@@ -1,38 +1,32 @@
|
|
1
|
-
|
2
|
-
|
3
|
-
module Base
|
4
|
-
class XML < Struct
|
5
|
-
@xml_version = "1.0"
|
1
|
+
class Trackerific::Builders::Base::XML < Struct
|
2
|
+
@xml_version = "1.0"
|
6
3
|
|
7
|
-
|
8
|
-
|
9
|
-
|
4
|
+
class << self
|
5
|
+
attr_accessor :xml_version
|
6
|
+
end
|
10
7
|
|
11
|
-
|
8
|
+
attr_reader :xml
|
12
9
|
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
|
10
|
+
def initialize(*args)
|
11
|
+
super(*args)
|
12
|
+
@xml = ""
|
13
|
+
build
|
14
|
+
end
|
18
15
|
|
19
|
-
|
16
|
+
protected
|
20
17
|
|
21
|
-
|
22
|
-
|
23
|
-
|
24
|
-
|
18
|
+
def build
|
19
|
+
raise NotImplementedError,
|
20
|
+
"Implement this method in your builder subclass", caller
|
21
|
+
end
|
25
22
|
|
26
|
-
|
23
|
+
private
|
27
24
|
|
28
|
-
|
29
|
-
|
30
|
-
|
31
|
-
|
32
|
-
|
33
|
-
end
|
34
|
-
end
|
35
|
-
end
|
25
|
+
def builder
|
26
|
+
@builder ||= begin
|
27
|
+
builder = Builder::XmlMarkup.new(target: @xml)
|
28
|
+
builder.instruct! :xml, version: self.class.xml_version
|
29
|
+
builder
|
36
30
|
end
|
37
31
|
end
|
38
32
|
end
|
@@ -1,46 +1,68 @@
|
|
1
|
-
|
2
|
-
|
3
|
-
|
4
|
-
|
5
|
-
|
6
|
-
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
|
24
|
-
|
25
|
-
|
26
|
-
|
27
|
-
|
28
|
-
|
29
|
-
|
30
|
-
|
31
|
-
|
32
|
-
|
33
|
-
|
34
|
-
|
35
|
-
|
36
|
-
|
37
|
-
|
38
|
-
|
39
|
-
|
40
|
-
|
41
|
-
|
42
|
-
|
43
|
-
|
44
|
-
|
1
|
+
class Trackerific::Builders::FedEx < Trackerific::Builders::Base::SOAP.new(
|
2
|
+
:key, :password, :account_number, :meter_number, :package_id)
|
3
|
+
|
4
|
+
protected
|
5
|
+
|
6
|
+
# Builds the FedEx track request XML
|
7
|
+
# @api private
|
8
|
+
def build
|
9
|
+
root_nodes.inject({}) {|r, k| r[k] = send(k); r }
|
10
|
+
end
|
11
|
+
|
12
|
+
private
|
13
|
+
|
14
|
+
# Array of XML root nodes
|
15
|
+
# @api private
|
16
|
+
def root_nodes
|
17
|
+
[ :web_authentication_detail, :client_detail, :transaction_detail,
|
18
|
+
:version, :selection_details, :processing_options ]
|
19
|
+
end
|
20
|
+
|
21
|
+
# Descriptive data to be used in authentication of the sender's identity
|
22
|
+
# (and right to use FedEx web services)
|
23
|
+
# @api private
|
24
|
+
def web_authentication_detail
|
25
|
+
{ user_credential: { key: key, password: password } }
|
26
|
+
end
|
27
|
+
|
28
|
+
# Descriptive data identifying the client submitting the transaction
|
29
|
+
# @api private
|
30
|
+
def client_detail
|
31
|
+
{ account_number: account_number, meter_number: meter_number }
|
32
|
+
end
|
33
|
+
|
34
|
+
# Contains a free form field that is echoed back in the reply to match
|
35
|
+
# requests with replies and data that governs the data payload
|
36
|
+
# language/translations
|
37
|
+
# @api private
|
38
|
+
def transaction_detail
|
39
|
+
{ customer_transaction_id: "Trackerific" }
|
40
|
+
end
|
41
|
+
|
42
|
+
|
43
|
+
# The version of the FedEx API being used
|
44
|
+
# @api private
|
45
|
+
def version
|
46
|
+
{ service_id: 'trck', major: '8', intermediate: '0', minor: '0' }
|
47
|
+
end
|
48
|
+
|
49
|
+
# Specifies the details needed to select the shipment being requested to
|
50
|
+
# be tracked
|
51
|
+
# @api private
|
52
|
+
def selection_details
|
53
|
+
{ carrier_code: 'FDXE', package_identifier: package_identifier }
|
54
|
+
end
|
55
|
+
|
56
|
+
# The type and value of the package identifier that is to be used to
|
57
|
+
# retrieve the tracking information for a package or group of packages
|
58
|
+
# @api private
|
59
|
+
def package_identifier
|
60
|
+
{ type: 'TRACKING_NUMBER_OR_DOORTAG', value: package_id }
|
61
|
+
end
|
62
|
+
|
63
|
+
# Include detailed scan results
|
64
|
+
# @api private
|
65
|
+
def processing_options
|
66
|
+
'INCLUDE_DETAILED_SCANS'
|
45
67
|
end
|
46
68
|
end
|
@@ -1,32 +1,36 @@
|
|
1
|
-
|
2
|
-
|
3
|
-
class UPS < Base::XML.new(:key, :user_id, :password, :package_id)
|
4
|
-
protected
|
1
|
+
class Trackerific::Builders::UPS < Trackerific::Builders::Base::XML.new(
|
2
|
+
:key, :user_id, :password, :package_id)
|
5
3
|
|
6
|
-
|
7
|
-
add_access_request
|
8
|
-
add_track_request
|
9
|
-
end
|
4
|
+
protected
|
10
5
|
|
11
|
-
|
6
|
+
# Builds the UPS track request XML
|
7
|
+
# @api private
|
8
|
+
def build
|
9
|
+
add_access_request
|
10
|
+
add_track_request
|
11
|
+
end
|
12
12
|
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
|
13
|
+
private
|
14
|
+
|
15
|
+
# Adds the user credentials to the XML
|
16
|
+
# @api private
|
17
|
+
def add_access_request
|
18
|
+
builder.AccessRequest do |ar|
|
19
|
+
ar.AccessLicenseNumber key
|
20
|
+
ar.UserId user_id
|
21
|
+
ar.Password password
|
22
|
+
end
|
23
|
+
end
|
20
24
|
|
21
|
-
|
22
|
-
|
23
|
-
|
24
|
-
|
25
|
-
|
26
|
-
|
27
|
-
|
28
|
-
end
|
25
|
+
# Adds the track request and package id to the XML
|
26
|
+
# @api private
|
27
|
+
def add_track_request
|
28
|
+
builder.TrackRequest do |tr|
|
29
|
+
tr.Request do |r|
|
30
|
+
r.RequestAction 'Track'
|
31
|
+
r.RequestOption 'activity'
|
29
32
|
end
|
33
|
+
tr.TrackingNumber package_id
|
30
34
|
end
|
31
35
|
end
|
32
36
|
end
|
@@ -1,19 +1,21 @@
|
|
1
|
-
|
2
|
-
|
3
|
-
class USPS < Base::XML.new(:user_id, :package_id)
|
4
|
-
protected
|
1
|
+
class Trackerific::Builders::USPS < Trackerific::Builders::Base::XML.new(
|
2
|
+
:user_id, :package_id)
|
5
3
|
|
6
|
-
|
7
|
-
add_track_request
|
8
|
-
end
|
4
|
+
protected
|
9
5
|
|
10
|
-
|
6
|
+
# Builds the USPS track request XML
|
7
|
+
# @api private
|
8
|
+
def build
|
9
|
+
add_track_request
|
10
|
+
end
|
11
|
+
|
12
|
+
private
|
11
13
|
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
|
14
|
+
# Adds the track request and package id to the XML
|
15
|
+
# @api private
|
16
|
+
def add_track_request
|
17
|
+
builder.TrackRequest(:USERID => user_id) do |t|
|
18
|
+
t.TrackID(:ID => package_id)
|
17
19
|
end
|
18
20
|
end
|
19
21
|
end
|
@@ -1,35 +1,31 @@
|
|
1
|
-
|
2
|
-
|
3
|
-
|
4
|
-
|
5
|
-
|
6
|
-
@response = response
|
7
|
-
end
|
1
|
+
class Trackerific::Parsers::Base
|
2
|
+
def initialize(package_id, response)
|
3
|
+
@package_id = package_id
|
4
|
+
@response = response
|
5
|
+
end
|
8
6
|
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
|
7
|
+
def parse
|
8
|
+
@result ||= if response_error
|
9
|
+
response_error
|
10
|
+
else
|
11
|
+
Trackerific::Details.new(@package_id, summary, events)
|
12
|
+
end
|
13
|
+
end
|
16
14
|
|
17
|
-
|
15
|
+
protected
|
18
16
|
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
|
17
|
+
def response_error
|
18
|
+
raise NotImplementedError,
|
19
|
+
"Override this method in your parser", caller
|
20
|
+
end
|
23
21
|
|
24
|
-
|
25
|
-
|
26
|
-
|
27
|
-
|
22
|
+
def summary
|
23
|
+
raise NotImplementedError,
|
24
|
+
"Override this method in your parser", caller
|
25
|
+
end
|
28
26
|
|
29
|
-
|
30
|
-
|
31
|
-
|
32
|
-
end
|
33
|
-
end
|
27
|
+
def events
|
28
|
+
raise NotImplementedError,
|
29
|
+
"Override this method in your parser", caller
|
34
30
|
end
|
35
31
|
end
|