Skip to content

Commit

Permalink
Added basic venue support
Browse files Browse the repository at this point in the history
  • Loading branch information
cmdrkeene committed Aug 13, 2009
1 parent f86d52f commit ea38647
Show file tree
Hide file tree
Showing 3 changed files with 76 additions and 22 deletions.
30 changes: 22 additions & 8 deletions lib/foursquare.rb
Expand Up @@ -2,15 +2,15 @@

class Foursquare
class VenueNotFoundError < StandardError;end

include HTTParty
base_uri "http://api.playfoursquare.com/v1"
format :json

def initialize(username = nil, password = nil)
@auth = {:username => username, :password => password}
end

# Allows you to check-in to a place.
# :vid => (optional, not necessary if you are 'shouting' or have a venue name). ID of the venue where you want to check-in.
# :venue => (optional, not necessary if you are 'shouting' or have a vid) if you don't have a venue ID, pass the venue name as a string using this parameter. foursquare will attempt to match it on the server-side
Expand All @@ -32,13 +32,27 @@ def checkin(options = {})
raise VenueNotFoundError if response.keys.include?("addvenueprompt")
response["checkin"]
end

def cities
self.class.cities
end


# Class methods

# Returns a list of currently active cities.
def self.cities
get("/cities.json")["cities"]
end

# Returns a list of venues near the area specified or that match the search
# term. Distance returned is in miles. It will return venue meta-data
# related to you and your friends.
#
# Options
# :geolat => latitude (required)
# :geolong => longitude (required)
# :r => radius in miles (optional)
# :l => limit of results (optional, default 10)
# :q => keyword search (optional)
def self.venues(options = {})
raise ArgumentError, "you must supply :geolat and :geolong" unless options[:geolat] and options[:geolong]

get("/venues.json", :query => options)["venues"]["group"]
end
end
1 change: 1 addition & 0 deletions spec/fixtures/venues.json
@@ -0,0 +1 @@
{"venues":{"group":[{"id":84676,"name":"InfiniHQ","distance":0.3,"address":"3339 Virginia St","crossstreet":"at Oak Ave","city":"Miami","state":"FL","zip":33133,"phone":3057284641,"geolat":25.7292,"geolong":-80.2413},{"id":10252,"name":"Life","distance":0.3,"address":"3342 Virginia St","crossstreet":null,"city":"Miami","state":"FL","zip":33133,"phone":null,"geolat":25.7289,"geolong":-80.2415},{"id":10350,"name":"Sandbar","distance":0.3,"address":"3064 Grand Ave","crossstreet":null,"city":"Miami","state":"FL","zip":33133,"phone":null,"geolat":25.7281,"geolong":-80.2428},{"id":10305,"name":"Oxygen Lounge","distance":0.3,"address":"2911 Grand Ave","crossstreet":null,"city":"Miami","state":"FL","zip":33133,"phone":null,"geolat":25.7285,"geolong":-80.2406},{"id":45598,"name":"Boardwalk Tavern & Pizzeria","distance":0.3,"address":"3415 Main Hwy","crossstreet":null,"city":"Coconut Grove","state":"FL","zip":33133,"phone":"305-567-0080","geolat":25.7277,"geolong":-80.2427},{"id":88408,"name":"Barracadu Bar & Grill }i{","distance":0.3,"address":"3035 Fuller St,","crossstreet":"btw Main Hwy and Grand ave","city":"Miami","state":"FL","zip":33133,"phone":"(305) 448-1144","geolat":25.7276,"geolong":-80.2432},{"id":85556,"name":"Barracadu Coconut Grove}i{","distance":0.3,"address":"3035 Fuller St","crossstreet":"btw Main Hwy and Grand ave","city":"Miami","state":"FL","zip":null,"phone":"(305) 448-1144","geolat":25.7276,"geolong":-80.2432},{"id":18315,"name":"Barracuda Bar","distance":0.3,"address":"3035 Fuller St","crossstreet":"at Grand Ave","city":"Miami","state":"FL","zip":33133,"phone":"305 448-1144","geolat":25.7276,"geolong":-80.2432},{"id":10219,"name":"Hungry Sailor","distance":0.3,"address":"3424 Main Highway","crossstreet":null,"city":"Miami","state":"FL","zip":33133,"phone":null,"geolat":25.7276,"geolong":-80.2428},{"id":10391,"name":"Tavern In The Grove","distance":0.3,"address":"3416 Main Highway","crossstreet":null,"city":"Miami","state":"FL","zip":33133,"phone":null,"geolat":25.7276,"geolong":-80.2427},{"id":10331,"name":"Quench","distance":0.3,"address":"2801 Florida Ave","crossstreet":null,"city":"Miami","state":"FL","zip":33133,"phone":"305 448-8150","geolat":25.7291,"geolong":-80.2395},{"id":10287,"name":"Mr. Moe's","distance":0.3,"address":"3131 Commodore Plaza","crossstreet":null,"city":"Miami","state":"FL","zip":33133,"phone":null,"geolat":25.7274,"geolong":-80.2441},{"id":10147,"name":"Don Quixote","distance":0.4,"address":"3120 Commodore Plaza","crossstreet":null,"city":"Miami","state":"FL","zip":33133,"phone":null,"geolat":25.7271,"geolong":-80.2447},{"id":10173,"name":"Flavour","distance":0.4,"address":"2895 McFarlane RD.","crossstreet":null,"city":"Miami","state":"FL","zip":33133,"phone":null,"geolat":25.7275,"geolong":-80.2411},{"id":10356,"name":"Senor Frogs","distance":0.4,"address":"3480 Main Highway","crossstreet":null,"city":"Miami","state":"FL","zip":33133,"phone":null,"geolat":25.7267,"geolong":-80.2442},{"id":10224,"name":"Improv Comedy Club","distance":0.4,"address":"3390 Mary St","crossstreet":null,"city":"Miami","state":"FL","zip":33133,"phone":null,"geolat":25.7282,"geolong":-80.2393},{"id":10124,"name":"Cocont Grove Expo Center","distance":0.5,"address":"2700 south bayshore drive","crossstreet":null,"city":"Miami","state":"FL","zip":33133,"phone":null,"geolat":25.7282,"geolong":-80.2379},{"id":80526,"name":"The Jewlicious Pad","distance":0.5,"address":"Grand Ave","crossstreet":null,"city":"Coconut Grove","state":"FL","zip":null,"phone":null,"twitter":"jewgonewild","geolat":25.7278,"geolong":-80.2499},{"id":10390,"name":"Taurus Chops","distance":0.5,"address":"3540 Main Highway","crossstreet":null,"city":"Miami","state":"FL","zip":33133,"phone":null,"geolat":25.7251,"geolong":-80.245},{"id":83833,"name":"Doubletree Coconut Grove","distance":0.5,"address":"2649 South Bayshore Drive","crossstreet":null,"city":"Miami","state":"FL","zip":33133,"phone":"305-858-2500","geolat":25.7312,"geolong":-80.2353}]}}
67 changes: 53 additions & 14 deletions spec/foursquare_spec.rb
Expand Up @@ -6,8 +6,8 @@
@username = "user@example.com"
@password = "secret"
end
describe ".checkin" do

