trackerific 0.6.2 → 0.7.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.
Files changed (50) hide show
  1. checksums.yaml +7 -0
  2. data/.gitignore +8 -0
  3. data/.rspec +1 -2
  4. data/Gemfile +3 -22
  5. data/Gemfile.lock +33 -107
  6. data/README.rdoc +35 -61
  7. data/Rakefile +10 -36
  8. data/lib/trackerific/configuration.rb +3 -46
  9. data/lib/trackerific/details.rb +2 -71
  10. data/lib/trackerific/event.rb +5 -49
  11. data/lib/trackerific/services/base.rb +45 -0
  12. data/lib/trackerific/services/fedex.rb +75 -85
  13. data/lib/trackerific/services/mock_service.rb +43 -54
  14. data/lib/trackerific/services/ups.rb +94 -103
  15. data/lib/trackerific/services/usps.rb +182 -186
  16. data/lib/trackerific/services.rb +41 -0
  17. data/lib/trackerific/version.rb +3 -0
  18. data/lib/trackerific.rb +30 -73
  19. data/spec/fixtures/{fedex_error_response.xml → fedex/error.xml} +0 -0
  20. data/spec/fixtures/{fedex_success_response.xml → fedex/success.xml} +0 -0
  21. data/spec/fixtures/{ups_error_response.xml → ups/error.xml} +0 -0
  22. data/spec/fixtures/{ups_success_response.xml → ups/success.xml} +0 -0
  23. data/spec/fixtures/{usps_city_state_lookup_response.xml → usps/city_state_lookup.xml} +0 -0
  24. data/spec/fixtures/{usps_error_response.xml → usps/error.xml} +0 -0
  25. data/spec/fixtures/{usps_success_response.xml → usps/success.xml} +0 -0
  26. data/spec/lib/trackerific/configuration_spec.rb +8 -39
  27. data/spec/lib/trackerific/details_spec.rb +13 -78
  28. data/spec/lib/trackerific/error_spec.rb +1 -5
  29. data/spec/lib/trackerific/event_spec.rb +14 -43
  30. data/spec/lib/trackerific/services/base_spec.rb +13 -0
  31. data/spec/lib/trackerific/services/fedex_spec.rb +59 -62
  32. data/spec/lib/trackerific/services/mock_service_spec.rb +33 -46
  33. data/spec/lib/trackerific/services/ups_spec.rb +46 -66
  34. data/spec/lib/trackerific/services/usps_spec.rb +80 -94
  35. data/spec/lib/trackerific/services_spec.rb +37 -0
  36. data/spec/lib/trackerific/version_spec.rb +5 -0
  37. data/spec/lib/trackerific_spec.rb +15 -53
  38. data/spec/spec_helper.rb +2 -9
  39. data/spec/support/fixtures.rb +4 -18
  40. data/spec/support/test_services.rb +23 -0
  41. data/trackerific.gemspec +24 -102
  42. metadata +151 -185
  43. data/VERSION +0 -1
  44. data/changelog +0 -9
  45. data/examples/custom_service_spec.rb +0 -44
  46. data/lib/helpers/options_helper.rb +0 -23
  47. data/lib/trackerific/service.rb +0 -100
  48. data/spec/lib/helpers/options_helper_spec.rb +0 -82
  49. data/spec/lib/trackerific/service_spec.rb +0 -44
  50. data/spec/support/trackerific.rb +0 -21
@@ -1,204 +1,200 @@
1
- require 'date'
2
1
  require 'active_support/core_ext/object/to_query'
2
+ require 'httparty'
3
+ require 'builder'
4
+ require 'date'
3
5
 
4
6
  module Trackerific
