foursquare 0.1.0 → 0.2.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.
- data/History +6 -0
- data/README.rdoc +31 -14
- data/Rakefile +2 -2
- data/lib/foursquare.rb +160 -40
- metadata +3 -2
data/History
CHANGED
@@ -1,3 +1,9 @@
|
|
1
|
+
== 0.2.0 February 7th, 2010
|
2
|
+
* updated methods to reflect updates to Foursquare API
|
3
|
+
* added validations
|
4
|
+
* deprecated cities, check_city, switch_city, and friend_checkins calls in line with updates to the Foursquare API
|
5
|
+
* updated readme to reflect code changes
|
6
|
+
|
1
7
|
== 0.1.0 November 8th, 2009
|
2
8
|
* added website
|
3
9
|
* added defaults for optional method variables
|
data/README.rdoc
CHANGED
@@ -10,24 +10,41 @@ A simple Ruby Gem wrapper for the Foursquare API.
|
|
10
10
|
|
11
11
|
require 'rubygems'
|
12
12
|
require 'foursquare'
|
13
|
-
|
13
|
+
|
14
|
+
# foursquare's site uses email as the user name
|
14
15
|
fq = Foursquare.new('username_or_phone','password')
|
15
16
|
|
16
17
|
fq.test
|
17
|
-
|
18
|
-
fq.venues(
|
19
|
-
fq.tips(
|
20
|
-
fq.
|
21
|
-
fq.
|
22
|
-
fq.
|
23
|
-
fq.
|
24
|
-
fq.
|
25
|
-
fq.user_details(user_id,badges,mayor)
|
26
|
-
fq.friends
|
18
|
+
|
19
|
+
fq.venues(geolat, geolong, {:limit=>10,:q=>'pizza'})
|
20
|
+
fq.tips(geolat,geolong,{:limit=>10})
|
21
|
+
fq.checkins({:geolat=>'',:geolong=>''})
|
22
|
+
fq.checkin(vid,venue,shout,{:private=>0,:twitter=>0,:facebook=>1,:geolat=>'12.03',:geolong=>'-123.33'})
|
23
|
+
fq.history({:limit=>10})
|
24
|
+
fq.user_details(user_id,{:badges=>0,:mayor=>0})
|
25
|
+
fq.friends({:uid=>99999})
|
27
26
|
fq.venue_details(venue_id)
|
28
|
-
fq.add_venue(
|
29
|
-
fq.
|
30
|
-
|
27
|
+
fq.add_venue(name,address,cross_street,city,state,options)
|
28
|
+
fq.propose_edit(venue_id,name,address,cross_street,city,state,options)
|
29
|
+
fq.flag_venue_as_closed(venue_id)
|
30
|
+
fq.add_tip(venue_id,text,{:type=type})
|
31
|
+
fq.mark_tip_as_todo(tid)
|
32
|
+
fq.mark_tip_as_done(tid)
|
33
|
+
fq.friend_requests
|
34
|
+
fq.friend_approve(uid)
|
35
|
+
fq.friend_deny(uid)
|
36
|
+
fq.request_friend(uid)
|
37
|
+
fq.find_friends_by_name('Bugs Bunny')
|
38
|
+
fq.find_friends_by_phone('8675309')
|
39
|
+
fq.find_friends_by_twitter('github')
|
40
|
+
fq.set_pings('self','goodnight')
|
41
|
+
|
42
|
+
|
43
|
+
# Foursquare is moving the API to geolat/geolong and removing the concept of cities
|
44
|
+
fq.cities
|
45
|
+
fq.check_city(geolat, geolong)
|
46
|
+
fq.switch_city(city_id)
|
47
|
+
fq.friend_checkins({:geolat=>'',:geolong=>''})
|
31
48
|
|
32
49
|
== license
|
33
50
|
|
data/Rakefile
CHANGED
@@ -6,8 +6,8 @@ require 'spec/rake/spectask'
|
|
6
6
|
|
7
7
|
spec = Gem::Specification.new do |s|
|
8
8
|
s.name = "foursquare"
|
9
|
-
s.version = "0.
|
10
|
-
s.
|
9
|
+
s.version = "0.2.0"
|
10
|
+
s.authors = ['Jeremy Welch', 'Thomas Hanley']
|
11
11
|
s.email = "hello@jeremyrwelch.com"
|
12
12
|
s.homepage = "http://foursquare.rubyforge.org"
|
13
13
|
s.description = s.summary = "A simple Ruby wrapper for the Foursquare API"
|
data/lib/foursquare.rb
CHANGED
@@ -2,76 +2,196 @@ require 'rubygems'
|
|
2
2
|
require 'httparty'
|
3
3
|
|
4
4
|
class Foursquare
|
5
|
+
# Current Version of the Foursquare API: http://groups.google.com/group/foursquare-api/web/api-documentation
|
5
6
|
|
6
7
|
include HTTParty
|
7
8
|
base_uri 'api.foursquare.com'
|
8
9
|
format :xml
|
9
|
-
|
10
10
|
|
11
|
-
# auth user
|
12
|
-
|
11
|
+
# auth user
|
12
|
+
# TODO: add OAuth support (follow Twitter gem from jnunemaker http://github.com/jnunemaker/twitter)
|
13
|
+
def initialize(user="",pass="", options={})
|
13
14
|
self.class.basic_auth user, pass
|
15
|
+
self.class.headers(options[:headers]) if options.has_key?(:headers)
|
14
16
|
end
|
15
|
-
|
16
|
-
|
17
|
-
#
|
17
|
+
|
18
|
+
# =========================
|
19
|
+
# = No Auth Required Methods =
|
20
|
+
# =========================
|
21
|
+
# test for response from Foursquare
|
18
22
|
def test
|
19
|
-
|
23
|
+
self.class.get("/v1/test")
|
20
24
|
end
|
21
25
|
|
22
|
-
|
23
|
-
|
24
|
-
|
25
|
-
end
|
26
|
-
|
27
|
-
def venues(geolat,geolong,radius="",limit="",query="")
|
28
|
-
self.class.get("/v1/venues?geolat=#{geolat}&geolong=#{geolong}&r=#{radius}&l=#{limit}&q=#{query}")
|
26
|
+
def venues(geolat, geolong, options={})
|
27
|
+
options.merge!({:geolat=>geolat, :geolong=>geolong})
|
28
|
+
self.class.get("/v1/venues", :query=>options)
|
29
29
|
end
|
30
|
-
|
31
|
-
def tips(geolat,geolong,
|
32
|
-
|
30
|
+
|
31
|
+
def tips(geolat,geolong,options={})
|
32
|
+
options.merge!({:geolat=>geolat, :geolong=>geolong})
|
33
|
+
self.class.get("/v1/tips", :query=>options)
|
33
34
|
end
|
34
35
|
|
36
|
+
# =========================
|
37
|
+
# = Auth Required Methods =
|
38
|
+
# =========================
|
39
|
+
def checkins(options={})
|
40
|
+
self.class.get("/v1/checkins",:query=>options)
|
41
|
+
end
|
35
42
|
|
36
|
-
|
37
|
-
|
38
|
-
|
43
|
+
def checkin(vid=nil,venue=nil,shout=nil,options={})
|
44
|
+
unless vid || venue || shout
|
45
|
+
raise ArgumentError, "A vid or venue or shout is required to checkin", caller
|
46
|
+
end
|
47
|
+
options.merge!({:vid=>vid, :venue=>venue, :shout=>shout})
|
48
|
+
self.class.post("/v1/checkin", :body => options)
|
39
49
|
end
|
40
|
-
|
41
|
-
def
|
42
|
-
|
50
|
+
|
51
|
+
def history(options={})
|
52
|
+
limit = options.delete(:limit) || 10
|
53
|
+
uri = "/v1/history?l=#{limit}"
|
54
|
+
sinceid = options.delete(:sinceid)
|
55
|
+
uri << "&sinceid=#{sinceid}" unless sinceid.nil?
|
56
|
+
self.class.get(uri)
|
43
57
|
end
|
44
|
-
|
45
|
-
def
|
46
|
-
|
58
|
+
|
59
|
+
def user_details(user_id,options={})
|
60
|
+
unless user_id
|
61
|
+
raise ArgumentError, "A user_id is required to get details about a user", caller
|
62
|
+
end
|
63
|
+
self.class.get("/v1/user",:query=>options)
|
47
64
|
end
|
48
65
|
|
49
|
-
def
|
50
|
-
self.class.get("/v1/
|
66
|
+
def friends(options={})
|
67
|
+
self.class.get("/v1/friends",:query=>options)
|
51
68
|
end
|
52
69
|
|
53
|
-
def
|
54
|
-
self.class.get("/v1/
|
70
|
+
def venue_details(venue_id)
|
71
|
+
self.class.get("/v1/venue?vid=#{venue_id}")
|
72
|
+
end
|
73
|
+
|
74
|
+
# city_id has been removed from API
|
75
|
+
def add_venue(name,address,cross_street,city,state,options={})
|
76
|
+
unless name && address && cross_street && city && state
|
77
|
+
raise ArgumentError, "A venue's name, address, cross_street, city, state are required to add_venue", caller
|
78
|
+
end
|
79
|
+
options.merge!({:name=>name, :address=>address, :cross_street=>cross_street, :city=>city, :state=>state})
|
80
|
+
self.class.post("/v1/addvenue", :body => options)
|
55
81
|
end
|
56
82
|
|
57
|
-
def
|
58
|
-
|
83
|
+
def propose_edit(venue_id,name,address,cross_street,city,state,options={})
|
84
|
+
unless venue_id && name && address && cross_street && city && state
|
85
|
+
raise ArgumentError, "A venue's venue_id, name, address, cross_street, city, state are required to propose_edit", caller
|
86
|
+
end
|
87
|
+
options.merge!({:venue_id=>venue_id,:name=>name, :address=>address, :cross_street=>cross_street, :city=>city, :state=>state})
|
88
|
+
self.class.post("/v1/venue/proposeedit", :body => options)
|
89
|
+
end
|
90
|
+
|
91
|
+
def flag_venue_as_closed(venue_id)
|
92
|
+
unless venue_id
|
93
|
+
raise ArgumentError, "A venue's venue_id is required to flag as closed", caller
|
94
|
+
end
|
95
|
+
self.class.post("/v1/venue/flagclosed?vid=#{venue_id}")
|
59
96
|
end
|
60
97
|
|
61
|
-
|
62
|
-
|
98
|
+
# ===============
|
99
|
+
# = TIP methods =
|
100
|
+
# ===============
|
101
|
+
def add_tip(venue_id,text,options={})
|
102
|
+
unless venue_id && text
|
103
|
+
raise ArgumentError, "venue_id and text are required to add_tip", caller
|
104
|
+
end
|
105
|
+
options.merge!({:vid=>venue_id, :text=>text})
|
106
|
+
self.class.post("/v1/addtip", :body => options)
|
63
107
|
end
|
64
108
|
|
65
|
-
def
|
66
|
-
|
109
|
+
def mark_tip_as_todo(tid)
|
110
|
+
unless tid
|
111
|
+
raise ArgumentError, "tip_id is required to mark tip as todo", caller
|
112
|
+
end
|
113
|
+
self.class.post("/v1/tip/marktodo", :body => {:tip=>tip})
|
114
|
+
end
|
115
|
+
|
116
|
+
def mark_tip_as_done(tid)
|
117
|
+
unless tid
|
118
|
+
raise ArgumentError, "tid is required to mark tip as done", caller
|
119
|
+
end
|
120
|
+
self.class.post("/v1/tip/markdone", :body => {:tip=>tip})
|
121
|
+
end
|
122
|
+
|
123
|
+
# ==================
|
124
|
+
# = FRIEND Methods =
|
125
|
+
# ==================
|
126
|
+
def friend_requests
|
127
|
+
self.class.get("/v1/friend/requests")
|
128
|
+
end
|
129
|
+
|
130
|
+
def friend_approve(uid)
|
131
|
+
unless uid
|
132
|
+
raise ArgumentError, "uid is required to approve friend request", caller
|
133
|
+
end
|
134
|
+
self.class.post("/v1/friend/requests", :body => {:uid=>uid})
|
135
|
+
end
|
136
|
+
|
137
|
+
def friend_deny(uid)
|
138
|
+
unless uid
|
139
|
+
raise ArgumentError, "uid is required to deny friend request", caller
|
140
|
+
end
|
141
|
+
self.class.post("/v1/friend/deny", :body => {:uid=>uid})
|
142
|
+
end
|
143
|
+
|
144
|
+
def request_friend(uid)
|
145
|
+
unless uid
|
146
|
+
raise ArgumentError, "uid is required to request friend", caller
|
147
|
+
end
|
148
|
+
self.class.post("/v1/friend/sendrequest", :body => {:uid=>uid})
|
67
149
|
end
|
68
150
|
|
69
|
-
|
70
|
-
|
151
|
+
# ================
|
152
|
+
# = FIND Methods =
|
153
|
+
# ================
|
154
|
+
def find_friends_by_name(q)
|
155
|
+
self.class.get("/v1/findfriends/byname", :query=>{:q=>q})
|
156
|
+
end
|
157
|
+
|
158
|
+
def find_friends_by_phone(q)
|
159
|
+
self.class.get("/v1/findfriends/byphone", :query=>{:q=>q})
|
160
|
+
end
|
161
|
+
|
162
|
+
def find_friends_by_twitter(q)
|
163
|
+
self.class.get("/v1/findfriends/bytwitter", :query=>{:q=>q})
|
164
|
+
end
|
165
|
+
|
166
|
+
# ===============
|
167
|
+
# = SET methods =
|
168
|
+
# ===============
|
169
|
+
def set_pings(user_id=nil,ping=nil)
|
170
|
+
uid = user_id || "self"
|
171
|
+
self.class.post("/v1/settings/setpings?#{uid}=#{ping}")
|
71
172
|
end
|
72
173
|
|
73
|
-
|
74
|
-
|
174
|
+
# From Foursquare API
|
175
|
+
# 20100108 - naveen - the concept of cities (cityid and all city-related methods) has now been removed
|
176
|
+
# Deprecated
|
177
|
+
def cities
|
178
|
+
self.class.get("/v1/cities")
|
75
179
|
end
|
180
|
+
# Deprecated
|
181
|
+
def check_city(geolat, geolong)
|
182
|
+
$stderr.puts "`check_city` Deprecated: The idea of \"cityid\" is now deprecated from the API"
|
183
|
+
self.class.get("/v1/checkcity?geolat=#{geolat}&geolong=#{geolong}")
|
184
|
+
end
|
185
|
+
# Deprecated
|
186
|
+
def switch_city(city_id)
|
187
|
+
$stderr.puts "`switch_city` Deprecated: The idea of \"cityid\" is now deprecated from the API"
|
188
|
+
self.class.post("/v1/switchcity", :body => {:cityid => city_id})
|
189
|
+
end
|
190
|
+
# Method changed to call checkins to match API
|
191
|
+
def friend_checkins(options={})
|
192
|
+
$stderr.puts "`friend_checkins` now calls `checkins` to match the foursquare api method call"
|
193
|
+
$stderr.puts "http://groups.google.com/group/foursquare-api/web/api-documentation"
|
194
|
+
checkins(options)
|
195
|
+
end
|
76
196
|
|
77
197
|
end
|
metadata
CHANGED
@@ -1,15 +1,16 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: foursquare
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.2.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Jeremy Welch
|
8
|
+
- Thomas Hanley
|
8
9
|
autorequire: foursquare
|
9
10
|
bindir: bin
|
10
11
|
cert_chain: []
|
11
12
|
|
12
|
-
date:
|
13
|
+
date: 2010-02-07 00:00:00 -05:00
|
13
14
|
default_executable:
|
14
15
|
dependencies:
|
15
16
|
- !ruby/object:Gem::Dependency
|