groupon 0.0.1 → 1.0.0

Sign up to get free protection for your applications and to get access to all the features.
@@ -1,40 +1,43 @@
1
1
  require 'httparty'
2
2
  require 'hashie'
3
+ require 'groupon/client'
3
4
 
4
- directory = File.expand_path(File.dirname(__FILE__))
5
5
 
6
6
  Hash.send :include, Hashie::HashExtensions
7
7
 
8
8
  module Groupon
9
-
10
- VERSION = "0.0.1".freeze
11
-
9
+
10
+ # Returns a list of divisions - cities where Groupon is live.
11
+ # @see http://sites.google.com/site/grouponapi/divisions-api Groupon API docs
12
+ # @return [Array<Hashie::Mash>] an array of divisions
12
13
  def self.divisions
13
14
  Groupon::Client.new.divisions
14
15
  end
15
-
16
- def self.deals(options={})
17
- Groupon::Client.new.deals(options)
18
- end
19
16
 
20
- # config/initializers/gowalla.rb (for instance)
21
- #
22
- # Groupon.configure do |config|
23
- # config.api_key = 'api_key'
24
- # end
25
- #
26
- # elsewhere
17
+ # Returns a list of deals.
18
+ # The API returns an ordered list of deals currently running for a given Division.
19
+ # Priority is based on position within the response (top deals are higher in priority).
20
+ #
21
+ # @see http://sites.google.com/site/grouponapi/divisions-api Groupon API docs
27
22
  #
28
- # client = Groupon::Client.new
29
- def self.configure
30
- yield self
31
- true
23
+ # @option options [String] :lat (Latitudinal coordinates based on IP of API request) Latitude of geolocation to find deals
24
+ # @option options [String] :lng (Longtitudinal coordinates based on IP of API request) Longitude of geolocation to find deals
25
+ # @return [Array<Hashie::Mash>] an array of deals
26
+ def self.deals(options={})
27
+ Groupon::Client.new.deals(options)
32
28
  end
33
29
 
34
30
  class << self
31
+
32
+ # Get/sets the required Groupon API token
33
+ # @see http://sites.google.com/site/grouponapi/home Groupon API docs
34
+ #
35
+ # @param [String]
36
+ # @return [String]
35
37
  attr_accessor :api_key
36
38
  end
37
-
39
+
40
+ # Contains information for errors returned by the API
38
41
  class GrouponError < StandardError
39
42
  attr_reader :data
40
43
 
@@ -45,4 +48,3 @@ module Groupon
45
48
  end
46
49
  end
47
50
 
48
- require File.join(directory, 'groupon', 'client')
@@ -1,38 +1,61 @@
1
1
  module Groupon
2
2
  class Client
3
+ attr_accessor :api_key
3
4
  include HTTParty
4
- base_uri "http://www.groupon.com/api/v1"
5
+ base_uri "http://api.groupon.com/v2"
5
6
  format :json
6
7
 
8
+ # Initialize the Groupon client
9
+ #
10
+ # @option options [String] :api_key (Groupon.api_key) Your Groupon API token
11
+
7
12
  def initialize(options={})
8
- api_key = options[:api_key] || Groupon.api_key
9
- self.class.headers({'X-GrouponToken' => api_key }) unless api_key.nil?
13
+ @api_key = options[:api_key] || Groupon.api_key
10
14
  end
11
-
15
+ # Returns a list of divisions - cities where Groupon is live.
16
+ # @see http://sites.google.com/site/grouponapi/divisions-api Groupon API docs
17
+ #
18
+ # @return [Array<Hashie::Mash>] an array of divisions
12
19
  def divisions
13
- self.class.get("/divisions.json").divisions
20
+ self.class.get("/divisions.json",:query => { :client_id => @api_key }).divisions
14
21
  end
15
-
22
+
23
+ # Returns a list of deals.
24
+ #
25
+ # The API returns an ordered list of deals currently running for a given Division.
26
+ #
27
+ # Priority is based on position within the response (top deals are higher in priority).
28
+ #
29
+ #
30
+ #
31
+ # @see http://sites.google.com/site/grouponapi/divisions-api Groupon API docs
32
+ #
33
+ #
34
+ #
35
+ # @option options [String] :lat (Latitudinal coordinates based on IP of API request) Latitude of geolocation to find deals
36
+ #
37
+ # @option options [String] :lng (Longtitudinal coordinates based on IP of API request) Longitude of geolocation to find deals
38
+ #
39
+ # @return [Array<Hashie::Mash>] an array of deals
16
40
  def deals(query={})