5
- require 'builder'
6
- require 'httparty'
7
-
8
- # Provides package tracking support for USPS.
9
- class USPS < Trackerific::Service
10
- # setup HTTParty
11
- include HTTParty
12
- format :xml
13
- base_uri Rails.env.production? ? "http://production.shippingapis.com" : "http://testing.shippingapis.com"
14
-
15
- class << self
7
+ module Services
8
+ # Provides package tracking support for USPS.
9
+ class USPS < Base
10
+ include HTTParty
11
+ format :xml
12
+
13
+ base_uri case (ENV['RAILS_ENV'] || 'production')
14
+ when 'production' then "http://production.shippingapis.com"
15
+ else "http://testing.shippingapis.com"
16
+ end
17
+
18
+ def initialize(options={})
19
+ @options = options
20
+ end
21
+
16
22
  # An Array of Regexp that matches valid USPS package IDs
17
23
  # @return [Array, Regexp] the regular expression
18
24
  # @api private
19
- def package_id_matchers
25
+ def self.package_id_matchers
20
26
  [ /^E\D{1}\d{9}\D{2}$|^9\d{15,21}$/ ]
21
- end
22
-
23
- # The required parameters for tracking a UPS package
24
- # @return [Array] the required parameters for tracking a UPS package
27
+ end
28
+
29
+ # Tracks a USPS package
30
+ # @param [String] package_id the package identifier
31
+ # @return [Trackerific::Details] the tracking details
32
+ # @raise [Trackerific::Error] raised when the server returns an error (invalid credentials, tracking package, etc.)
33
+ # @example Track a package
34
+ # usps = Trackerific::USPS.new user_id: 'user'
35
+ # details = ups.track_package("EJ958083578US")
36
+ # @api public
37
+ def track(id)
38
+ @package_id = id
39
+ # connect to the USPS shipping API via HTTParty
40
+ response = self.class.get(
41
+ env == 'production' ? "/ShippingAPI.dll" : "/ShippingAPITest.dll",
42
+ query: { :API => 'TrackV2', :XML => build_tracking_xml_request }.to_query
43
+ )
44
+ # raise any errors
45
+ error = check_response_for_errors(response, :TrackV2)
46
+ raise error unless error.nil?
47
+ # get the tracking information from the response
48
+ tracking_info = response['TrackResponse']['TrackInfo']
49
+ events = []
50
+ # parse the tracking events out of the USPS tracking info
51
+ tracking_info['TrackDetail'].each do |d|
52
+ events << Trackerific::Event.new(
53
+ date_of_event(d),
54
+ description_of_event(d),
55
+ location_of_event(d)
56
+ )
57
+ end unless tracking_info['TrackDetail'].nil?
58
+ # return the details
59
+ Trackerific::Details.new(
60
+ tracking_info['ID'],
61
+ tracking_info['TrackSummary'],
62
+ events
63
+ )
64
+ end
65
+
66
+ # Gets the city/state of a zipcode - requires access to USPS address APIs
67
+ # @param [String] zipcode The zipcode to find the city/state for
68
+ # @return [Hash] { zip: 'the zipcode, 'city: "the city", state: "the state" }
69
+ # @example Lookup zipcode for Beverly Hills, CA
70
+ # usps = Trackerific::USPS.new :user_id => 'youruserid'
71
+ # city_state = usps.city_state_lookup(90210)
72
+ # city_state[:city] # => BEVERLY HILLS
73
+ # city_state[:state] # => CA
74
+ # city_state[:zip] # => 90210
75
+ # @api public
76
+ def city_state_lookup(zipcode)
77
+ response = self.class.get(
78
+ env == 'production' ? "/ShippingAPI.dll" : "/ShippingAPITest.dll",
79
+ query: {
80
+ :API => 'CityStateLookup',
81
+ :XML => build_city_state_xml_request(zipcode)
82
+ }.to_query
83
+ )
84
+ # raise any errors
85
+ error = check_response_for_errors(response, :CityStateLookup)
86
+ raise error unless error.nil?
87
+ # return the city, state, and zip
88
+ response = response['CityStateLookupResponse']['ZipCode']
89
+ {
90
+ :city => response['City'],
91
+ :state => response['State'],
92
+ :zip => response['Zip5']
93
+ }
94
+ end
95
+
96
+ private
97
+
98
+ def env
99
+ @rails_env ||= ENV['RAILS_ENV'] || 'production'
100
+ end
101
+
102
+ # Parses a USPS tracking event, and returns its date
103
+ # @param [String] event The tracking event to parse
104
+ # @return [DateTime] The date / time of the event
25
105
  # @api private
