instagram 1.0.0 → 1.1.0

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,15 +1,15 @@
1
1
  ---
2
2
  !binary "U0hBMQ==":
3
3
  metadata.gz: !binary |-
4
- MzgxZDBjNmRmOTY4Y2Q4NjI0YzE0NDc1NTQ2ZThmYzQ1ZDgxMzA2MA==
4
+ OGU4OWZjOWU2YjA2Yzg2ZTU5OGMzZTEyMDcxZWM5OTU2NTI5Yzk1Nw==
5
5
  data.tar.gz: !binary |-
6
- ZmM0YmZhNjVjYzVmMGE0NTVlMTQyMmNjNDk3ZDhlMTBiZjEyY2YzMw==
6
+ NDY2NjdiZjM2YmJiODE1MjllYmMxMTdiZGU2ZmVjMjA3MzM5NDFiNg==
7
7
  SHA512:
8
8
  metadata.gz: !binary |-
9
- NmIwZDYxY2NiZTM1ODhjZDRiMGQzODYzNDNhMzVjNWZhYjgwYjkwYTE0MjQy
10
- YTVlYmFhMzNjMWQ3NzBiMjdmZWNjMTQwYzliY2Y0ZDA2NjRhZjhjMTI2OTQz
11
- ZWI4MTY3MmQ3MTgzZTNjMGM4OWQ3YzMwZjE0YTllZTRjODJiMTE=
9
+ MmMwNDBiNGFlZmMwODg4ZjNlNzQ5NmIwNmYyOGFkMzBlOWJlYjIzYmVjN2Zk
10
+ YWY2OTY2OTVkOWQyMDBmYjMzMDhmZGMxYWZmMmFiZWE0ZmNmNDJlZmRlNWRl
11
+ ZDJmMTdkZTc1Y2E3MWU1NWI1NzMwZGJkOWI2ZmRiOWE5MGFhZjA=
12
12
  data.tar.gz: !binary |-
13
- ZDk2Y2ZhZjNmNDM3ZDJjNDVmMGVlOGUzMjUwM2JiOGUyMDJhODhjNzFlZWRi
14
- M2U0NTAzNmY1Y2E2ZTgyOGZhYmFhNzIyNDc5MzhhYjc1N2EyY2IxZmYzN2Qx
15
- YTY0OTkyOWMyNmY0OGQ3MWZlNzVkNjIyOGMyNjJlZmViY2I3NDk=
13
+ OTVjOTBlMjMyYmMyMzRmYTk3MGJjMTdjNDM0YmJlMmMxNzhiNzUwNjc1ZDA3
14
+ MzJjODgyNmQzZGM2MDExMGQ0ODIyMTQ0ZWIzYzIzMTEwNDkwOTk4MmRhYjg3
15
+ YTQyYTJmMThkZTk1NTY1ZDY3MjA3OGE1NTI5NTkwZjBkOWFlYzQ=
@@ -0,0 +1,5 @@
1
+ language: ruby
2
+ rvm:
3
+ - 2.1.2
4
+ - 2.0.0
5
+ - 1.9.3
data/README.md CHANGED
@@ -39,8 +39,10 @@ enable :sessions
39
39
  CALLBACK_URL = "http://localhost:4567/oauth/callback"
40
40
 
41
41
  Instagram.configure do |config|
42
- config.client_id = "YOUR_CLIENT_ID" #"86893d683a2145fda781f77e48b9aa4a"
43
- config.client_secret = "YOUR_CLIENT_SECRET" #"6fea5cbc10214966b131c43563fd4664"
42
+ config.client_id = "YOUR_CLIENT_ID"
43
+ config.client_secret = "YOUR_CLIENT_SECRET"
44
+ # For secured endpoints only
45
+ #config.client_ips = '<Comma separated list of IPs>'
44
46
  end
45
47
 
46
48
  get "/" do
@@ -82,11 +84,23 @@ get "/user_recent_media" do
82
84
  user = client.user