17
41
  division = query.delete(:division)
42
+ query.merge! :client_id => @api_key
18
43
  path = division ? "/#{division}" : ""
19
44
  path += "/deals.json"
20
45
  self.class.get(path, :query => query).deals
21
46
  end
22
47
 
23
-
24
48
  def self.get(*args); handle_response super end
25
49
  def self.post(*args); handle_response super end
26
-
50
+
27
51
  def self.handle_response(response)
28
52
  case response.code
29
53
  when 500...600; raise GrouponError.new(Hashie::Mash.new(response).status)
30
54
  else; response
31
55
  end
32
-
56
+
33
57
  Hashie::Mash.new(response)
34
-
58
+
35
59
  end
36
-
37
60
  end
38
61
  end
@@ -0,0 +1,3 @@
1
+ module Groupon
2
+ VERSION = "1.0.0"
3
+ end
@@ -1,26 +1,26 @@
1
1
  require 'helper'
2
2
 
3
3
  class GrouponTest < Test::Unit::TestCase
4
-
4
+
5
5
  context "Groupon API" do
6
6
 
7
7
  should "return a list of divisions - cities where Groupon is live" do
8
- stub_get("/divisions.json", "divisions.json")
8
+ stub_get("/divisions.json?client_id=", "divisions.json")
9
9
  divisions = Groupon.divisions
10
10
  divisions.size.should == 61
11
11
  divisions.last.name.should == 'Wichita'
12
12
  divisions.last.location.latitude.should == 37.6922
13
13
  end
14
-
14
+
15
15
  should "return a list of deals" do
16
- stub_get("/deals.json?lat=32.781100000000002&lng=-96.9791", "deals.json")
16
+ stub_get("/deals.json?lat=32.781100000000002&lng=-96.9791&client_id=", "deals.json")
17
17
  deals = Groupon.deals(:lat => "32.781100000000002", :lng => "-96.9791")
18
18
  deals.size.should == 1
19
19
  deals.first.discount_percent.should == 50
20
20
  end
21
-
21
+
22
22
  should "return a list of deals for a specified division" do
23
- stub_get("/dallas/deals.json", "deals.json")
23
+ stub_get("/dallas/deals.json?client_id=", "deals.json")
24
24
  deals = Groupon.deals(:division => :dallas)
25
25
  deals.size.should == 1
26
26
  deals.first.discount_percent.should == 50
@@ -2,7 +2,6 @@ require 'rubygems'
2
2
  require 'test/unit'
3
3
  require 'shoulda'
4
4
 
5
- require 'redgreen'
6
5
  require 'matchy'
7
6
  require 'fakeweb'
8
7
 
@@ -25,7 +24,7 @@ def fixture_file(filename)
25
24
  end
26
25
 
27
26
  def groupon_url(url, options={})
28
- url =~ /^http/ ? url : "http://www.groupon.com/api/v1#{url}"
27
+ url =~ /^http/ ? url : "http://api.groupon.com/v2#{url}"
29
28
  end
30
29
 
31
30
  def stub_request(method, url, filename, status=nil)
metadata CHANGED
@@ -1,147 +1,180 @@
1
- --- !ruby/object:Gem::Specification
1
+ --- !ruby/object:Gem::Specification
2
2
  name: groupon
3
- version: !ruby/object:Gem::Version
4
- prerelease: false
5
- segments:
6
- - 0
7
- - 0
8
- - 1
9
- version: 0.0.1
3
+ version: !ruby/object:Gem::Version
4
+ version: 1.0.0
5
+ prerelease:
10
6
  platform: ruby
11
- authors:
7
+ authors:
12
8
  - Wynn Netherland
13
9
  autorequire:
14
10
  bindir: bin
15
11
  cert_chain: []