26
- def required_parameters
27
- [:user_id]
106
+ def date_of_event(event)
107
+ # get the date out of
108
+ # Mon DD HH:MM am/pm THE DESCRIPTION CITY STATE ZIP.
109
+ d = event.split(" ")
110
+ DateTime.parse(d[0..3].join(" "))
28
111
  end
29
-
30
- # List of all valid options for tracking a UPS package
31
- # @return [Array] the valid options for tracking a UPS package
112
+
113
+ # Parses a USPS tracking event, and returns its description
114
+ # @param [String] event The tracking event to parse
115
+ # @return [DateTime] The description of the event
32
116
  # @api private
33
- def valid_options
34
- required_parameters + [:use_city_state_lookup]
117
+ def description_of_event(event)
118
+ # get the description out of
119
+ # Mon DD HH:MM am/pm THE DESCRIPTION CITY STATE ZIP.
120
+ d = event.split(" ")
121
+ d[4..d.length-4].join(" ").capitalize
35
122
  end
36
- end
37
-
38
- # Tracks a USPS package
39
- # @param [String] package_id the package identifier
40
- # @return [Trackerific::Details] the tracking details
41
- # @raise [Trackerific::Error] raised when the server returns an error (invalid credentials, tracking package, etc.)
42
- # @example Track a package
43
- # usps = Trackerific::USPS.new user_id: 'user'
44
- # details = ups.track_package("EJ958083578US")
45
- # @api public
46
- def track_package(package_id)
47
- super
48
- # connect to the USPS shipping API via HTTParty
49
- response = self.class.get(
50
- Rails.env.production? ? "/ShippingAPI.dll" : "/ShippingAPITest.dll",
51
- :query => { :API => 'TrackV2', :XML => build_tracking_xml_request }.to_query
52
- )
53
- # raise any errors
54
- error = check_response_for_errors(response, :TrackV2)
55
- raise error unless error.nil?
56
- # get the tracking information from the response
57
- tracking_info = response['TrackResponse']['TrackInfo']
58
- events = []
59
- # parse the tracking events out of the USPS tracking info
60
- tracking_info['TrackDetail'].each do |d|
61
- events << Trackerific::Event.new(
62
- :date => date_of_event(d),
63
- :description => description_of_event(d).capitalize,
64
- :location => location_of_event(d)
65
- )
66
- end unless tracking_info['TrackDetail'].nil?
67
- # return the details
68
- Trackerific::Details.new(
69
- :package_id => tracking_info['ID'],
70
- :summary => tracking_info['TrackSummary'],
71
- :events => events
72
- )
73
- end
74
-
75
- # Gets the city/state of a zipcode - requires access to USPS address APIs
76
- # @param [String] zipcode The zipcode to find the city/state for
77
- # @return [Hash] { zip: 'the zipcode, 'city: "the city", state: "the state" }
78
- # @example Lookup zipcode for Beverly Hills, CA
79
- # usps = Trackerific::USPS.new :user_id => 'youruserid'
80
- # city_state = usps.city_state_lookup(90210)
81
- # city_state[:city] # => BEVERLY HILLS
82
- # city_state[:state] # => CA
83
- # city_state[:zip] # => 90210
84
- # @api public
85
- def city_state_lookup(zipcode)
86
- response = self.class.get(
87
- Rails.env.production? ? "/ShippingAPI.dll" : "/ShippingAPITest.dll",
88
- :query => {
89
- :API => 'CityStateLookup',
90
- :XML => build_city_state_xml_request(zipcode)
91
- }.to_query
92
- )
93
- # raise any errors
94
- error = check_response_for_errors(response, :CityStateLookup)
95
- raise error unless error.nil?
96
- # return the city, state, and zip
97
- response = response['CityStateLookupResponse']['ZipCode']
98
- {
99
- :city => response['City'],
100
- :state => response['State'],
101
- :zip => response['Zip5']
102
- }
103
- end
104
-
105
- private
106
-
107
- # Parses a USPS tracking event, and returns its date
108
- # @param [String] event The tracking event to parse
109
- # @return [DateTime] The date / time of the event
110
- # @api private
111
- def date_of_event(event)
112
- # get the date out of
113
- # Mon DD HH:MM am/pm THE DESCRIPTION CITY STATE ZIP.
114
- d = event.split(" ")
115
- DateTime.parse(d[0..3].join(" "))
116
- end
117
-
118
- # Parses a USPS tracking event, and returns its description
119
- # @param [String] event The tracking event to parse
120
- # @return [DateTime] The description of the event
121
- # @api private
122
- def description_of_event(event)
123
- # get the description out of
124
- # Mon DD HH:MM am/pm THE DESCRIPTION CITY STATE ZIP.
125
- d = event.split(" ")
126
- d[4..d.length-4].join(" ").capitalize
127
- end
128
-
129
- # Parses a USPS tracking event, and returns its location
130
- # @param [String] event The tracking event to parse
131
- # @return The location of the event
132
- # @api private
133
- def location_of_event(event)
134
- # remove periods, and split by spaces
135
- d = event.gsub(".", "").split(" ")
136
- l = d[d.length-3, d.length] # => ['city', 'state', 'zip']
137
- # this is the location from the USPS tracking XML. it is not guaranteed
138
- # to be completely accurate, since there's no way to know if it will
139
- # always be the last 3 words.
140
- city = l[0]
141
- state = l[1]
142
- zip = l[2]
143
- # for greater accuracy, we can use the city/state lookup API from USPS
144
- if @options[:use_city_state_lookup]
145
- l = city_state_lookup(zip)
146
- # these will be nil if USPS does not have the zipcode in their database
147
- city = l[:city] unless l[:city].nil?
148
- state = l[:state] unless l[:state].nil?
149
- zip = l[:zip] unless l[:zip].nil?
123
+
124
+ # Parses a USPS tracking event, and returns its location
125
+ # @param [String] event The tracking event to parse
126
+ # @return The location of the event
127
+ # @api private
128
+ def location_of_event(event)
129
+ # remove periods, and split by spaces
130
+ d = event.gsub(".", "").split(" ")
131
+ l = d[d.length-3, d.length] # => ['city', 'state', 'zip']
132
+ # this is the location from the USPS tracking XML. it is not guaranteed
133
+ # to be completely accurate, since there's no way to know if it will
134
+ # always be the last 3 words.
135
+ city = l[0]
136
+ state = l[1]
137
+ zip = l[2]
138
+ # for greater accuracy, we can use the city/state lookup API from USPS
139
+ if @options[:use_city_state_lookup]
140
+ l = city_state_lookup(zip)
141
+ # these will be nil if USPS does not have the zipcode in their database
142
+ city = l[:city] unless l[:city].nil?
143
+ state = l[:state] unless l[:state].nil?
144
+ zip = l[:zip] unless l[:zip].nil?
145
+ end
146
+ "#{city}, #{state} #{zip}"
150
147
  end