83
85
  html = "<h1>#{user.username}'s recent media</h1>"
84
86
  for media_item in client.user_recent_media
85
- html << "<img src='#{media_item.images.thumbnail.url}'>"
87
+ html << "<div style='float:left;'><img src='#{media_item.images.thumbnail.url}'><br/> <a href='/media_like/#{media_item.id}'>Like</a> <a href='/media_unlike/#{media_item.id}'>Un-Like</a> <br/>LikesCount=#{media_item.likes[:count]}</div>"
86
88
  end
87
89
  html
88
90
  end
89
91
 
92
+ get '/media_like/:id' do
93
+ client = Instagram.client(:access_token => session[:access_token])
94
+ client.like_media("#{params[:id]}")
95
+ redirect "/user_recent_media"
96
+ end
97
+
98
+ get '/media_unlike/:id' do
99
+ client = Instagram.client(:access_token => session[:access_token])
100
+ client.unlike_media("#{params[:id]}")
101
+ redirect "/user_recent_media"
102
+ end
103
+
90
104
  get "/user_media_feed" do
91
105
  client = Instagram.client(:access_token => session[:access_token])
92
106
  user = client.user
@@ -2,6 +2,7 @@
2
2
  require File.expand_path('../lib/instagram/version', __FILE__)
3
3
 
4
4
  Gem::Specification.new do |s|
5
+ s.add_development_dependency('rake', '~> 0.9.2.2')
5
6
  s.add_development_dependency('rspec', '~> 2.4')
6
7
  s.add_development_dependency('webmock', '~> 1.6')
7
8
  s.add_development_dependency('bluecloth', '~> 2.0.11')
@@ -21,9 +22,9 @@ Our developer site documents all the Instagram REST and Search APIs.
21
22
 
22
23
  Blog
23
24
  ----------------------------
24
- The Developer Blog features news and important announcements about the Instagram Platform.
25
+ The Developer Blog features news and important announcements about the Instagram Platform.
25
26
  You will also find tutorials and best practices to help you build great platform integrations.
