package_tracker 0.0.2

Sign up to get free protection for your applications and to get access to all the features.
data/.Gemfile ADDED
File without changes
data/.autotest ADDED
@@ -0,0 +1,16 @@
1
+ # ./.autotest
2
+ Autotest.add_hook(:initialize) {|at|
3
+ at.add_exception %r{^\.git} # ignore Version Control System
4
+ at.add_exception %r{^./tmp} # ignore temp files, lest autotest will run again, and again...
5
+
6
+ at.clear_mappings # take out the default (test/test*rb)
7
+
8
+ at.add_mapping(%r{^lib/.*\.rb$}) {|f, _|
9
+ Dir['spec/**/*_spec.rb']
10
+ }
11
+ at.add_mapping(%r{^spec/.*\.rb$}) {|f, _|
12
+ Dir['spec/**/*_spec.rb']
13
+ }
14
+
15
+ nil
16
+ }
data/.document ADDED
@@ -0,0 +1,5 @@
1
+ lib/**/*.rb
2
+ bin/*
3
+ -
4
+ features/**/*.feature
5
+ LICENSE.txt
data/.rspec ADDED
File without changes
data/.rvmrc ADDED
@@ -0,0 +1 @@
1
+ rvm 1.9.2
data/Gemfile ADDED
@@ -0,0 +1,12 @@
1
+ source 'http://rubygems.org'
2
+
3
+ gem 'nokogiri'
4
+ gem 'facets'
5
+
6
+ group :development do
7
+ gem 'bundler', '~> 1.0.0'
8
+ gem 'jeweler', '~> 1.6.0'
9
+ gem 'rcov', '>= 0'
10
+ gem 'rspec', '~> 2.6.0'
11
+ gem 'webmock'
12
+ end
data/Gemfile.lock ADDED
@@ -0,0 +1,38 @@
1
+ GEM
2
+ remote: http://rubygems.org/
3
+ specs:
4
+ addressable (2.2.6)
5
+ crack (0.1.8)
6
+ diff-lcs (1.1.2)
7
+ facets (2.9.1)
8
+ git (1.2.5)
9
+ jeweler (1.6.0)
10
+ bundler (~> 1.0.0)
11
+ git (>= 1.2.5)
12
+ rake
13
+ nokogiri (1.4.4)
14
+ rake (0.8.7)
15
+ rcov (0.9.9)
16
+ rspec (2.6.0)
17
+ rspec-core (~> 2.6.0)
18
+ rspec-expectations (~> 2.6.0)
19
+ rspec-mocks (~> 2.6.0)
20
+ rspec-core (2.6.0)
21
+ rspec-expectations (2.6.0)
22
+ diff-lcs (~> 1.1.2)
23
+ rspec-mocks (2.6.0)
24
+ webmock (1.6.2)
25
+ addressable (>= 2.2.2)
26
+ crack (>= 0.1.7)
27
+
28
+ PLATFORMS
29
+ ruby
30
+
31
+ DEPENDENCIES
32
+ bundler (~> 1.0.0)
33
+ facets
34
+ jeweler (~> 1.6.0)
35
+ nokogiri
36
+ rcov
37
+ rspec (~> 2.6.0)
38
+ webmock
data/LICENSE.txt ADDED
@@ -0,0 +1,20 @@
1
+ Copyright (c) 2011 Michael Taras
2
+
3
+ Permission is hereby granted, free of charge, to any person obtaining
4
+ a copy of this software and associated documentation files (the
5
+ "Software"), to deal in the Software without restriction, including
6
+ without limitation the rights to use, copy, modify, merge, publish,
7
+ distribute, sublicense, and/or sell copies of the Software, and to
8
+ permit persons to whom the Software is furnished to do so, subject to
9
+ the following conditions:
10
+
11
+ The above copyright notice and this permission notice shall be
12
+ included in all copies or substantial portions of the Software.
13
+
14
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
15
+ EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
16
+ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
17
+ NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
18
+ LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
19
+ OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
20
+ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
data/README.rdoc ADDED
@@ -0,0 +1,53 @@
1
+ = PackageTracker
2
+
3
+ PackageTracker is a ruby gem for fetching the status of a packages(UPS, FedEx, etc...) with a simple API. Currently only UPS and FedEx are supported. More docs and carrier support to come soon...
4
+
5
+
6
+ == Installation
7
+
8
+ To install:
9
+
10
+ gem install package_tracker
11
+
12
+
13
+ == Usage
14
+
15
+ @client = PackageTracker::Client.new(Yaml.load_file("credentials.yaml"))
16
+
17
+ fedex_response = @client.track("999999999999")
18
+ # => PackageTracker::Response
19
+
20
+ fedex_response.delivered?
21
+ # => true
22
+
23
+ fedex_response.statuses
24
+ # => [{:message => "DELIVERED", :location => "San Francsico, CA, USA", :time => 2011-04-22 00:00:00 -0700}, ...]
25
+
26
+ ups_response = @client.track("1Z9999999999999999")
27
+ # and so on...
28
+
29
+ == Configuration
30
+
31
+ PackageTracker::Client::new takes a hash of credentials with the following parameters:
32
+
33
+ {
34
+ :ups => {
35
+ :key => "key"
36
+ :user_id => "user id"
37
+ :password => "password"
38
+ },
39
+ :fedex => {
40
+ :password => "password",
41
+ :key => "key",
42
+ :account => "account",
43
+ :meter => "meter number"
44
+ }
45
+ }
46
+
47
+ It's usually easiest to put those credentials in a YAML file and load them in. That makes it easy to keep your sensitive password info out of git as well.
48
+
49
+ If you just want to hit the carriers' test servers, you can set your client to test mode:
50
+ @client = PackageTracker::Client.new(Yaml.load_file("credentials.yaml"))
51
+
52
+ @client.test_mode!
53
+ # => all requests will now to to the carriers' test servers
data/Rakefile ADDED
@@ -0,0 +1,53 @@
1
+ # encoding: utf-8
2
+
3
+ require 'rubygems'
4
+ require 'bundler'
5
+ begin
6
+ Bundler.setup(:default, :development)
7
+ rescue Bundler::BundlerError => e
8
+ $stderr.puts e.message
9
+ $stderr.puts "Run `bundle install` to install missing gems"
10
+ exit e.status_code
11
+ end
12
+ require 'rake'
13
+
14
+ require 'jeweler'
15
+ Jeweler::Tasks.new do |gem|
16
+ # gem is a Gem::Specification... see http://docs.rubygems.org/read/chapter/20 for more options
17
+ gem.name = "package_tracker"
18
+ gem.homepage = "http://github.com/michaeltaras/package_tracker"
19
+ gem.license = "MIT"
20
+ gem.summary = %Q{PackageTracker is a ruby gem for fetching the status of a packages(UPS, FedEx, etc...) with a simple API.}
21
+ gem.description = %Q{PackageTracker is a ruby gem for fetching the status of a packages(UPS, FedEx, etc...) with a simple API.}
22
+ gem.email = "michaeltaras@gmail.com"
23
+ gem.authors = ["Michael Taras"]
24
+ # dependencies defined in Gemfile
25
+ end
26
+ Jeweler::RubygemsDotOrgTasks.new
27
+
28
+ require 'rake/testtask'
29
+ Rake::TestTask.new(:test) do |test|
30
+ test.libs << 'lib' << 'test'
31
+ test.pattern = 'test/**/test_*.rb'
32
+ test.verbose = true
33
+ end
34
+
35
+ require 'rcov/rcovtask'
36
+ Rcov::RcovTask.new do |test|
37
+ test.libs << 'test'
38
+ test.pattern = 'test/**/test_*.rb'
39
+ test.verbose = true
40
+ test.rcov_opts << '--exclude "gems/*"'
41
+ end
42
+
43
+ task :default => :test
44
+
45
+ require 'rake/rdoctask'
46
+ Rake::RDocTask.new do |rdoc|
47
+ version = File.exist?('VERSION') ? File.read('VERSION') : ""
48
+
49
+ rdoc.rdoc_dir = 'rdoc'
50
+ rdoc.title = "package_tracker #{version}"
51
+ rdoc.rdoc_files.include('README*')
52
+ rdoc.rdoc_files.include('lib/**/*.rb')
53
+ end
data/VERSION ADDED
@@ -0,0 +1 @@
1
+ 0.0.2
@@ -0,0 +1,9 @@
1
+ module PackageTracker
2
+ module Carrier
3
+ def validate_credentials!(credentials)
4
+ required_credentials.each do |key|
5
+ raise MissingCredentialsError, "You must provide a #{key} in the options" unless credentials && credentials[key]
6
+ end
7
+ end
8
+ end
9
+ end
@@ -0,0 +1,106 @@
1
+ module PackageTracker
2
+ module Carriers
3
+ module FedEx
4
+ extend Carrier
5
+ extend self
6
+
7
+ TEST_URL = 'gatewaybeta.fedex.com'
8
+ LIVE_URL = 'gateway.fedex.com'
9
+
10
+ PATH = "/xml"
11
+ PORT = "443"
12
+
13
+ def track(tracking_number, options)
14
+ validate_credentials!(options[:credentials])
15
+ repsonse = Request.post(
16
+ request_url(options[:testing]),
17
+ PATH,
18
+ request_data(tracking_number, options[:credentials]),
19
+ :https => true,
20
+ :port => PORT
21
+ )
22
+ parse_response(tracking_number, repsonse)
23
+ end
24
+
25
+ def match(tracking_number)
26
+ tracking_number =~ /^\w{9}$/ || tracking_number =~ /^\d{12,15}$/ || tracking_number =~ /^96\d{20}$/
27
+ end
28
+
29
+ def delivered_status
30
+ "Delivered"
31
+ end
32
+
33
+ private
34
+
35
+ def required_credentials
36
+ [:key, :password, :account, :meter]
37
+ end
38
+
39
+ def request_url(testing)
40
+ testing ? TEST_URL : LIVE_URL
41
+ end
42
+
43
+ def request_data(tracking_number, credentials)
44
+ "<?xml version='1.0'?>
45
+ <TrackRequest xmlns='http://fedex.com/ws/track/v3'>
46
+ <WebAuthenticationDetail>
47
+ <UserCredential>
48
+ <Key>#{credentials[:key]}</Key>
49
+ <Password>#{credentials[:password]}</Password>
50
+ </UserCredential>
51
+ </WebAuthenticationDetail>
52
+ <ClientDetail>
53
+ <AccountNumber>#{credentials[:account]}</AccountNumber>
54
+ <MeterNumber>#{credentials[:meter]}</MeterNumber>
55
+ </ClientDetail>
56
+ <TransactionDetail>
57
+ <CustomerTransactionId>Package Tracker Ruby Gem</CustomerTransactionId>
58
+ </TransactionDetail>
59
+ <Version>
60
+ <ServiceId>trck</ServiceId>
61
+ <Major>3</Major>
62
+ <Intermediate>0</Intermediate>
63
+ <Minor>0</Minor>
64
+ </Version>
65
+ <PackageIdentifier>
66
+ <Value>#{tracking_number}</Value>
67
+ <Type>TRACKING_NUMBER_OR_DOORTAG</Type>
68
+ </PackageIdentifier>
69
+ <IncludeDetailedScans>1</IncludeDetailedScans>
70
+ </TrackRequest>
71
+ "
72
+ end
73
+
74
+ def parse_response(tracking_number, response)
75
+ handle_errors(response)
76
+
77
+ tracking_response = Response.new(tracking_number, self)
78
+ Nokogiri::XML(response.body).xpath("//v3:Events").each do |event|
79
+ location = nil
80
+ unless event.xpath("v3:Address//v3:City").empty?
81
+ location = "#{event.xpath("v3:Address//v3:City").text}," +
82
+ "#{event.xpath("v3:Address//v3:StateOrProvinceCode").text}," +
83
+ "#{event.xpath("v3:Address//v3:CountryCode").text}"
84
+ end
85
+
86
+ tracking_response.add_status(
87
+ event.xpath("v3:EventDescription").text,
88
+ Time.parse(event.xpath("v3:Timestamp").text),
89
+ location
90
+ )
91
+ end
92
+ tracking_response
93
+ end
94
+
95
+ def handle_errors(response)
96
+ document = Nokogiri::XML(response.body)
97
+ if document.children.first.namespace.prefix == "ns"
98
+ raise InvalidCredentialsError if document.xpath("//ns:Notifications//ns:Code").text == "1000"
99
+ elsif document.children.first.namespace.prefix == "v3"
100
+ raise InvalidTrackingNumberError if document.xpath("//v3:Notifications//v3:Code").text == "9040"
101
+ end
102
+ end
103
+
104
+ end
105
+ end
106
+ end
@@ -0,0 +1,79 @@
1
+ module PackageTracker
2
+ module Carriers
3
+ module UPS
4
+ extend Carrier
5
+ extend self
6
+
7
+ TEST_URL = "wwwcie.ups.com"
8
+ LIVE_URL = "www.ups.com"
9
+ PATH = "/ups.app/xml/Track"
10
+
11
+ def track(tracking_number, options)
12
+ validate_credentials!(options[:credentials])
13
+ repsonse = Request.post(request_url(options[:testing]), PATH, request_data(tracking_number, options[:credentials]))
14
+ parse_response(tracking_number, repsonse)
15
+ end
16
+
17
+ def match(tracking_number)
18
+ tracking_number =~ /^1Z\d*/
19
+ end
20
+
21
+ def delivered_status
22
+ "DELIVERED"
23
+ end
24
+
25
+ private
26
+
27
+ def request_url(testing)
28
+ TEST_URL # apparently we don't need the live url for tracking
29
+ end
30
+
31
+ def required_credentials
32
+ [:user_id, :key, :password]
33
+ end
34
+
35
+ def request_data(tracking_number, credentials)
36
+ "<?xml version='1.0'?>
37
+ <AccessRequest xml:lang='en-US'>
38
+ <AccessLicenseNumber>#{credentials[:key]}</AccessLicenseNumber>
39
+ <UserId>#{credentials[:user_id]}</UserId>
40
+ <Password>#{credentials[:password]}</Password>
41
+ </AccessRequest>
42
+ <?xml version='1.0'?>
43
+ <TrackRequest xml:lang='en-US'>
44
+ <Request>
45
+ <TransactionReference>
46
+ <XpciVersion>1.0</XpciVersion>
47
+ </TransactionReference>
48
+ <RequestAction>Track</RequestAction>
49
+ <RequestOption>activity</RequestOption>
50
+ </Request>
51
+ <TrackingNumber>#{tracking_number}</TrackingNumber>
52
+ </TrackRequest>
53
+ "
54
+ end
55
+
56
+ def parse_response(tracking_number, response)
57
+ handle_errors(response)
58
+
59
+ tracking_response = Response.new(tracking_number, self)
60
+ Nokogiri::XML(response.body).css("Package Activity").each do |activity|
61
+ tracking_response.add_status(
62
+ activity.css("Status Description").text,
63
+ Time.parse(activity.css("Date").text) + activity.css("Time").text.to_i,
64
+ "#{activity.css("City Address").text}, #{activity.css("City StateProvinceCode").text}, #{activity.css("City StateProvinceCode").text}"
65
+ )
66
+ end
67
+ tracking_response
68
+ end
69
+
70
+ def handle_errors(response)
71
+ case Nokogiri::XML(response.body).css("Error ErrorCode").text
72
+ when "250003" then raise InvalidCredentialsError
73
+ when "151018" then raise InvalidTrackingNumberError
74
+ end
75
+ end
76
+
77
+ end
78
+ end
79
+ end
@@ -0,0 +1,12 @@
1
+ module PackageTracker
2
+ module Carriers
3
+ module USPS
4
+ extend Carrier
5
+ extend self
6
+
7
+ def match(tracking_number)
8
+ tracking_number =~ /^\d{20}$/ || tracking_number =~ /^\d{30}$/ || tracking_number =~ /^[A-Za-z]{2}\d{9}[A-Za-z]{2}$/
9
+ end
10
+ end
11
+ end
12
+ end
@@ -0,0 +1,38 @@
1
+ module PackageTracker
2
+ class Client
3
+ attr_accessor :credentials
4
+ attr_reader :mode
5
+
6
+ def initialize(credentials={})
7
+ @credentials = credentials
8
+ end
9
+
10
+ def track(tracking_number, carrier=nil)
11
+ # Fed Ex
12
+ if carrier == :fedex || Carriers::FedEx.match(tracking_number)
13
+ Carriers::FedEx.track(tracking_number, :credentials => @credentials[:fedex], :testing => testing?)
14
+ # UPS
15
+ elsif carrier == :ups || Carriers::UPS.match(tracking_number)
16
+ Carriers::UPS.track(tracking_number, :credentials => @credentials[:ups], :testing => testing?)
17
+ # USPS
18
+ elsif carrier == :usps || Carriers::USPS.match(tracking_number)
19
+ raise CarrierNotFoundError, "Need to impliment USPS"
20
+ # DHL
21
+ else
22
+ raise CarrierNotFoundError
23
+ end
24
+ end
25
+
26
+ def testing?
27
+ @mode == "testing"
28
+ end
29
+
30
+ def test_mode!
31
+ @mode = "testing"
32
+ end
33
+
34
+ def production_mode!
35
+ @mode == "production"
36
+ end
37
+ end
38
+ end
@@ -0,0 +1,16 @@
1
+ module PackageTracker
2
+ # Generic PackageTracker Error
3
+ class PackageTrackerError < StandardError; end
4
+
5
+ # Invalid username/password is posted to the server
6
+ class InvalidCredentialsError < PackageTrackerError; end
7
+
8
+ # The needed credentials to communicate with the server were not given
9
+ class MissingCredentialsError < PackageTrackerError; end
10
+
11
+ # The tracking number given was invalid
12
+ class InvalidTrackingNumberError < PackageTrackerError; end
13
+
14
+ # The carrier for the tracking number could not be discerned
15
+ class CarrierNotFoundError < PackageTrackerError; end
16
+ end
@@ -0,0 +1,21 @@
1
+ module PackageTracker
2
+ class Request
3
+ def self.get(uri, path, body, options={})
4
+ do_request(Net::HTTP::Get, uri, path, body, options)
5
+ end
6
+
7
+ def self.post(uri, path, body, options={})
8
+ do_request(Net::HTTP::Post, uri, path, body, options)
9
+ end
10
+
11
+ def self.do_request(http_method, uri, path, body, options={})
12
+ raw_request = http_method.new(path)
13
+ raw_request.body = body
14
+
15
+ http = Net::HTTP.new(uri, options[:port])
16
+ http.use_ssl = true if options[:https]
17
+
18
+ http.request(raw_request)
19
+ end
20
+ end
21
+ end
@@ -0,0 +1,32 @@
1
+ module PackageTracker
2
+ class Response
3
+ attr_reader :statuses
4
+ attr_reader :tracking_number
5
+
6
+ def initialize(tracking_number, carrier, statuses=[])
7
+ @tracking_number = tracking_number
8
+ @carrier = carrier
9
+ @statuses = statuses
10
+ sort_statuses!
11
+ end
12
+
13
+ def add_status(message, time, location="")
14
+ @statuses << { :message => message, :time => time, :location => location }
15
+ sort_statuses!
16
+ end
17
+
18
+ def current_status
19
+ @statuses.first
20
+ end
21
+
22
+ def delivered?
23
+ current_status[:message] == @carrier.delivered_status
24
+ end
25
+
26
+ private
27
+
28
+ def sort_statuses!
29
+ @statuses.sort_by! { |status| status[:time] }.reverse!
30
+ end
31
+ end
32
+ end
@@ -0,0 +1,23 @@
1
+ $:.unshift File.dirname(__FILE__)
2
+
3
+ # Gems
4
+ require 'rubygems'
5
+ require 'nokogiri'
6
+ require 'facets'
7
+ require 'facets/module/cattr'
8
+
9
+ # Standard Lib
10
+ require 'net/http'
11
+ require 'net/https'
12
+ require 'time'
13
+ require 'uri'
14
+
15
+ # Local Files
16
+ require 'package_tracker/request'
17
+ require 'package_tracker/response'
18
+ require 'package_tracker/client'
19
+ require 'package_tracker/exceptions'
20
+ require 'package_tracker/carrier'
21
+ require 'package_tracker/carriers/ups'
22
+ require 'package_tracker/carriers/fedex'
23
+ require 'package_tracker/carriers/usps'
@@ -0,0 +1,93 @@
1
+ # Generated by jeweler
2
+ # DO NOT EDIT THIS FILE DIRECTLY
3
+ # Instead, edit Jeweler::Tasks in Rakefile, and run 'rake gemspec'
4
+ # -*- encoding: utf-8 -*-
5
+
6
+ Gem::Specification.new do |s|
7
+ s.name = %q{package_tracker}
8
+ s.version = "0.0.2"
9
+
10
+ s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
11
+ s.authors = ["Michael Taras"]
12
+ s.date = %q{2011-05-18}
13
+ s.description = %q{PackageTracker is a ruby gem for fetching the status of a packages(UPS, FedEx, etc...) with a simple API.}
14
+ s.email = %q{michaeltaras@gmail.com}
15
+ s.extra_rdoc_files = [
16
+ "LICENSE.txt",
17
+ "README.rdoc"
18
+ ]
19
+ s.files = [
20
+ ".Gemfile",
21
+ ".autotest",
22
+ ".document",
23
+ ".rspec",
24
+ ".rvmrc",
25
+ "Gemfile",
26
+ "Gemfile.lock",
27
+ "LICENSE.txt",
28
+ "README.rdoc",
29
+ "Rakefile",
30
+ "VERSION",
31
+ "lib/package_tracker.rb",
32
+ "lib/package_tracker/carrier.rb",
33
+ "lib/package_tracker/carriers/fedex.rb",
34
+ "lib/package_tracker/carriers/ups.rb",
35
+ "lib/package_tracker/carriers/usps.rb",
36
+ "lib/package_tracker/client.rb",
37
+ "lib/package_tracker/exceptions.rb",
38
+ "lib/package_tracker/request.rb",
39
+ "lib/package_tracker/response.rb",
40
+ "package_tracker.gemspec",
41
+ "spec/carrier/fedex_spec.rb",
42
+ "spec/carrier/ups_spec.rb",
43
+ "spec/carrier_spec.rb",
44
+ "spec/fixtures/requests/ups/invalid_credentials.xml",
45
+ "spec/fixtures/requests/ups/invalid_tracking_number.xml",
46
+ "spec/fixtures/requests/ups/valid.xml",
47
+ "spec/fixtures/responses/fedex/invalid_credentials.xml",
48
+ "spec/fixtures/responses/fedex/invalid_tracking_number.xml",
49
+ "spec/fixtures/responses/fedex/valid.xml",
50
+ "spec/fixtures/responses/ups/invalid_credentials.xml",
51
+ "spec/fixtures/responses/ups/invalid_tracking_number.xml",
52
+ "spec/fixtures/responses/ups/valid.xml",
53
+ "spec/request_spec.rb",
54
+ "spec/spec_helper.rb"
55
+ ]
56
+ s.homepage = %q{http://github.com/michaeltaras/package_tracker}
57
+ s.licenses = ["MIT"]
58
+ s.require_paths = ["lib"]
59
+ s.rubygems_version = %q{1.3.7}
60
+ s.summary = %q{PackageTracker is a ruby gem for fetching the status of a packages(UPS, FedEx, etc...) with a simple API.}
61
+
62
+ if s.respond_to? :specification_version then
63
+ current_version = Gem::Specification::CURRENT_SPECIFICATION_VERSION
64
+ s.specification_version = 3
65
+
66
+ if Gem::Version.new(Gem::VERSION) >= Gem::Version.new('1.2.0') then
67
+ s.add_runtime_dependency(%q<nokogiri>, [">= 0"])
68
+ s.add_runtime_dependency(%q<facets>, [">= 0"])
69
+ s.add_development_dependency(%q<bundler>, ["~> 1.0.0"])
70
+ s.add_development_dependency(%q<jeweler>, ["~> 1.6.0"])
71
+ s.add_development_dependency(%q<rcov>, [">= 0"])
72
+ s.add_development_dependency(%q<rspec>, ["~> 2.6.0"])
73
+ s.add_development_dependency(%q<webmock>, [">= 0"])
74
+ else
75
+ s.add_dependency(%q<nokogiri>, [">= 0"])
76
+ s.add_dependency(%q<facets>, [">= 0"])
77
+ s.add_dependency(%q<bundler>, ["~> 1.0.0"])
78
+ s.add_dependency(%q<jeweler>, ["~> 1.6.0"])
79
+ s.add_dependency(%q<rcov>, [">= 0"])
80
+ s.add_dependency(%q<rspec>, ["~> 2.6.0"])
81
+ s.add_dependency(%q<webmock>, [">= 0"])
82
+ end
83
+ else
84
+ s.add_dependency(%q<nokogiri>, [">= 0"])
85
+ s.add_dependency(%q<facets>, [">= 0"])
86
+ s.add_dependency(%q<bundler>, ["~> 1.0.0"])
87
+ s.add_dependency(%q<jeweler>, ["~> 1.6.0"])
88
+ s.add_dependency(%q<rcov>, [">= 0"])
89
+ s.add_dependency(%q<rspec>, ["~> 2.6.0"])
90
+ s.add_dependency(%q<webmock>, [">= 0"])
91
+ end
92
+ end
93
+