151
- "#{city.titleize}, #{state} #{zip}"
152
- end
153
-
154
- # Checks a HTTParty response for USPS, or HTTP errors
155
- # @param [HTTParty::Response] response The HTTParty response to check
156
- # @return The exception to raise, or nil
157
- # @api private
158
- def check_response_for_errors(response, api)
159
- # return any HTTP errors
160
- return response.error unless response.code == 200
161
- # return a Trackerific::Error if there is an error in the response, or if
162
- # the tracking response is malformed
163
- return Trackerific::Error.new(response['Error']['Description']) unless response['Error'].nil?
164
- return Trackerific::Error.new("Tracking information not found in response from server.") if response['TrackResponse'].nil? && api == :TrackV2
165
- return Trackerific::Error.new("City / state information not found in response from server.") if response['CityStateLookupResponse'].nil? && api == :CityStateLookup
166
- return nil # no errors to report
167
- end
168
-
169
- # Builds an XML city/state lookup request
170
- # @param [String] zipcode The zipcode to find the city/state for
171
- # @return [String] the xml request
172
- # @api private
173
- def build_city_state_xml_request(zipcode)
174
- xml = ""
175
- # set up the Builder
176
- builder = ::Builder::XmlMarkup.new(:target => xml)
177
- # add the XML header
178
- builder.instruct! :xml, :version => "1.0", :encoding => "UTF-8"
179
- # build the request
180
- builder.CityStateLookupRequest(:USERID => @options[:user_id]) do |request|
181
- request.ZipCode(:ID => "5") do |zip|
182
- zip.Zip5 zipcode
148
+
149
+ # Checks a HTTParty response for USPS, or HTTP errors
150
+ # @param [HTTParty::Response] response The HTTParty response to check
151
+ # @return The exception to raise, or nil
152
+ # @api private
153
+ def check_response_for_errors(response, api)
154
+ # return any HTTP errors
155
+ return response.error unless response.code == 200
156
+ # return a Trackerific::Error if there is an error in the response, or if
157
+ # the tracking response is malformed
158
+ return Trackerific::Error.new(response['Error']['Description']) unless response['Error'].nil?
159
+ return Trackerific::Error.new("Tracking information not found in response from server.") if response['TrackResponse'].nil? && api == :TrackV2
160
+ return Trackerific::Error.new("City / state information not found in response from server.") if response['CityStateLookupResponse'].nil? && api == :CityStateLookup
161
+ return nil # no errors to report
162
+ end
163
+
164
+ # Builds an XML city/state lookup request
165
+ # @param [String] zipcode The zipcode to find the city/state for
166
+ # @return [String] the xml request
167
+ # @api private
168
+ def build_city_state_xml_request(zipcode)
169
+ xml = ""
170
+ # set up the Builder
171
+ builder = ::Builder::XmlMarkup.new(:target => xml)
172
+ # add the XML header
173
+ builder.instruct! :xml, :version => "1.0", :encoding => "UTF-8"
174
+ # build the request
175
+ builder.CityStateLookupRequest(:USERID => @options[:user_id]) do |request|
176
+ request.ZipCode(:ID => "5") do |zip|
177
+ zip.Zip5 zipcode
178
+ end
183
179
  end
