quimby 0.3.0 → 0.4.0

Sign up to get free protection for your applications and to get access to all the features.
data/README.md CHANGED
@@ -13,6 +13,28 @@ Get a foursquare:
13
13
  You can also user `client_id` and `client_secret`
14
14
 
15
15
  foursquare = Foursquare::Base.new("CLIENT_ID", "CLIENT_SECRET")
16
+
17
+ ### Authentication
18
+
19
+ First, you need to [register your application](https://foursquare.com/oauth).
20
+
21
+ #### Web server application
22
+
23
+ Get a foursquare with your `client_id` and `client_secret`
24
+
25
+ foursquare = Foursquare::Base.new("CLIENT_ID", "CLIENT_SECRET")
26
+
27
+ Redirect users to the Foursquare authentication page. You need to pass your `callback_url`. Get the url to redirect to with:
28
+
29
+ foursquare.authorize_url("CALLBACK_SESSION_URL")
30
+
31
+ Then Foursquare will redirect the user to your callback url with a code parameter in the url. Exchange this code for an access token using:
32
+
33
+ access_token = foursquare.access_token(params["code"], "CALLBACK_SESSION_URL")
34
+
35
+ Now you can get a foursquare using only an access token and make requests on user's behalf:
36
+
37
+ foursquare = Foursquare::Base.new("ACCESS_TOKEN")
16
38
 
17
39
  ### Users
18
40
 
@@ -42,6 +64,10 @@ But wait, Foursquare isn't just users! It's checkins too! So let's find some che
42
64
  Now we have an array of `Foursquare::Checkin` objects. We can also grab a specific checkin:
43
65
 
44
66
  checkin = foursquare.checkins.find("CHECKIN_ID")
67
+
68
+ You also have a convenient method if you want to get all the user checkins:
69
+
70
+ user.all_checkins
45
71
 
46
72
  ### Venues
47
73
 
@@ -48,8 +48,55 @@ module Foursquare
48
48
  Foursquare.log(response.inspect)
49
49
  error(response) || response["response"]
50
50
  end
51
+
52
+ def authorize_url(redirect_uri)
53
+ # http://developer.foursquare.com/docs/oauth.html
54
+
55
+ # check params
56
+ raise "you need to define a client id before" if @client_id.blank?
57
+ raise "no callback url provided" if redirect_uri.blank?
58
+
59
+ # params
60
+ params = {}
61
+ params["client_id"] = @client_id
62
+ params["response_type"] = "code"
63
+ params["redirect_uri"] = redirect_uri
64
+
65
+ # url
66
+ oauth2_url('authenticate', params)
67
+ end
68
+
69
+ def access_token(code, redirect_uri)
70
+ # http://developer.foursquare.com/docs/oauth.html
71
+
72
+ # check params
73
+ raise "you need to define a client id before" if @client_id.blank?
74
+ raise "you need to define a client secret before" if @client_secret.blank?
75
+ raise "no code provided" if code.blank?
76
+ raise "no redirect_uri provided" if redirect_uri.blank?
77
+
78
+ # params
79
+ params = {}
80
+ params["client_id"] = @client_id
81
+ params["client_secret"] = @client_secret
82
+ params["grant_type"] = "authorization_code"
83
+ params["redirect_uri"] = redirect_uri
84
+ params["code"] = code
85
+
86
+ # url
87
+ url = oauth2_url('access_token', params)
88
+
89
+ # response
90
+ # http://developer.foursquare.com/docs/oauth.html
91
+ response = JSON.parse(Typhoeus::Request.get(url).body)
92
+ response["access_token"]
93
+ end
51
94
 
52
95
  private
96
+
97
+ def oauth2_url(method_name, params)
98
+ "https://foursquare.com/oauth2/#{method_name}?#{params.to_query}"
99
+ end
53
100
 
54
101
  def camelize(params)
55
102
  params.inject({}) { |o, (k, v)|
@@ -23,5 +23,30 @@ module Foursquare
23
23
  def sizes
24
24
  @json["sizes"]
25
25
  end
26
+
27
+ def square_300
28
+ @square_300 ||= @json["sizes"]["items"].select { |i| i["width"] == 300 }.first
29
+ end
30
+
31
+ def square_300_url
32
+ square_300["url"]
33
+ end
34
+
35
+ def square_100
36
+ @square_100 ||= @json["sizes"]["items"].select { |i| i["width"] == 100 }.first
37
+ end
38
+
39
+ def square_100_url
40
+ square_100["url"]
41
+ end
42
+
43
+ def square_36
44
+ @square_36 ||= @json["sizes"]["items"].select { |i| i["width"] == 36 }.first
45
+ end
46
+
47
+ def square_36_url
48
+ square_36["url"]
49
+ end
50
+
26
51
  end
27
52
  end
@@ -74,6 +74,27 @@ module Foursquare
74
74
  fetch unless @json.has_key?("mayorships")
75
75
  @json["mayorships"]["items"]
76
76
  end
77
+
78
+ # https://developer.foursquare.com/docs/users/checkins.html
79
+ # https://developer.foursquare.com/docs/explore.html#req=users/self/checkins
80
+ def checkins(options={})
81
+ @foursquare.get("users/#{id}/checkins", options)["checkins"]["items"].map do |item|
82
+ Foursquare::Checkin.new(@foursquare, item)
83
+ end
84
+ end
85
+
86
+ def all_checkins
87
+ count = 250
88
+ offset = 0
89
+ array = []
90
+ while count == 250
91
+ checkins = checkins(:limit => count, :offset => offset)
92
+ array += checkins
93
+ count = checkins.count
94
+ offset = offset + count
95
+ end
96
+ array
97
+ end
77
98
 
78
99
  def checkin_count
79
100
  fetch unless @json.has_key?("checkins")
@@ -19,11 +19,11 @@ module Foursquare
19
19
  end
20
20
 
21
21
  def location
22
- @json["location"]
22
+ Foursquare::Location.new(@json["location"])
23
23
  end
24
24
 
25
25
  def categories
26
- @json["categories"]
26
+ @categories ||= @json["categories"].map { |hash| Foursquare::Category.new(hash) }
27
27
  end
28
28
 
29
29
  def verified?
@@ -41,11 +41,41 @@ module Foursquare
41
41
  def todos_count
42
42
  @json["todos"]["count"]
43
43
  end
44
-
45
- def photos(options={:group => "checkin"})
44
+
45
+ def stats
46
+ @json["stats"]
47
+ end
48
+
49
+ def primary_category
50
+ return nil if categories.blank?
51
+ @primary_category ||= categories.select { |category| category.primary? }.try(:first)
52
+ end
53
+
54
+ # return the url to the icon of the primary category
55
+ # if no primary is available, then return a default icon
56
+ def icon
57
+ primary_category ? primary_category["icon"] : "https://foursquare.com/img/categories/none.png"
58
+ end
59
+
60
+ def photos_count
61
+ @json["photos"]["count"]
62
+ end
63
+
64
+ # not all photos may be present here (but we try to avoid one extra API call)
65
+ # if you want to get all the photos, try all_photos
66
+ def photos
67
+ return all_photos if @json["photos"].blank?
68
+ @json["photos"]["groups"].select { |g| g["type"] == "venue" }.first["items"].map do |item|
69
+ Foursquare::Photo.new(@foursquare, item)
70
+ end
71
+ end
72
+
73
+ # https://developer.foursquare.com/docs/venues/photos.html
74
+ def all_photos(options={:group => "venue"})
46
75
  @foursquare.get("venues/#{id}/photos", options)["photos"]["items"].map do |item|
47
76
  Foursquare::Photo.new(@foursquare, item)
48
77
  end
49
78
  end
79
+
50
80
  end
51
81
  end
metadata CHANGED
@@ -1,13 +1,13 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: quimby
3
3
  version: !ruby/object:Gem::Version
4
- hash: 19
4
+ hash: 15
5
5
  prerelease:
6
6
  segments:
7
7
  - 0
8
- - 3
8
+ - 4
9
9
  - 0
10
- version: 0.3.0
10
+ version: 0.4.0
11
11
  platform: ruby
12
12
  authors:
13
13
  - Pat Nakajima