16
-
17
- date: 2010-05-23 00:00:00 -05:00
18
- default_executable:
19
- dependencies:
20
- - !ruby/object:Gem::Dependency
21
- version_requirements: &id001 !ruby/object:Gem::Requirement
22
- requirements:
23
- - - ">="
24
- - !ruby/object:Gem::Version
25
- segments:
26
- - 0
27
- - 1
28
- - 3
29
- version: 0.1.3
12
+ date: 2010-05-23 00:00:00.000000000 Z
13
+ dependencies:
14
+ - !ruby/object:Gem::Dependency
30
15
  name: hashie
16
+ requirement: !ruby/object:Gem::Requirement
17
+ none: false
18
+ requirements:
19
+ - - ! '>='
20
+ - !ruby/object:Gem::Version
21
+ version: 0.1.3
22
+ type: :runtime
31
23
  prerelease: false
32
- requirement: *id001
24
+ version_requirements: !ruby/object:Gem::Requirement
25
+ none: false
26
+ requirements:
27
+ - - ! '>='
28
+ - !ruby/object:Gem::Version
29
+ version: 0.1.3
30
+ - !ruby/object:Gem::Dependency
31
+ name: httparty
32
+ requirement: !ruby/object:Gem::Requirement
33
+ none: false
34
+ requirements:
35
+ - - ! '>='
36
+ - !ruby/object:Gem::Version
37
+ version: 0.1.0
33
38
  type: :runtime
34
- - !ruby/object:Gem::Dependency
35
- version_requirements: &id002 !ruby/object:Gem::Requirement
36
- requirements:
37
- - - ">="
38
- - !ruby/object:Gem::Version
39
- segments:
40
- - 0
41
- - 1
42
- - 0
39
+ prerelease: false
40
+ version_requirements: !ruby/object:Gem::Requirement
41
+ none: false
42
+ requirements:
43
+ - - ! '>='
44
+ - !ruby/object:Gem::Version
43
45
  version: 0.1.0
44
- name: httparty
46
+ - !ruby/object:Gem::Dependency
47
+ name: shoulda
48
+ requirement: !ruby/object:Gem::Requirement
49
+ none: false
50
+ requirements:
51
+ - - ! '>='
52
+ - !ruby/object:Gem::Version
53
+ version: 2.10.1
54
+ type: :development
45
55
  prerelease: false
46
- requirement: *id002
47
- type: :runtime
48
- - !ruby/object:Gem::Dependency
49
- version_requirements: &id003 !ruby/object:Gem::Requirement
50
- requirements:
51
- - - ">="
52
- - !ruby/object:Gem::Version
53
- segments:
54
- - 2
55
- - 10
56
- - 1
56
+ version_requirements: !ruby/object:Gem::Requirement
57
+ none: false
58
+ requirements:
59
+ - - ! '>='
60
+ - !ruby/object:Gem::Version
57
61
  version: 2.10.1
58
- name: shoulda
62
+ - !ruby/object:Gem::Dependency
63
+ name: mg
64
+ requirement: !ruby/object:Gem::Requirement
65
+ none: false
66
+ requirements:
67
+ - - ! '>='
68
+ - !ruby/object:Gem::Version
69
+ version: 0.0.8
70
+ type: :development
59
71
  prerelease: false
60
- requirement: *id003
72
+ version_requirements: !ruby/object:Gem::Requirement
73
+ none: false
74
+ requirements:
75
+ - - ! '>='
76
+ - !ruby/object:Gem::Version
77
+ version: 0.0.8
78
+ - !ruby/object:Gem::Dependency
79
+ name: redgreen
80
+ requirement: !ruby/object:Gem::Requirement
81
+ none: false
82
+ requirements:
83
+ - - ! '>='
84
+ - !ruby/object:Gem::Version
85
+ version: '0'
61
86
  type: :development
62
- - !ruby/object:Gem::Dependency
63
- version_requirements: &id004 !ruby/object:Gem::Requirement
64
- requirements:
65
- - - "="
66
- - !ruby/object:Gem::Version
67
- segments:
68
- - 0
69
- - 4
70
- - 0
71
- version: 0.4.0
72
- name: matchy
73
87
  prerelease: false
74
- requirement: *id004
88
+ version_requirements: !ruby/object:Gem::Requirement
89
+ none: false
90
+ requirements:
91
+ - - ! '>='
92
+ - !ruby/object:Gem::Version
93
+ version: '0'
94
+ - !ruby/object:Gem::Dependency
95
+ name: jnunemaker-matchy
96
+ requirement: !ruby/object:Gem::Requirement
97
+ none: false
98
+ requirements:
99
+ - - '='
100
+ - !ruby/object:Gem::Version
101
+ version: 0.4.0
75
102
  type: :development