26
- Make sure to subscribe to the RSS feed so you don't miss out on new posts:
27
+ Make sure to subscribe to the RSS feed so you don't miss out on new posts:
27
28
  (http://developers.instagram.com).
28
29
 
29
30
  Community
@@ -11,6 +11,8 @@ module FaradayMiddleware
11
11
  raise Instagram::BadRequest, error_message_400(response)
12
12
  when 404
13
13
  raise Instagram::NotFound, error_message_400(response)
14
+ when 429
15
+ raise Instagram::TooManyRequests, error_message_400(response)
14
16
  when 500
15
17
  raise Instagram::InternalServerError, error_message_500(response, "Something is technically wrong.")
16
18
  when 502
@@ -45,6 +47,8 @@ module FaradayMiddleware
45
47
  nil
46
48
  elsif body['meta'] and body['meta']['error_message'] and not body['meta']['error_message'].empty?
47
49
  ": #{body['meta']['error_message']}"
50
+ elsif body['error_message'] and not body['error_message'].empty?
51
+ ": #{body['error_type']}: #{body['error_message']}"
48
52
  end
49
53
  end
50
54
 
@@ -35,7 +35,7 @@ module Instagram
35
35
  # @rate_limited true
36
36
  # @see http://instagram.com/developer/endpoints/comments/#post_media_comments
37
37
  def create_media_comment(id, text, options={})
38
- response = post("media/#{id}/comments", options.merge(:text => text))
38
+ response = post("media/#{id}/comments", options.merge(:text => text), signature=true)
39
39
  response
40
40
  end
41
41
 
@@ -54,7 +54,7 @@ module Instagram
54
54
  # @rate_limited true
55
55
  # @see http://instagram.com/developer/endpoints/comments/#delete_media_comments
56
56
  def delete_media_comment(media_id, comment_id, options={})
57
- response = delete("media/#{media_id}/comments/#{comment_id}", options)
57
+ response = delete("media/#{media_id}/comments/#{comment_id}", options, signature=true)
58
58
  response
59
59
  end
60
60
  end
@@ -21,7 +21,7 @@ module Instagram
21
21
  def oembed(*args)
22
22
  url = args.first
23
23
  return nil unless url
24
- get("oembed?url=#{url}", {}, false, true)
24
+ get("oembed?url=#{url}", {}, false, false, true)
25
25
  end
26
26
  end
27
27
  end
@@ -34,7 +34,7 @@ module Instagram
34
34
  # @rate_limited true
35
35
  # @see http://instagram.com/developer/endpoints/likes/#post_likes
36
36
  def like_media(id, options={})
37
- response = post("media/#{id}/likes", options)
37
+ response = post("media/#{id}/likes", options, signature=true)
38
38
  response
39
39
  end
40
40
 
@@ -50,7 +50,7 @@ module Instagram
50
50
  # @rate_limited true
51
51
  # @see http://instagram.com/developer/endpoints/likes/#delete_likes
52
52
  def unlike_media(id, options={})
53
- response = delete("media/#{id}/likes", options)
53
+ response = delete("media/#{id}/likes", options, signature=true)
54
54
  response
55
55
  end
56
56
  end
@@ -34,7 +34,7 @@ module Instagram
34
34
  # @rate_limited true
35
35
  def tag_recent_media(id, *args)
36
36
  options = args.last.is_a?(Hash) ? args.pop : {}
37
- response = get("tags/#{id}/media/recent", options, false, false)
37
+ response = get("tags/#{id}/media/recent", options, false, false, false)
38
38
  response
39
39
  end
40
40
 
@@ -213,7 +213,7 @@ module Instagram
213
213
  # @rate_limited true
214
214
  def follow_user(id, options={})
215
215
  options["action"] = "follow"
216
- response = post("users/#{id}/relationship", options)
216
+ response = post("users/#{id}/relationship", options, signature=true)
217
217
  response
218
218
  end
219
219
 
@@ -231,7 +231,7 @@ module Instagram
231
231
  # @rate_limited true
232
232
  def unfollow_user(id, options={})
233
233
  options["action"] = "unfollow"
234
- response = post("users/#{id}/relationship", options)
234
+ response = post("users/#{id}/relationship", options, signature=true)
235
235
  response
236
236
  end
237
237
 
@@ -249,7 +249,7 @@ module Instagram
249
249
  # @rate_limited true
250
250
  def block_user(id, options={})
251
251
  options["action"] = "block"
252
- response = post("users/#{id}/relationship", options)
252
+ response = post("users/#{id}/relationship", options, signature=true)
253
253
  response
254
254
  end
255
255
 
@@ -267,7 +267,7 @@ module Instagram
267
267
  # @rate_limited true
268
268
  def unblock_user(id, options={})
269
269
  options["action"] = "unblock"
270
- response = post("users/#{id}/relationship", options)
270
+ response = post("users/#{id}/relationship", options, signature=true)
271
271
  response
272
272
  end
273
273
 
@@ -285,7 +285,7 @@ module Instagram
285
285
  # @rate_limited true
286
286
  def approve_user(id, options={})
287
287
  options["action"] = "approve"
288
- response = post("users/#{id}/relationship", options)
288
+ response = post("users/#{id}/relationship", options, signature=true)
289
289
  response
290
290
  end
291
291
 
@@ -303,7 +303,7 @@ module Instagram
303
303
  # @rate_limited true
304
304
  def deny_user(id, options={})
305
305
  options["action"] = "deny"
306
- response = post("users/#{id}/relationship", options)
306
+ response = post("users/#{id}/relationship", options, signature=true)
307
307
  response
308
308
  end
309
309
  end
@@ -10,6 +10,7 @@ module Instagram
10
10
  :adapter,
11
11
  :client_id,
12
12
  :client_secret,
13
+ :client_ips,
13
14
  :connection_options,
14
15
  :scope,
15
16
  :redirect_uri,
@@ -34,6 +35,9 @@ module Instagram
34
35
  # By default, don't set an application secret
35
36
  DEFAULT_CLIENT_SECRET = nil
36
37
 
38
+ # By default, don't set application IPs
39
+ DEFAULT_CLIENT_IPS = nil
40
+
37
41
  # By default, don't set any connection options
38
42
  DEFAULT_CONNECTION_OPTIONS = {}
39
43
 
@@ -94,6 +98,7 @@ module Instagram
94
98
  self.adapter = DEFAULT_ADAPTER
95
99
  self.client_id = DEFAULT_CLIENT_ID
96
100
  self.client_secret = DEFAULT_CLIENT_SECRET
101
+ self.client_ips = DEFAULT_CLIENT_IPS
97
102
  self.connection_options = DEFAULT_CONNECTION_OPTIONS
98
103
  self.scope = DEFAULT_SCOPE
99
104
  self.redirect_uri = DEFAULT_REDIRECT_URI
@@ -101,7 +106,7 @@ module Instagram
101
106
  self.format = DEFAULT_FORMAT
102
107
  self.proxy = DEFAULT_PROXY
103
108
  self.user_agent = DEFAULT_USER_AGENT
104
- self.no_response_wrapper= DEFAULT_NO_RESPONSE_WRAPPER
109
+ self.no_response_wrapper= DEFAULT_NO_RESPONSE_WRAPPER
105
110
  end
106
111
  end
107
112
  end
@@ -8,6 +8,9 @@ module Instagram
8
8
  # Raised when Instagram returns the HTTP status code 404
9
9
  class NotFound < Error; end
10
10
 
11
+ # Raised when Instagram returns the HTTP status code 429
12
+ class TooManyRequests < Error; end
13
+
11
14
  # Raised when Instagram returns the HTTP status code 500
12
15
  class InternalServerError < Error; end
13
16
 
@@ -22,4 +25,7 @@ module Instagram
22
25
 
23
26
  # Raised when a subscription payload hash is invalid
24
27
  class InvalidSignature < Error; end
28
+
29
+ # Raised when Instagram returns the HTTP status code 429
30
+ class RateLimitExceeded < Error; end
25
31
  end
@@ -15,7 +15,7 @@ module Instagram
15
15
  options[:grant_type] ||= "authorization_code"
16
16
  options[:redirect_uri] ||= self.redirect_uri
17
17
  params = access_token_params.merge(options)
18
- post("/oauth/access_token/", params.merge(:code => code), raw=false, unformatted=true, no_response_wrapper=true)
18
+ post("/oauth/access_token/", params.merge(:code => code), signature=false, raw=false, unformatted=true, no_response_wrapper=true)
19
19
  end
20
20
 
21
21
  private
@@ -1,30 +1,33 @@
1
+ require 'openssl'
2
+ require 'base64'
3
+
1
4
  module Instagram
2
5
  # Defines HTTP request methods
3
6
  module Request
4
7
  # Perform an HTTP GET request
5
- def get(path, options={}, raw=false, unformatted=false, no_response_wrapper=no_response_wrapper)
6
- request(:get, path, options, raw, unformatted, no_response_wrapper)
8
+ def get(path, options={}, signature=false, raw=false, unformatted=false, no_response_wrapper=no_response_wrapper)
9
+ request(:get, path, options, signature, raw, unformatted, no_response_wrapper)
7
10
  end
8
11
 
9
12
  # Perform an HTTP POST request
10
- def post(path, options={}, raw=false, unformatted=false, no_response_wrapper=no_response_wrapper)
11
- request(:post, path, options, raw, unformatted, no_response_wrapper)
13
+ def post(path, options={}, signature=false, raw=false, unformatted=false, no_response_wrapper=no_response_wrapper)
14
+ request(:post, path, options, signature, raw, unformatted, no_response_wrapper)
12
15
  end
13
16
 
14
17
  # Perform an HTTP PUT request
15
- def put(path, options={}, raw=false, unformatted=false, no_response_wrapper=no_response_wrapper)
16
- request(:put, path, options, raw, unformatted, no_response_wrapper)
18
+ def put(path, options={}, signature=false, raw=false, unformatted=false, no_response_wrapper=no_response_wrapper)
19
+ request(:put, path, options, signature, raw, unformatted, no_response_wrapper)
17
20
  end
18
21
 
19
22
  # Perform an HTTP DELETE request
20
- def delete(path, options={}, raw=false, unformatted=false, no_response_wrapper=no_response_wrapper)
21
- request(:delete, path, options, raw, unformatted, no_response_wrapper)
23
+ def delete(path, options={}, signature=false, raw=false, unformatted=false, no_response_wrapper=no_response_wrapper)
24
+ request(:delete, path, options, signature, raw, unformatted, no_response_wrapper)
22
25
  end
23
26
 
24
27
  private
25
28
 
26
29
  # Perform an HTTP request
27
- def request(method, path, options, raw=false, unformatted=false, no_response_wrapper=false)
30
+ def request(method, path, options, signature=false, raw=false, unformatted=false, no_response_wrapper=false)
28
31
  response = connection(raw).send(method) do |request|
29
32
  path = formatted_path(path) unless unformatted
30
33
  case method
@@ -34,6 +37,9 @@ module Instagram
34
37
  request.path = path
35
38
  request.body = options unless options.empty?
36
39
  end
40
+ if signature && client_ips != nil
41
+ request.headers["X-Insta-Forwarded-For"] = get_insta_fowarded_for(client_ips, client_secret)
42
+ end
37
43
  end
38
44
  return response if raw
39
45
  return response.body if no_response_wrapper
@@ -43,5 +49,12 @@ module Instagram
43
49
  def formatted_path(path)
44
50
  [path, format].compact.join('.')
45
51
  end
52
+
53
+ def get_insta_fowarded_for(ips, secret)
54
+ digest = OpenSSL::Digest::Digest.new('sha256')
55
+ signature = OpenSSL::HMAC.hexdigest(digest, secret, ips)
56
+ return [ips, signature].join('|')
57
+ end
58
+
46
59
  end
47
60
  end
@@ -1,3 +1,3 @@
1
1
  module Instagram
2
- VERSION = '1.0.0'.freeze unless defined?(::Instagram::VERSION)
2
+ VERSION = '1.1.0'.freeze unless defined?(::Instagram::VERSION)
3
3
  end
@@ -8,6 +8,7 @@ describe Faraday::Response do
8
8
  {
9
9
  400 => Instagram::BadRequest,
10
10
  404 => Instagram::NotFound,
11
+ 429 => Instagram::TooManyRequests,
11
12
  500 => Instagram::InternalServerError,
12
13
  503 => Instagram::ServiceUnavailable
13
14
  }.each do |status, exception|
@@ -36,7 +37,20 @@ describe Faraday::Response do
36
37
  it "should return the body error message" do
37
38
  expect do
38
39
  @client.user_media_feed()
39
- end.to raise_error(Instagram::BadRequest, /Bad words are bad./)
40
+ end.to raise_error(Instagram::BadRequest, /Bad words are bad\./)
41
+ end
42
+ end
43
+
44
+ context "when a 400 is raised with no meta but an error_message" do
45
+ before do
46
+ stub_get('users/self/feed.json').
47
+ to_return(:body => '{"error_type": "OAuthException", "error_message": "No matching code found."}', :status => 400)
48
+ end
49
+
50
+ it "should return the body error type and message" do
51
+ expect do
52
+ @client.user_media_feed()
53
+ end.to raise_error(Instagram::BadRequest, /OAuthException: No matching code found\./)
40
54
  end
41
55
  end
42
56
 
@@ -34,6 +34,7 @@ describe Instagram::API do
34
34
  :adapter => :typhoeus,
35
35
  :client_id => 'CID',
36
36
  :client_secret => 'CS',
37
+ :client_ips => '1.2.3.4',
37
38
  :connection_options => { :ssl => { :verify => true } },
38
39
  :redirect_uri => 'http://http://localhost:4567/oauth/callback',
39
40
  :endpoint => 'http://tumblr.com/',
@@ -5,7 +5,7 @@ describe Instagram::Client do
5
5
  context ".new(:format => '#{format}')" do
6
6
 
7
7
  before do
8
- @client = Instagram::Client.new(:format => format, :client_id => 'CID', :client_secret => 'CS', :access_token => 'AT')
8
+ @client = Instagram::Client.new(:format => format, :client_id => 'CID', :client_secret => 'CS', :client_ips => '1.2.3.4', :access_token => 'AT')
9
9
  end
10
10
 
11
11
  describe ".media_likes" do
@@ -0,0 +1,56 @@
1
+ require File.expand_path('../../spec_helper', __FILE__)
2
+
3
+ describe Instagram::Request do
4
+ describe "#post" do
5
+ before do
6
+ @ips = "1.2.3.4"
7
+ @secret = "CS"
8
+ digest = OpenSSL::Digest::Digest.new('sha256')
9
+ signature = OpenSSL::HMAC.hexdigest(digest, @secret, @ips)
10
+ @signed_header = [@ips, signature].join('|')
11
+ end
12
+
13
+ context "with signature=true" do
14
+ it "should set X-Insta-Forwarded-For header" do
15
+ client = Instagram::Client.new(:client_id => "CID", :client_secret => @secret, :client_ips => @ips, :access_token => "AT")
16
+ url = client.send(:connection).build_url("/media/123/likes.json").to_s
17
+ stub_request(:post, url).
18
+ with(:body => {"access_token"=>"AT"}).
19
+ to_return(:status => 200, :body => "", :headers => {})
20
+
21
+ client.post("/media/123/likes", {}, signature=true)
22
+ a_request(:post, url).
23
+ with(:headers => {'X-Insta-Forwarded-For'=> @signed_header}).
24
+ should have_been_made
25
+ end
26
+
27
+ it "should not set X-Insta-Fowarded-For header if client_ips is not provided" do
28
+ client = Instagram::Client.new(:client_id => "CID", :client_secret => @secret, :access_token => "AT")
29
+ url = client.send(:connection).build_url("/media/123/likes.json").to_s
30
+ stub_request(:post, url).
31
+ with(:body => {"access_token"=>"AT"}).
32
+ to_return(:status => 200, :body => "", :headers => {})
33
+
34
+ client.post("/media/123/likes", {}, signature=true)
35
+ a_request(:post, url).
36
+ with(:headers => {'X-Insta-Forwarded-For'=> @signed_header}).
37
+ should_not have_been_made
38
+ end
39
+ end
40
+
41
+ context "with signature=false" do
42
+ it "should set X-Insta-Forwarded-For header" do
43
+ client = Instagram::Client.new(:client_id => "CID", :client_secret => @secret, :client_ips => @ips, :access_token => "AT")
44
+ url = client.send(:connection).build_url("/media/123/likes.json").to_s
45
+ stub_request(:post, url).
46
+ with(:body => {"access_token"=>"AT"}).
47
+ to_return(:status => 200, :body => "", :headers => {})
48
+
49
+ client.post("/media/123/likes", {}, signature=false)
50
+ a_request(:post, url).
51
+ with(:headers => {'X-Insta-Forwarded-For'=> @signed_header}).
52
+ should_not have_been_made
53
+ end
54
+ end
55
+ end
56
+ end
metadata CHANGED
@@ -1,15 +1,29 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: instagram
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.0.0
4
+ version: 1.1.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Shayne Sweeney
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2014-04-23 00:00:00.000000000 Z
11
+ date: 2014-06-03 00:00:00.000000000 Z
12
12
  dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: rake
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - ~>
18
+ - !ruby/object:Gem::Version
19
+ version: 0.9.2.2
20
+ type: :development
21
+ prerelease: false
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - ~>
25
+ - !ruby/object:Gem::Version
26
+ version: 0.9.2.2
13
27
  - !ruby/object:Gem::Dependency
14
28
  name: rspec
15
29
  requirement: !ruby/object:Gem::Requirement
@@ -135,6 +149,7 @@ extra_rdoc_files: []
135
149
  files:
136
150
  - .gitignore
137
151
  - .rspec
152
+ - .travis.yml
138
153
  - .yardopts
139
154
  - Gemfile
140
155
  - LICENSE.md
@@ -215,21 +230,55 @@ files:
215
230
  - spec/instagram/client/tags_spec.rb
216
231
  - spec/instagram/client/users_spec.rb
217
232
  - spec/instagram/client_spec.rb
233
+ - spec/instagram/request_spec.rb
218
234
  - spec/instagram_spec.rb
219
235
  - spec/spec_helper.rb
220
236
  homepage: https://github.com/Instagram/instagram-ruby-gem
221
237
  licenses: []
222
238
  metadata: {}
223
- post_install_message: ! "********************************************************************************\n\nInstagram
224
- REST and Search APIs\n------------------------------\nOur developer site documents
225
- all the Instagram REST and Search APIs.\n(http://instagram.com/developer)\n\nBlog\n----------------------------\nThe
226
- Developer Blog features news and important announcements about the Instagram Platform.
227
- \nYou will also find tutorials and best practices to help you build great platform
228
- integrations.\nMake sure to subscribe to the RSS feed so you don't miss out on new
229
- posts: \n(http://developers.instagram.com).\n\nCommunity\n----------------------\nThe
230
- Stack Overflow community is a great place to ask API related questions or if you
231
- need help with your code.\nMake sure to tag your questions with the Instagram tag
232
- to get fast answers from other fellow developers and members of the Instagram team.\n(http://stackoverflow.com/questions/tagged/instagram/)\n\n********************************************************************************\n"
239
+ post_install_message: ! '********************************************************************************
240
+
241
+
242
+ Instagram REST and Search APIs
243
+
244
+ ------------------------------
245
+
246
+ Our developer site documents all the Instagram REST and Search APIs.
247
+
248
+ (http://instagram.com/developer)
249
+
250
+
251
+ Blog
252
+
253
+ ----------------------------
254
+
255
+ The Developer Blog features news and important announcements about the Instagram
256
+ Platform.
257
+
258
+ You will also find tutorials and best practices to help you build great platform
259
+ integrations.
260
+
261
+ Make sure to subscribe to the RSS feed so you don''t miss out on new posts:
262
+
263
+ (http://developers.instagram.com).
264
+
265
+
266
+ Community
267
+
268
+ ----------------------
269
+
270
+ The Stack Overflow community is a great place to ask API related questions or if
271
+ you need help with your code.
272
+
273
+ Make sure to tag your questions with the Instagram tag to get fast answers from
274
+ other fellow developers and members of the Instagram team.
275
+
276
+ (http://stackoverflow.com/questions/tagged/instagram/)
277
+
278
+
279
+ ********************************************************************************
280
+
281
+ '
233
282
  rdoc_options: []
234
283
  require_paths:
235
284
  - lib
@@ -301,6 +350,7 @@ test_files:
301
350
  - spec/instagram/client/tags_spec.rb
302
351
  - spec/instagram/client/users_spec.rb
303
352
  - spec/instagram/client_spec.rb
353
+ - spec/instagram/request_spec.rb
304
354
  - spec/instagram_spec.rb
305
355
  - spec/spec_helper.rb
306
356
  has_rdoc: