john-mayer 0.1.4 → 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/README.md +47 -6
- data/lib/foursquare.rb +3 -0
- data/lib/foursquare/base.rb +12 -3
- data/lib/foursquare/checkin_proxy.rb +1 -0
- data/lib/foursquare/multi.rb +38 -0
- data/lib/foursquare/photo.rb +27 -0
- data/lib/foursquare/tip.rb +35 -0
- data/lib/foursquare/user.rb +6 -0
- data/lib/foursquare/user_proxy.rb +10 -0
- data/lib/foursquare/venue.rb +6 -0
- metadata +7 -5
- data/test.rb +0 -4
data/README.md
CHANGED
@@ -1,6 +1,7 @@
|
|
1
1
|
# John Mayer
|
2
2
|
|
3
|
-
It's a Foursquare API wrapper
|
3
|
+
It's a Foursquare API wrapper, designed to "just work", just like all of John Mayer's hooks and
|
4
|
+
sweet guitar licks. It uses objects instead of hashes, and tries to be smart about when to load things.
|
4
5
|
|
5
6
|
## Usage
|
6
7
|
|
@@ -8,25 +9,65 @@ Get a foursquare:
|
|
8
9
|
|
9
10
|
foursquare = Foursquare::Base.new("ACCESS_TOKEN")
|
10
11
|
|
12
|
+
### Users
|
13
|
+
|
11
14
|
Find a user:
|
12
15
|
|
13
|
-
foursquare.users.find("USER_ID")
|
16
|
+
user = foursquare.users.find("USER_ID")
|
17
|
+
|
18
|
+
Now we've got a `Foursquare::User` object. You can call sweet methods like `user.name` and even
|
19
|
+
`user.last_checkin`. **In general, John Mayer's Foursquare object methods are just snake-cased
|
20
|
+
versions of the attributes returned in the JSON.** Now let's accidentally that user's friends:
|
21
|
+
|
22
|
+
user.friends
|
23
|
+
|
24
|
+
This will return an array of `Foursquare::User` objects. Don't worry about the fact that they're
|
25
|
+
populated by limited JSON. John Mayer will fetch the extra JSON if you need it. For example:
|
26
|
+
|
27
|
+
friend = user.friends.first
|
28
|
+
friend.name # Will not trigger a network call, since we already have it
|
29
|
+
friend.twitter # Will trigger a network to load the user's contact information
|
30
|
+
|
31
|
+
### Checkins
|
32
|
+
|
33
|
+
But wait, Foursquare isn't just users! It's checkins too! So let's find some checkins:
|
14
34
|
|
15
|
-
|
35
|
+
user.checkins
|
16
36
|
|
17
|
-
|
37
|
+
Now we have an array of `Foursquare::Checkin` objects. We can also grab a specific checkin:
|
18
38
|
|
19
|
-
|
39
|
+
checkin = foursquare.checkins.find("CHECKIN_ID")
|
40
|
+
|
41
|
+
### Venues
|
42
|
+
|
43
|
+
We can get at a checkin's venue by calling `checkin.venue`. Pretty easy, RIGHT? Right. If you want to
|
44
|
+
find a venue directly, here ya go:
|
20
45
|
|
21
46
|
foursquare.venues.find("VENUE_ID")
|
22
47
|
|
48
|
+
You can also search venues:
|
49
|
+
|
50
|
+
foursquare.venues.search(:ll => "40.7236307,-73.9999479") # Returns all resulting groups
|
51
|
+
foursquare.venues.nearby(:ll => "40.7236307,-73.9999479") # Returns only nearby venues
|
52
|
+
foursquare.venues.trending(:ll => "40.7236307,-73.9999479") # Returns only trending venues
|
53
|
+
foursquare.venues.favorites(:ll => "40.7236307,-73.9999479") # Returns only favorite venues
|
54
|
+
|
55
|
+
The `:ll` option is required for venue searches. You can also feel free to pass any of the other
|
56
|
+
available Foursquare API options, as specified in the docs.
|
57
|
+
|
23
58
|
### Logging
|
24
59
|
|
25
60
|
If you want to see what's going on up in there, you can set `Foursquare.verbose` to `true`
|
26
61
|
|
27
62
|
Foursquare.verbose = true
|
28
63
|
|
29
|
-
Right now it'll log to `STDOUT`. Maybe I'll add nicer logging later. If you're lucky.
|
64
|
+
Right now it'll log to `STDOUT`. Maybe I'll add nicer logging later. If you're lucky. In the meantime,
|
65
|
+
if you want to use your own logger, and you're kind of a jerk like me, you can do something like this:
|
66
|
+
|
67
|
+
Foursquare.verbose = true
|
68
|
+
def Foursquare.log(message)
|
69
|
+
Rails.logger.info("[foursquare] #{message}") # HAX, SORRY BRANDON
|
70
|
+
end
|
30
71
|
|
31
72
|
## TODO
|
32
73
|
|
data/lib/foursquare.rb
CHANGED
@@ -3,6 +3,7 @@ $LOAD_PATH << File.dirname(__FILE__)
|
|
3
3
|
require "rubygems"
|
4
4
|
require "typhoeus"
|
5
5
|
require "json"
|
6
|
+
require "cgi"
|
6
7
|
require "foursquare/base"
|
7
8
|
require "foursquare/checkin_proxy"
|
8
9
|
require "foursquare/checkin"
|
@@ -11,6 +12,8 @@ require "foursquare/user"
|
|
11
12
|
require "foursquare/venue_proxy"
|
12
13
|
require "foursquare/venue"
|
13
14
|
require "foursquare/settings"
|
15
|
+
require "foursquare/tip"
|
16
|
+
require "foursquare/photo"
|
14
17
|
|
15
18
|
module Foursquare
|
16
19
|
class Error < StandardError ; end
|
data/lib/foursquare/base.rb
CHANGED
@@ -29,16 +29,17 @@ module Foursquare
|
|
29
29
|
params.merge!(:oauth_token => @access_token)
|
30
30
|
response = JSON.parse(Typhoeus::Request.get(API + path, :params => params).body)
|
31
31
|
Foursquare.log(response.inspect)
|
32
|
-
|
32
|
+
error(response) || response["response"]
|
33
33
|
end
|
34
34
|
|
35
35
|
def post(path, params={})
|
36
36
|
params = camelize(params)
|
37
37
|
Foursquare.log("POST #{API + path}")
|
38
|
+
Foursquare.log("PARAMS: #{params.inspect}")
|
38
39
|
params.merge!(:oauth_token => @access_token)
|
39
40
|
response = JSON.parse(Typhoeus::Request.post(API + path, :params => params).body)
|
40
41
|
Foursquare.log(response.inspect)
|
41
|
-
|
42
|
+
error(response) || response["response"]
|
42
43
|
end
|
43
44
|
|
44
45
|
private
|
@@ -51,7 +52,15 @@ module Foursquare
|
|
51
52
|
end
|
52
53
|
|
53
54
|
def error(response)
|
54
|
-
|
55
|
+
case response["meta"]["errorType"]
|
56
|
+
when nil
|
57
|
+
# It's all good.
|
58
|
+
when "deprecated"
|
59
|
+
Foursquare.log(Foursquare::ERRORS[response['meta']['errorType']])
|
60
|
+
nil
|
61
|
+
else
|
62
|
+
raise Foursquare::Error.new(Foursquare::ERRORS[response['meta']['errorType']])
|
63
|
+
end
|
55
64
|
end
|
56
65
|
end
|
57
66
|
end
|
@@ -0,0 +1,38 @@
|
|
1
|
+
# Here's how I want this to work:
|
2
|
+
#
|
3
|
+
# users, venues = foursquare.multi do |request|
|
4
|
+
# request.users.search :twitter => "nakajima"
|
5
|
+
# request.venues.search :ll => "12,-71"
|
6
|
+
# end
|
7
|
+
#
|
8
|
+
# It's just difficult to implement. So it's not implemented yet.
|
9
|
+
module Foursquare
|
10
|
+
class Multi
|
11
|
+
def initialize(foursquare, block)
|
12
|
+
@foursquare = foursquare
|
13
|
+
@requests = []
|
14
|
+
@responses = []
|
15
|
+
end
|
16
|
+
|
17
|
+
def get(path, options={})
|
18
|
+
@requests << path + query(params)
|
19
|
+
end
|
20
|
+
|
21
|
+
def perform
|
22
|
+
responses = @foursquare.get("multi", :requests => @requests.join(','))
|
23
|
+
end
|
24
|
+
|
25
|
+
private
|
26
|
+
|
27
|
+
def query(params)
|
28
|
+
camelized = params.inject({}) { |o, (k, v)|
|
29
|
+
o[k.to_s.gsub(/(_[a-z])/) { |m| m[1..1].upcase }] = v
|
30
|
+
o
|
31
|
+
}
|
32
|
+
camelized.inject([]) { |o, (k, v)|
|
33
|
+
o << CGI.escape(k) + "=" CGI.escape(v)
|
34
|
+
o
|
35
|
+
}.join('&')
|
36
|
+
end
|
37
|
+
end
|
38
|
+
end
|
@@ -0,0 +1,27 @@
|
|
1
|
+
module Foursquare
|
2
|
+
class Photo
|
3
|
+
def initialize(foursquare, json)
|
4
|
+
@foursquare, @json = foursquare, json
|
5
|
+
end
|
6
|
+
|
7
|
+
def id
|
8
|
+
@json["id"]
|
9
|
+
end
|
10
|
+
|
11
|
+
def name
|
12
|
+
@json["name"]
|
13
|
+
end
|
14
|
+
|
15
|
+
def created_at
|
16
|
+
@json["createdAt"]
|
17
|
+
end
|
18
|
+
|
19
|
+
def url
|
20
|
+
@json["url"]
|
21
|
+
end
|
22
|
+
|
23
|
+
def sizes
|
24
|
+
@json["sizes"]
|
25
|
+
end
|
26
|
+
end
|
27
|
+
end
|
@@ -0,0 +1,35 @@
|
|
1
|
+
module Foursquare
|
2
|
+
class Tip
|
3
|
+
def initialize(foursquare, json)
|
4
|
+
@foursquare, @json = foursquare, json
|
5
|
+
end
|
6
|
+
|
7
|
+
def id
|
8
|
+
@json["id"]
|
9
|
+
end
|
10
|
+
|
11
|
+
def text
|
12
|
+
@json["text"]
|
13
|
+
end
|
14
|
+
|
15
|
+
def created_at
|
16
|
+
@json["createdAt"]
|
17
|
+
end
|
18
|
+
|
19
|
+
def status
|
20
|
+
@json["status"]
|
21
|
+
end
|
22
|
+
|
23
|
+
def photo
|
24
|
+
@json["photo"]
|
25
|
+
end
|
26
|
+
|
27
|
+
def user
|
28
|
+
@json["user"] && Foursquare::User.new(@foursquare, @json["user"])
|
29
|
+
end
|
30
|
+
|
31
|
+
def venue
|
32
|
+
@json["venue"] && Foursquare::Venue.new(@foursquare, @json["venue"])
|
33
|
+
end
|
34
|
+
end
|
35
|
+
end
|
data/lib/foursquare/user.rb
CHANGED
@@ -102,5 +102,11 @@ module Foursquare
|
|
102
102
|
Foursquare::User.new(@foursquare, item)
|
103
103
|
end
|
104
104
|
end
|
105
|
+
|
106
|
+
def tips(options={})
|
107
|
+
@foursquare.get("users/#{id}/tips", options)["tips"]["items"].map do |item|
|
108
|
+
Foursquare::Tip.new(@foursquare, item)
|
109
|
+
end
|
110
|
+
end
|
105
111
|
end
|
106
112
|
end
|
@@ -4,8 +4,18 @@ module Foursquare
|
|
4
4
|
@foursquare = foursquare
|
5
5
|
end
|
6
6
|
|
7
|
+
def self.search(foursquare, options={})
|
8
|
+
|
9
|
+
end
|
10
|
+
|
7
11
|
def find(id)
|
8
12
|
Foursquare::User.new(@foursquare, @foursquare.get("users/#{id}")["user"])
|
9
13
|
end
|
14
|
+
|
15
|
+
def search(options={})
|
16
|
+
@foursquare.get("users/search", options)["results"].map do |json|
|
17
|
+
Foursquare::User.new(@foursquare, json)
|
18
|
+
end
|
19
|
+
end
|
10
20
|
end
|
11
21
|
end
|
data/lib/foursquare/venue.rb
CHANGED
@@ -39,5 +39,11 @@ module Foursquare
|
|
39
39
|
def todos_count
|
40
40
|
@json["todos"]["count"]
|
41
41
|
end
|
42
|
+
|
43
|
+
def photos(options={:group => "checkin"})
|
44
|
+
@foursquare.get("venues/#{id}/photos", options)["photos"]["items"].map do |item|
|
45
|
+
Foursquare::Photo.new(@foursquare, item)
|
46
|
+
end
|
47
|
+
end
|
42
48
|
end
|
43
49
|
end
|
metadata
CHANGED
@@ -1,13 +1,13 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: john-mayer
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
hash:
|
4
|
+
hash: 23
|
5
5
|
prerelease:
|
6
6
|
segments:
|
7
7
|
- 0
|
8
|
-
-
|
9
|
-
-
|
10
|
-
version: 0.
|
8
|
+
- 2
|
9
|
+
- 0
|
10
|
+
version: 0.2.0
|
11
11
|
platform: ruby
|
12
12
|
authors:
|
13
13
|
- Pat Nakajima
|
@@ -59,14 +59,16 @@ files:
|
|
59
59
|
- lib/foursquare.rb
|
60
60
|
- lib/foursquare/base.rb
|
61
61
|
- lib/foursquare/settings.rb
|
62
|
+
- lib/foursquare/tip.rb
|
63
|
+
- lib/foursquare/multi.rb
|
62
64
|
- lib/foursquare/checkin.rb
|
65
|
+
- lib/foursquare/photo.rb
|
63
66
|
- lib/foursquare/checkin_proxy.rb
|
64
67
|
- lib/foursquare/user.rb
|
65
68
|
- lib/foursquare/user_proxy.rb
|
66
69
|
- lib/foursquare/venue.rb
|
67
70
|
- lib/foursquare/venue_proxy.rb
|
68
71
|
- spec/THERE_ARENT_ANY
|
69
|
-
- test.rb
|
70
72
|
has_rdoc: true
|
71
73
|
homepage: https://github.com/groupme/john-mayer
|
72
74
|
licenses: []
|
data/test.rb
DELETED