76
- - !ruby/object:Gem::Dependency
77
- version_requirements: &id005 !ruby/object:Gem::Requirement
78
- requirements:
79
- - - ">="
80
- - !ruby/object:Gem::Version
81
- segments:
82
- - 1
83
- - 2
84
- - 5
85
- version: 1.2.5
86
- name: fakeweb
87
103
  prerelease: false
88
- requirement: *id005
104
+ version_requirements: !ruby/object:Gem::Requirement
105
+ none: false
106
+ requirements:
107
+ - - '='
108
+ - !ruby/object:Gem::Version
109
+ version: 0.4.0
110
+ - !ruby/object:Gem::Dependency
111
+ name: fakeweb
112
+ requirement: !ruby/object:Gem::Requirement
113
+ none: false
114
+ requirements:
115
+ - - ! '>='
116
+ - !ruby/object:Gem::Version
117
+ version: 1.2.5
89
118
  type: :development
90
- - !ruby/object:Gem::Dependency
91
- version_requirements: &id006 !ruby/object:Gem::Requirement
92
- requirements:
93
- - - ">="
94
- - !ruby/object:Gem::Version
95
- segments:
96
- - 0
97
- version: "0"
98
- name: yard
99
119
  prerelease: false
100
- requirement: *id006
120
+ version_requirements: !ruby/object:Gem::Requirement
121
+ none: false
122
+ requirements:
123
+ - - ! '>='
124
+ - !ruby/object:Gem::Version
125
+ version: 1.2.5
126
+ - !ruby/object:Gem::Dependency
127
+ name: yard
128
+ requirement: !ruby/object:Gem::Requirement
129
+ none: false
130
+ requirements:
131
+ - - ! '>='
132
+ - !ruby/object:Gem::Version
133
+ version: '0'
101
134
  type: :development
135
+ prerelease: false
136
+ version_requirements: !ruby/object:Gem::Requirement
137
+ none: false
138
+ requirements:
139
+ - - ! '>='
140
+ - !ruby/object:Gem::Version
141
+ version: '0'
102
142
  description: Wrapper for the Groupon API
103
143
  email: wynn.netherland@gmail.com
104
144
  executables: []
105
-
106
145
  extensions: []
107
-
108
146
  extra_rdoc_files: []
109
-
110
- files:
147
+ files:
111
148
  - lib/groupon/client.rb
149
+ - lib/groupon/version.rb
112
150
  - lib/groupon.rb
113
- has_rdoc: true
151
+ - test/helper.rb
152
+ - test/groupon_test.rb
114
153
  homepage: http://github.com/pengwynn/groupon
115
154
  licenses: []
116
-
117
155
  post_install_message:
118
156
  rdoc_options: []
119
-
120
- require_paths:
157
+ require_paths:
121
158
  - lib
122
- required_ruby_version: !ruby/object:Gem::Requirement
123
- requirements:
124
- - - ">="
125
- - !ruby/object:Gem::Version
126
- segments:
127
- - 0
128
- version: "0"
129
- required_rubygems_version: !ruby/object:Gem::Requirement
130
- requirements:
131
- - - ">="
132
- - !ruby/object:Gem::Version
133
- segments:
134
- - 1
135
- - 3
136
- - 6
159
+ required_ruby_version: !ruby/object:Gem::Requirement
160
+ none: false
161
+ requirements:
162
+ - - ! '>='
163
+ - !ruby/object:Gem::Version
164
+ version: '0'
165
+ required_rubygems_version: !ruby/object:Gem::Requirement
166
+ none: false
167
+ requirements:
168
+ - - ! '>='
169
+ - !ruby/object:Gem::Version
137
170
  version: 1.3.6
138
171
  requirements: []
139
-
140
172
  rubyforge_project:
141
- rubygems_version: 1.3.6
173
+ rubygems_version: 1.8.23
142
174
  signing_key:
143
175
  specification_version: 3
144
176
  summary: Wrapper for the Groupon API
145
- test_files:
177
+ test_files:
146
178
  - test/helper.rb
147
179
  - test/groupon_test.rb
180
+ has_rdoc: