trackerific 0.7.2 → 0.7.3

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 (35) hide show
  1. checksums.yaml +4 -4
  2. data/Gemfile.lock +1 -1
  3. data/README.rdoc +2 -1
  4. data/lib/dependencies.rb +9 -0
  5. data/lib/trackerific.rb +5 -19
  6. data/lib/trackerific/builders.rb +12 -0
  7. data/lib/trackerific/builders/base/soap.rb +14 -16
  8. data/lib/trackerific/builders/base/xml.rb +22 -28
  9. data/lib/trackerific/builders/fedex.rb +66 -44
  10. data/lib/trackerific/builders/ups.rb +28 -24
  11. data/lib/trackerific/builders/usps.rb +15 -13
  12. data/lib/trackerific/parsers.rb +8 -0
  13. data/lib/trackerific/parsers/base.rb +24 -28
  14. data/lib/trackerific/parsers/fedex.rb +43 -47
  15. data/lib/trackerific/parsers/ups.rb +49 -53
  16. data/lib/trackerific/parsers/usps.rb +44 -48
  17. data/lib/trackerific/services.rb +10 -0
  18. data/lib/trackerific/services/base.rb +82 -55
  19. data/lib/trackerific/services/concerns/soap.rb +10 -40
  20. data/lib/trackerific/services/concerns/xml.rb +15 -37
  21. data/lib/trackerific/services/fedex.rb +9 -19
  22. data/lib/trackerific/services/mock_service.rb +26 -37
  23. data/lib/trackerific/services/ups.rb +11 -24
  24. data/lib/trackerific/services/usps.rb +23 -35
  25. data/lib/trackerific/soap.rb +5 -0
  26. data/lib/trackerific/soap/wsdl.rb +8 -12
  27. data/lib/trackerific/version.rb +1 -1
  28. data/spec/lib/trackerific/services/base_spec.rb +21 -4
  29. data/spec/lib/trackerific/services/concerns/soap_spec.rb +6 -21
  30. data/spec/lib/trackerific/services/concerns/xml_spec.rb +5 -18
  31. data/spec/lib/trackerific/services/mock_service_spec.rb +12 -0
  32. data/spec/lib/trackerific/services/usps_spec.rb +4 -4
  33. data/spec/lib/trackerific/version_spec.rb +1 -1
  34. data/spec/support/test_concerns.rb +15 -0
  35. metadata +8 -2
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 1310f1dbf143518a58178390a664b23b697cadba
4
- data.tar.gz: 709ab9cdaa8df43975eff61b797b98586fab4e34
3
+ metadata.gz: fb9a2f038fb1728c6dd60128d782e5fae4d89d85
4
+ data.tar.gz: 43fd9368b5d08f8f7f75307ba579ac2734b615b1
5
5
  SHA512:
6
- metadata.gz: b398a2bfaab2602d8cb0624d48f7936750abb13bdfb36828a27cd4ec1f4b0a5a0763996de30edf2aa38a4270fecb31e5158a77a2d242542a3c3be6d1094b0158
7
- data.tar.gz: dfe45ddfe2c76098a2e9b6c917f6b825fb91d993f92236f9b5b28595f539b48b13d758bae1dbe1fd6ede6928ea202b95638d010ac0cf6e5b06ef81e930781ded
6
+ metadata.gz: 001ff6e68f9078c5241368d5910f1225fba1c51cfea39d19a150eb0a715cce9e709a2474f954b66e9d21dc5d29568ccd7236a5932ba25e686e1b66ea60caee8b
7
+ data.tar.gz: 0ea9be6f1b79664e963534e3e542b87a9f5c50407df442867ebf251dbb19c7e21cd965b75a7bf11c679733a1641bde1b8087e7f3db286caa810d2deb1c26f251
data/Gemfile.lock CHANGED
@@ -1,7 +1,7 @@
1
1
  PATH
2
2
  remote: .
3
3
  specs:
4
- trackerific (0.7.2)
4
+ trackerific (0.7.3)
5
5
  activesupport
6
6
  builder (>= 3.1.4)
7
7
  httparty (>= 0.12.0)
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 = { account: 'account', meter: '123456789' }
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
@@ -0,0 +1,9 @@
1
+ # 3rd party gems and dependencies
2
+
3
+ require 'active_support/all'
4
+ require 'securerandom'
5
+ require 'date'
6
+ require 'savon'
7
+ require 'httparty'
8
+ require 'builder'
9
+ require 'ostruct'
data/lib/trackerific.rb CHANGED
@@ -1,28 +1,14 @@
1
- require 'active_support'
2
- require 'active_support/core_ext/object/to_query'
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/wsdl'
14
- require 'trackerific/builders/base/soap'
15
- require 'trackerific/builders/base/xml'
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
- module Trackerific
2
- module Builders
3
- module Base
4
- class SOAP < Struct
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
- def initialize(*args)
8
- super(*args)
9
- @hash = build
10
- end
6
+ def initialize(*args)
7
+ super(*args)
8
+ @hash = build
9
+ end
11
10
 