describe "#checkin" do
before do
@valid_vid = 84689
@invalid_vid = 111
Expand All @@ -30,13 +30,13 @@
"http://user%40example.com:secret@api.playfoursquare.com/v1/checkin.json?vid=#{@invalid_vid}",
:body => fakeweb_read('checkin_failure.json'))
end

it "should raise an error if user is invalid" do
lambda {
Foursquare.new("bork@pork.com", "arglebargle").checkin(@valid_vid)
}.should raise_error
end

describe "to a valid venue, with a valid user" do
it "should check in and return check in data" do
@foursquare = Foursquare.new(@username, @password)
Expand All @@ -51,7 +51,7 @@
"friends" => {"position"=>1, "message"=>"#1 amongst friends"}
},
},
"id" => 701707,
"id" => 701707,
"badges" => {
"badge" => {"name"=>"Newbie", "text"=>"Congrats on your first check-in!", "icon"=>"http://playfoursquare.com/images/badges/newbie_on.png", "id"=>54494}
},
Expand All @@ -60,7 +60,7 @@
}
end
end

describe "with an invalid venue" do
it "should raise an error" do
lambda {
Expand All @@ -77,7 +77,7 @@
"http://api.playfoursquare.com/v1/cities.json?",
:body => fakeweb_read('cities.json'))
end