184
180
  end
185
- end
186
-
187
- # Builds an XML tracking request
188
- # @return [String] the xml request
189
- # @api private
190
- def build_tracking_xml_request
191
- xml = ""
192
- # set up the Builder
193
- builder = ::Builder::XmlMarkup.new(:target => xml)
194
- # build the request
195
- builder.TrackRequest(:USERID => @options[:user_id]) do |t|
196
- t.TrackID(:ID => @package_id)
181
+
182
+ # Builds an XML tracking request
183
+ # @return [String] the xml request
184
+ # @api private
185
+ def build_tracking_xml_request
186
+ xml = ""
187
+ # set up the Builder
188
+ builder = ::Builder::XmlMarkup.new(:target => xml)
189
+ # build the request
190
+ builder.TrackRequest(:USERID => @options[:user_id]) do |t|
191
+ t.TrackID(:ID => @package_id)
192
+ end
193
+ # return the XML
194
+ xml
197
195
  end
198
- # return the XML
199
- xml
196
+
200
197
  end
201
-
198
+
202
199
  end
203
-
204
200
  end
@@ -0,0 +1,41 @@
1
+ module Trackerific
2
+ module Services
3
+ @services = {}
4
+
5
+ class << self
6
+ # Finds a service by the given name
7
+ # @param [Symbol] name The name of the service
8
+ # @return A descendant of Trackerific::Services::Base or nil for no match
9
+ # @api public
10
+ def [](name)
11
+ @services[name]
12
+ end
13
+
14
+ # Registers a service by the given name and class
15
+ # @param [Symbol] name The name of the service
16
+ # @param [Trackerific::Services::Base] _class The base class to register
17
+ # @api public
18
+ def []=(name, _class)
19
+ unless _class.superclass == Trackerific::Services::Base
20
+ raise ArgumentError,
21
+ "Expected a Trackerific::Services::Base, got #{_class.inspect}",
22
+ caller
23
+ end
24
+
25
+ @services[name] = _class
26
+ end
27
+
28
+ # Finds the tracking service(s) that are capable of tracking the given
29
+ # package ID
30
+ # @param [String] id The package identifier
31
+ # @return [Array, Trackerific::Services::Base] The services that are
32
+ # capable of tracking the given ID.
33
+ # @example Find out which service providers can track a FedEx ID
34
+ # Trackerific::Services.find_by_package_id "183689015000001"
35
+ # @api public
36
+ def find_by_package_id(id)
37
+ @services.map {|n,s| s if s.can_track?(id) }.compact
38
+ end
39
+ end
40
+ end
41
+ end
@@ -0,0 +1,3 @@
1
+ module Trackerific
2
+ VERSION = "0.7.0"
3
+ end
data/lib/trackerific.rb CHANGED
@@ -1,86 +1,43 @@
1
- require 'rails'
2
- require 'helpers/options_helper'
1
+ require 'trackerific/version'
3
2
  require 'trackerific/configuration'