12
- protected
11
+ protected
13
12
 
14
- def build
15
- raise NotImplementedError,
16
- "Implement this method in your builder subclass", caller
17
- end
18
- end
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
- module Trackerific
2
- module Builders
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
- class << self
8
- attr_accessor :xml_version
9
- end
4
+ class << self
5
+ attr_accessor :xml_version
6
+ end
10
7
 
11
- attr_reader :xml
8
+ attr_reader :xml
12
9
 
13
- def initialize(*args)
14
- super(*args)
15
- @xml = ""
16
- build
17
- end
10
+ def initialize(*args)
11
+ super(*args)
12
+ @xml = ""
13
+ build
14
+ end
18
15
 
19
- protected
16
+ protected
20
17
 
21
- def build
22
- raise NotImplementedError,
23
- "Implement this method in your builder subclass", caller
24
- end
18
+ def build
19
+ raise NotImplementedError,
20
+ "Implement this method in your builder subclass", caller
21
+ end
25
22
 
26
- private
23
+ private
27
24
 
28
- def builder
29
- @builder ||= begin
30
- builder = Builder::XmlMarkup.new(target: @xml)
31
- builder.instruct! :xml, version: self.class.xml_version
32
- builder
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
- module Trackerific
2
- module Builders
3
- class FedEx < Base::SOAP.new(:key, :password, :account_number, :meter_number, :package_id)
4
- protected
5
-
6
- def build
7
- root_elements.inject({}) {|r, k| r[k] = send(k); r }
8
- end
9
-
10
- private
11
-
12
- def root_elements
13
- [ :web_authentication_detail, :client_detail, :transaction_detail,
14
- :version, :selection_details, :processing_options ]
15
- end
16
-
17
- def web_authentication_detail
18
- { user_credential: { key: key, password: password } }
19
- end
20
-
21
- def client_detail
22
- { account_number: account_number, meter_number: meter_number }
23
- end
24
-
25
- def transaction_detail
26
- { customer_transaction_id: "Trackerific" }
27
- end
28
-
29
- def version
30
- { service_id: 'trck', major: '8', intermediate: '0', minor: '0' }
31
- end
32
-
33
- def selection_details
34
- { carrier_code: 'FDXE', package_identifier: package_identifier }
35
- end
36
-
37
- def package_identifier
38
- { type: 'TRACKING_NUMBER_OR_DOORTAG', value: package_id }
39
- end
40
-
41
- def processing_options
42
- 'INCLUDE_DETAILED_SCANS'
43
- end
44
- end
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
- module Trackerific
2
- module Builders
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
- def build
7
- add_access_request
8
- add_track_request
9
- end
4
+ protected
10
5
 
11
- private
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
- def add_access_request
14
- builder.AccessRequest do |ar|
15
- ar.AccessLicenseNumber key
16
- ar.UserId user_id
17
- ar.Password password
18
- end
19
- end
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
- def add_track_request
22
- builder.TrackRequest do |tr|
23
- tr.Request do |r|
24
- r.RequestAction 'Track'
25
- r.RequestOption 'activity'
26
- end
27
- tr.TrackingNumber package_id
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
- module Trackerific
2
- module Builders
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
- def build
7
- add_track_request
8
- end
4
+ protected
9
5
 
10
- private
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
- def add_track_request
13
- builder.TrackRequest(:USERID => user_id) do |t|
14
- t.TrackID(:ID => package_id)
15
- end
16
- end
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
@@ -0,0 +1,8 @@
1
+ module Trackerific
2
+ module Parsers
3
+ require 'trackerific/parsers/base'
4
+ require 'trackerific/parsers/fedex'
5
+ require 'trackerific/parsers/ups'
6
+ require 'trackerific/parsers/usps'
7
+ end
8
+ end
@@ -1,35 +1,31 @@
1
- module Trackerific
2
- module Parsers
3
- class Base
4
- def initialize(package_id, response)
5
- @package_id = package_id
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
- def parse
10
- @result ||= if response_error
11
- response_error
12
- else
13
- Trackerific::Details.new(@package_id, summary, events)
14
- end
15
- end
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
- protected
15
+ protected
18
16
 
19
- def response_error
20
- raise NotImplementedError,
21
- "Override this method in your parser", caller
22
- end
17
+ def response_error
18
+ raise NotImplementedError,
19
+ "Override this method in your parser", caller
20
+ end
23
21
 
24
- def summary
25
- raise NotImplementedError,
26
- "Override this method in your parser", caller
27
- end
22
+ def summary
23
+ raise NotImplementedError,
24
+ "Override this method in your parser", caller
25
+ end
28
26
 
29
- def events
30
- raise NotImplementedError,
31
- "Override this method in your parser", caller
32
- end
33
- end
27
+ def events
28
+ raise NotImplementedError,
29
+ "Override this method in your parser", caller
34
30
  end
35
31
  end