it "should return all cities currently active on Foursquare" do
cities = [
{"name"=>"Amsterdam", "geolong"=>4.90067, "geolat"=>52.3789, "timezone"=>"Europe/Amsterdam", "id"=>56},
Expand All @@ -90,29 +90,68 @@
{"name"=>"Detroit", "geolong"=>-83.0484, "geolat"=>42.3333, "timezone"=>"America/New_York", "id"=>47},
{"name"=>"Houston", "geolong"=>-95.3594, "geolat"=>29.7594, "timezone"=>"America/Chicago", "id"=>48},
{"name"=>"Las Vegas", "geolong"=>-115.122, "geolat"=>36.1721, "timezone"=>"America/Los_Angeles", "id"=>49},
{"name"=>"Los Angeles", "geolong"=>-118.251, "geolat"=>34.0443, "timezone"=>"America/Los_Angeles", "id"=>34},
{"name"=>"Los Angeles", "geolong"=>-118.251, "geolat"=>34.0443, "timezone"=>"America/Los_Angeles", "id"=>34},
{"name"=>"Miami", "geolong"=>-80.2436, "geolat"=>25.7323, "timezone"=>"America/New_York", "id"=>39},
{"name"=>"Minneapolis / St. Paul", "geolong"=>-93.2642, "geolat"=>44.9609, "timezone"=>"America/Chicago", "id"=>51},
{"name"=>"New York City", "geolong"=>-73.9983, "geolat"=>40.7255, "timezone"=>"America/New_York", "id"=>22},
{"name"=>"Philadelphia", "geolong"=>-75.2731, "geolat"=>39.8694, "timezone"=>"America/New_York", "id"=>33},
{"name"=>"Phoenix", "geolong"=>-112.073, "geolat"=>33.4483, "timezone"=>"America/Phoenix", "id"=>53},
{"name"=>"Portland", "geolong"=>-122.685, "geolat"=>45.527, "timezone"=>"America/Los_Angeles", "id"=>37},
{"name"=>"San Diego", "geolong"=>-117.156, "geolat"=>32.7153, "timezone"=>"America/Los_Angeles", "id"=>38},
{"name"=>"San Francisco", "geolong"=>-122.433, "geolat"=>37.7587, "timezone"=>"America/Los_Angeles", "id"=>23},
{"name"=>"Seattle", "geolong"=>-122.326, "geolat"=>47.6036, "timezone"=>"America/Los_Angeles", "id"=>41},
{"name"=>"San Diego", "geolong"=>-117.156, "geolat"=>32.7153, "timezone"=>"America/Los_Angeles", "id"=>38},
{"name"=>"San Francisco", "geolong"=>-122.433, "geolat"=>37.7587, "timezone"=>"America/Los_Angeles", "id"=>23},
{"name"=>"Seattle", "geolong"=>-122.326, "geolat"=>47.6036, "timezone"=>"America/Los_Angeles", "id"=>41},
{"name"=>"Washington, DC", "geolong"=>-77.0447, "geolat"=>38.8964, "timezone"=>"America/New_York", "id"=>31}
]
Foursquare.new.cities.should == cities
Foursquare.cities.should == cities
end
end

describe ".tip" do
end

describe ".user" do
end


describe "#user" do
end

describe ".venue" do
before do
FakeWeb.register_uri(:get,
"http://api.playfoursquare.com/v1/venues.json?geolat=25.7323&geolong=80.2436",
:body => fakeweb_read('venues.json'))
end

it "should raise an error unless geolat and geolong are passed" do
lambda {
Foursquare.venues
}.should raise_error(ArgumentError)
end