4
- require 'trackerific/service'
5
3
  require 'trackerific/error'
6
4
  require 'trackerific/details'
7
5
  require 'trackerific/event'
6
+ require 'trackerific/services'
7
+ require 'trackerific/services/base'
8
8
 
9
- # require all the Trackerific services
10
- services_path = File.join(File.dirname(__FILE__), "trackerific", "services", "**", "*.rb")
11
- Dir[File.expand_path(services_path)].each { |file| require file }
9
+ # add tracking services here
10
+ require 'trackerific/services/fedex'
11
+ require 'trackerific/services/ups'
12
+ require 'trackerific/services/usps'
12
13
 
13
- # Trackerific provides package tracking to Rails apps.
14
14
  module Trackerific
15
-
16
15
  class << self
17
- # Gets a list of all Trackerific services
18
- # @return [Array, Symbol] the services
19
- # @api private
20
- def services
21
- # a service is any Trackerific class that descends from Trackerific::Service
22
- # [:UPS, :FedEx, :USPS, :MockService]
23
- @services ||= Trackerific.constants.reject { |const|
24
- const unless Trackerific.const_get(const).superclass == Trackerific::Service
25
- }
16
+ # Used to access the Trackerific service credentials
17
+ # @api public
18
+ def configuration
19
+ Trackerific::Configuration.config
26
20
  end
27
-
28
- # Gets a Trackerific::Service class
29
- # @param [Symbol] name the name of the service
30
- # @return [Trackerific::Service] the service, or nil
31
- # @api private
32
- def service_get(name)
33
- services.each do |service|
34
- return Trackerific.const_get(service) if name == service.to_s.downcase.to_sym
35
- end
36
- return nil
21
+
22
+ # Use to configure Trackerific service credentials
23
+ # @example Configure FedEx credentials
24
+ # Trackerific.configure do |config|
25
+ # config.fedex account: 'account', meter: '123456789'
26
+ # end
27
+ # @api public
28
+ def configure(&block)
29
+ Trackerific::Configuration.configure {|config| yield(config) }
37
30
  end
