groupon 0.0.1

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.
@@ -0,0 +1,48 @@
1
+ require 'httparty'
2
+ require 'hashie'
3
+
4
+ directory = File.expand_path(File.dirname(__FILE__))
5
+
6
+ Hash.send :include, Hashie::HashExtensions
7
+
8
+ module Groupon
9
+
10
+ VERSION = "0.0.1".freeze
11
+
12
+ def self.divisions
13
+ Groupon::Client.new.divisions
14
+ end
15
+
16
+ def self.deals(options={})
17
+ Groupon::Client.new.deals(options)
18
+ end
19
+
20
+ # config/initializers/gowalla.rb (for instance)
21
+ #
22
+ # Groupon.configure do |config|
23
+ # config.api_key = 'api_key'
24
+ # end
25
+ #
26
+ # elsewhere
27
+ #
28
+ # client = Groupon::Client.new
29
+ def self.configure
30
+ yield self
31
+ true
32
+ end
33
+
34
+ class << self
35
+ attr_accessor :api_key
36
+ end
37
+
38
+ class GrouponError < StandardError
39
+ attr_reader :data
40
+
41
+ def initialize(data)
42
+ @data = data
43
+ super
44
+ end
45
+ end
46
+ end
47
+
48
+ require File.join(directory, 'groupon', 'client')
@@ -0,0 +1,38 @@
1
+ module Groupon
2
+ class Client
3
+ include HTTParty
4
+ base_uri "http://www.groupon.com/api/v1"
5
+ format :json
6
+
7
+ def initialize(options={})
8
+ api_key = options[:api_key] || Groupon.api_key
9
+ self.class.headers({'X-GrouponToken' => api_key }) unless api_key.nil?
10
+ end
11
+
12
+ def divisions
13
+ self.class.get("/divisions.json").divisions
14
+ end
15
+
16
+ def deals(query={})
17
+ division = query.delete(:division)
18
+ path = division ? "/#{division}" : ""
19
+ path += "/deals.json"
20
+ self.class.get(path, :query => query).deals
21
+ end
22
+
23
+
24
+ def self.get(*args); handle_response super end
25
+ def self.post(*args); handle_response super end
26
+
27
+ def self.handle_response(response)
28
+ case response.code
29
+ when 500...600; raise GrouponError.new(Hashie::Mash.new(response).status)
30
+ else; response
31
+ end
32
+
33
+ Hashie::Mash.new(response)
34
+
35
+ end
36
+
37
+ end
38
+ end
@@ -0,0 +1,31 @@
1
+ require 'helper'
2
+
3
+ class GrouponTest < Test::Unit::TestCase
4
+
5
+ context "Groupon API" do
6
+
7
+ should "return a list of divisions - cities where Groupon is live" do
8
+ stub_get("/divisions.json", "divisions.json")
9
+ divisions = Groupon.divisions
10
+ divisions.size.should == 61
11
+ divisions.last.name.should == 'Wichita'
12
+ divisions.last.location.latitude.should == 37.6922
13
+ end
14
+
15
+ should "return a list of deals" do
16
+ stub_get("/deals.json?lat=32.781100000000002&lng=-96.9791", "deals.json")
17
+ deals = Groupon.deals(:lat => "32.781100000000002", :lng => "-96.9791")
18
+ deals.size.should == 1
19
+ deals.first.discount_percent.should == 50
20
+ end
21
+
22
+ should "return a list of deals for a specified division" do
23
+ stub_get("/dallas/deals.json", "deals.json")
24
+ deals = Groupon.deals(:division => :dallas)
25
+ deals.size.should == 1
26
+ deals.first.discount_percent.should == 50
27
+ end
28
+
29
+ end
30
+
31
+ end
@@ -0,0 +1,43 @@
1
+ require 'rubygems'
2
+ require 'test/unit'
3
+ require 'shoulda'
4
+
5
+ require 'redgreen'
6
+ require 'matchy'
7
+ require 'fakeweb'
8
+
9
+ $LOAD_PATH.unshift(File.join(File.dirname(__FILE__), '..', 'lib'))
10
+ $LOAD_PATH.unshift(File.dirname(__FILE__))
11
+ require 'groupon'
12
+
13
+
14
+ # Set the default allow_net_connect option--usually you'll want this off.
15
+ # You don't usually want your test suite to make HTTP connections, do you?
16
+ FakeWeb.allow_net_connect = false
17
+
18
+ class Test::Unit::TestCase
19
+ end
20
+
21
+ def fixture_file(filename)
22
+ return '' if filename == ''
23
+ file_path = File.expand_path(File.dirname(__FILE__) + '/fixtures/' + filename)
24
+ File.read(file_path)
25
+ end
26
+
27
+ def groupon_url(url, options={})
28
+ url =~ /^http/ ? url : "http://www.groupon.com/api/v1#{url}"
29
+ end
30
+
31
+ def stub_request(method, url, filename, status=nil)
32
+ options = {:body => ""}
33
+ options.merge!({:body => fixture_file(filename)}) if filename
34
+ options.merge!({:body => status.last}) if status
35
+ options.merge!({:status => status}) if status
36
+
37
+ FakeWeb.register_uri(method, groupon_url(url), options)
38
+ end
39
+
40
+ def stub_get(*args); stub_request(:get, *args) end
41
+ def stub_post(*args); stub_request(:post, *args) end
42
+
43
+
metadata ADDED
@@ -0,0 +1,147 @@
1
+ --- !ruby/object:Gem::Specification
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
10
+ platform: ruby
11
+ authors:
12
+ - Wynn Netherland
13
+ autorequire:
14
+ bindir: bin
15
+ 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
30
+ name: hashie
31
+ prerelease: false
32
+ requirement: *id001
33
+ 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
43
+ version: 0.1.0
44
+ name: httparty
45
+ 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
57
+ version: 2.10.1
58
+ name: shoulda
59
+ prerelease: false
60
+ requirement: *id003
61
+ 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
+ prerelease: false
74
+ requirement: *id004
75
+ 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
+ prerelease: false
88
+ requirement: *id005
89
+ 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
+ prerelease: false
100
+ requirement: *id006
101
+ type: :development
102
+ description: Wrapper for the Groupon API
103
+ email: wynn.netherland@gmail.com
104
+ executables: []
105
+
106
+ extensions: []
107
+
108
+ extra_rdoc_files: []
109
+
110
+ files:
111
+ - lib/groupon/client.rb
112
+ - lib/groupon.rb
113
+ has_rdoc: true
114
+ homepage: http://github.com/pengwynn/groupon
115
+ licenses: []
116
+
117
+ post_install_message:
118
+ rdoc_options: []
119
+
120
+ require_paths:
121
+ - 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
137
+ version: 1.3.6
138
+ requirements: []
139
+
140
+ rubyforge_project:
141
+ rubygems_version: 1.3.6
142
+ signing_key:
143
+ specification_version: 3
144
+ summary: Wrapper for the Groupon API
145
+ test_files:
146
+ - test/helper.rb
147
+ - test/groupon_test.rb