it "should return a list of nearby venues" do
venues = [
{"city"=>"Miami", "address"=>"3339 Virginia St", "name"=>"InfiniHQ", "zip"=>33133, "geolong"=>-80.2413, "geolat"=>25.7292, "crossstreet"=>"at Oak Ave", "id"=>84676, "phone"=>3057284641, "state"=>"FL", "distance"=>0.3},
{"city"=>"Miami", "address"=>"3342 Virginia St", "name"=>"Life", "zip"=>33133, "geolong"=>-80.2415, "geolat"=>25.7289, "crossstreet"=>nil, "id"=>10252, "phone"=>nil, "state"=>"FL", "distance"=>0.3},
{"city"=>"Miami", "address"=>"3064 Grand Ave", "name"=>"Sandbar", "zip"=>33133, "geolong"=>-80.2428, "geolat"=>25.7281, "crossstreet"=>nil, "id"=>10350, "phone"=>nil, "state"=>"FL", "distance"=>0.3},
{"city"=>"Miami", "address"=>"2911 Grand Ave", "name"=>"Oxygen Lounge", "zip"=>33133, "geolong"=>-80.2406, "geolat"=>25.7285, "crossstreet"=>nil, "id"=>10305, "phone"=>nil, "state"=>"FL", "distance"=>0.3},
{"city"=>"Coconut Grove", "address"=>"3415 Main Hwy", "name"=>"Boardwalk Tavern & Pizzeria", "zip"=>33133, "geolong"=>-80.2427, "geolat"=>25.7277, "crossstreet"=>nil, "id"=>45598, "phone"=>"305-567-0080", "state"=>"FL", "distance"=>0.3},
{"city"=>"Miami", "address"=>"3035 Fuller St,", "name"=>"Barracadu Bar & Grill }i{", "zip"=>33133, "geolong"=>-80.2432, "geolat"=>25.7276, "crossstreet"=>"btw Main Hwy and Grand ave", "id"=>88408, "phone"=>"(305) 448-1144", "state"=>"FL", "distance"=>0.3},
{"city"=>"Miami", "address"=>"3035 Fuller St", "name"=>"Barracadu Coconut Grove}i{", "zip"=>nil, "geolong"=>-80.2432, "geolat"=>25.7276, "crossstreet"=>"btw Main Hwy and Grand ave", "id"=>85556, "phone"=>"(305) 448-1144", "state"=>"FL", "distance"=>0.3},
{"city"=>"Miami", "address"=>"3035 Fuller St", "name"=>"Barracuda Bar", "zip"=>33133, "geolong"=>-80.2432, "geolat"=>25.7276, "crossstreet"=>"at Grand Ave", "id"=>18315, "phone"=>"305 448-1144", "state"=>"FL", "distance"=>0.3},
{"city"=>"Miami", "address"=>"3424 Main Highway", "name"=>"Hungry Sailor", "zip"=>33133, "geolong"=>-80.2428, "geolat"=>25.7276, "crossstreet"=>nil, "id"=>10219, "phone"=>nil, "state"=>"FL", "distance"=>0.3},
{"city"=>"Miami", "address"=>"3416 Main Highway", "name"=>"Tavern In The Grove", "zip"=>33133, "geolong"=>-80.2427, "geolat"=>25.7276, "crossstreet"=>nil, "id"=>10391, "phone"=>nil, "state"=>"FL", "distance"=>0.3},
{"city"=>"Miami", "address"=>"2801 Florida Ave", "name"=>"Quench", "zip"=>33133, "geolong"=>-80.2395, "geolat"=>25.7291, "crossstreet"=>nil, "id"=>10331, "phone"=>"305 448-8150", "state"=>"FL", "distance"=>0.3},
{"city"=>"Miami", "address"=>"3131 Commodore Plaza", "name"=>"Mr. Moe's", "zip"=>33133, "geolong"=>-80.2441, "geolat"=>25.7274, "crossstreet"=>nil, "id"=>10287, "phone"=>nil, "state"=>"FL", "distance"=>0.3},
{"city"=>"Miami", "address"=>"3120 Commodore Plaza", "name"=>"Don Quixote", "zip"=>33133, "geolong"=>-80.2447, "geolat"=>25.7271, "crossstreet"=>nil, "id"=>10147, "phone"=>nil, "state"=>"FL", "distance"=>0.4},
{"city"=>"Miami", "address"=>"2895 McFarlane RD.", "name"=>"Flavour", "zip"=>33133, "geolong"=>-80.2411, "geolat"=>25.7275, "crossstreet"=>nil, "id"=>10173, "phone"=>nil, "state"=>"FL", "distance"=>0.4},
{"city"=>"Miami", "address"=>"3480 Main Highway", "name"=>"Senor Frogs", "zip"=>33133, "geolong"=>-80.2442, "geolat"=>25.7267, "crossstreet"=>nil, "id"=>10356, "phone"=>nil, "state"=>"FL", "distance"=>0.4},
{"city"=>"Miami", "address"=>"3390 Mary St", "name"=>"Improv Comedy Club", "zip"=>33133, "geolong"=>-80.2393, "geolat"=>25.7282, "crossstreet"=>nil, "id"=>10224, "phone"=>nil, "state"=>"FL", "distance"=>0.4},
{"city"=>"Miami", "address"=>"2700 south bayshore drive", "name"=>"Cocont Grove Expo Center", "zip"=>33133, "geolong"=>-80.2379, "geolat"=>25.7282, "crossstreet"=>nil, "id"=>10124, "phone"=>nil, "state"=>"FL", "distance"=>0.5},
{"city"=>"Coconut Grove", "address"=>"Grand Ave", "name"=>"The Jewlicious Pad", "zip"=>nil, "geolong"=>-80.2499, "geolat"=>25.7278, "crossstreet"=>nil, "id"=>80526, "phone"=>nil, "twitter"=>"jewgonewild", "state"=>"FL", "distance"=>0.5},
{"city"=>"Miami", "address"=>"3540 Main Highway", "name"=>"Taurus Chops", "zip"=>33133, "geolong"=>-80.245, "geolat"=>25.7251, "crossstreet"=>nil, "id"=>10390, "phone"=>nil, "state"=>"FL", "distance"=>0.5},
{"city"=>"Miami", "address"=>"2649 South Bayshore Drive", "name"=>"Doubletree Coconut Grove", "zip"=>33133, "geolong"=>-80.2353, "geolat"=>25.7312, "crossstreet"=>nil, "id"=>83833, "phone"=>"305-858-2500", "state"=>"FL", "distance"=>0.5}
]
Foursquare.venues(:geolat => 25.7323, :geolong => 80.2436)
end
end
end

0 comments on commit ea38647

Please sign in to comment.