38
- end
39
-
40
- # Checks a string for a valid package tracking service
41
- # @param [String] package_id the package identifier
42
- # @return [Trackerific::Base] the Trackerific class that can track the given
43
- # package id, or nil if none found.
44
- # @example Find out which service provider will track a valid FedEx number
45
- # include Trackerific
46
- # tracking_service "183689015000001" # => Trackerific::FedEx
47
- # @api public
48
- def tracking_service(package_id)
49
- # loop through all the services
50
- Trackerific.services.each do |service|
51
- # get the class associated with this service
52
- cls = Trackerific.const_get(service)
53
- # loop through all the packge id regular expressions
54
- cls.package_id_matchers.each do |matcher|
55
- # return this class if the regular expression matches
56
- return cls if package_id =~ matcher
57
- end unless cls.package_id_matchers.nil?
31
+
32
+ # Looks up which service(s) can track the given ID and tracks it.
33
+ # @param [String] id The package identifier
34
+ # @return [Array, Trackerific::Details] The tracking results
35
+ # @raise [Trackerific::Error] Raised when the server returns an error
36
+ # @api public
37
+ def track(id)
38
+ Trackerific::Services.find_by_package_id(id).map do |service|
39
+ service.new.track(id)
40
+ end
58
41
  end
59
- # if we've made it this far, nothing matched
60
- nil
61
- end
62
-
63
- # Tracks a package by determining its service from the package id
64
- # @param [String] package_id the package identifier
65
- # @return [Trackerific::Details] the tracking results
66
- # @raise [Trackerific::Error] raised when the server returns an error (invalid credentials, tracking package, etc.)
67
- # @example Track a package
68
- # include Trackerific
69
- # # make sure to configure Trackerific before hand with the different services credentials
70
- # Trackerific.config do |config|
71
- # config.fedex :meter => '123456789', :account => '123456789'
72
- # end
73
- # details = track_package "183689015000001"
74
- # @api public
75
- def track_package(package_id)
76
- # find the service that will be able to track this package
77
- service = tracking_service package_id
78
- raise Trackerific::Error, "Cannot find a service to track package id #{package_id}" if service.nil?
79
- # get the name of the service
80
- service_name = service.to_s.split('::')[1].downcase
81
- # get the default configuration for the service
82
- options = Trackerific.configuration.send service_name
83
- # track the package
84
- service.new(options).track_package package_id
85
42
  end
86
43
  end
@@ -1,44 +1,13 @@
1
1
  require 'spec_helper'
2
2
 
3
- describe "Trackerific.configuration" do
4
- include Trackerific
5
-
6
- subject { Trackerific.configuration }
7
- it { should be_a Trackerific::Configuration }
8
-
9
- context "with valid options" do
10
- it "should not raise any errors" do
11
- lambda {
12
- Trackerific.configure do |config|
13
- config.usps :user_id => 'userid'
14
- end
15
- }.should_not raise_error
16
- end
17
- it "should save a valid option" do
18
- Trackerific.configure do |config|
19
- config.usps :user_id => 'userid'
20
- end
21
- Trackerific.configuration.usps[:user_id].should eq 'userid'
22
- end
23
- end
24
-
25
- context "with invalid options" do
26
- it "should raise ArgumentError" do
27
- lambda {
28
- Trackerific.configure do |config|
29
- config.usps :invalid => 'option'
30
- end
31
- }.should raise_error ArgumentError
32
- end
33
- end
34
-
35
- context "with invalid configuration group - not a Trackerific:Service" do
36
- it "should raise NoMethodError" do
37
- lambda {
38
- Trackerific.configure do |config|
39
- config.qwertyuiop :invalid => 'group'
40
- end
41
- }.should raise_error(NoMethodError)
3
+ describe Trackerific::Configuration do
4
+ before do
5
+ Trackerific::Configuration.configure do |config|
6
+ config.hello = 'world'
42
7
  end
43
8
  end
9
+
10
+ subject { described_class.config }
11
+
12
+ its(:hello) { should eq 'world' }
44
13
  end