instagram 1.1.3 → 1.1.4
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +8 -8
- data/README.md +1 -1
- data/instagram.gemspec +1 -1
- data/lib/instagram/client/locations.rb +1 -0
- data/lib/instagram/client/media.rb +19 -0
- data/lib/instagram/client/subscriptions.rb +2 -4
- data/lib/instagram/client/tags.rb +3 -3
- data/lib/instagram/request.rb +6 -5
- data/lib/instagram/response.rb +8 -3
- data/lib/instagram/version.rb +1 -1
- data/spec/fixtures/media_shortcode.json +1 -0
- data/spec/instagram/client/media_spec.rb +21 -0
- data/spec/instagram/client/subscriptions_spec.rb +23 -0
- metadata +6 -4
checksums.yaml
CHANGED
@@ -1,15 +1,15 @@
|
|
1
1
|
---
|
2
2
|
!binary "U0hBMQ==":
|
3
3
|
metadata.gz: !binary |-
|
4
|
-
|
4
|
+
M2Y3MDRiMGZmYTMzMzk1MDVkYTc3MGRjYTBjNWM5ZjFhMjY5NDA4Zg==
|
5
5
|
data.tar.gz: !binary |-
|
6
|
-
|
6
|
+
ZTY4N2RkYzBmYTdkNWZlM2ExNTgzN2FjNzhmYWQ5OGU3YjA0M2JiYg==
|
7
7
|
SHA512:
|
8
8
|
metadata.gz: !binary |-
|
9
|
-
|
10
|
-
|
11
|
-
|
9
|
+
NjY2Nzg2MjM1YmIwYTM5MDVjYzRiMmZlNDdlNDY1YWFlYzZhN2ExMWE2NDZm
|
10
|
+
NTI0NzIxNDkxMTNiMWIxYWMyZGMzZjE1ZGYxOWM2YWQ1MGQ3ZWEwMzJmZWU3
|
11
|
+
NjJmMGEzMWY5YTUyZGQwOGIxZGIyOWZmNDk0ZjhiMDU3N2QwYjY=
|
12
12
|
data.tar.gz: !binary |-
|
13
|
-
|
14
|
-
|
15
|
-
|
13
|
+
ZmZhOTBhYTRiODQ1ZjE5ODZjM2RlN2IwYzBjMWM5NDUxMGQwYmM5MmQ3YWEx
|
14
|
+
YjQ5YzRjMTFjODUxOTVmNGE0ZGMyMDNjNzVlMWY0NmNlYTAzYjM2MzBhY2Vi
|
15
|
+
ODE3YTljY2ViYjdiZmZlNzRjNGM0YmUwMmRhZWE3MTAzYTcwYjc=
|
data/README.md
CHANGED
@@ -250,5 +250,5 @@ Complete your CLA here: [https://code.facebook.com/cla](https://code.facebook.co
|
|
250
250
|
Copyright
|
251
251
|
---------
|
252
252
|
Copyright (c) 2014, Facebook, Inc. All rights reserved.
|
253
|
-
By contributing to
|
253
|
+
By contributing to Instagram Ruby Gem, you agree that your contributions will be licensed under its BSD license.
|
254
254
|
See [LICENSE](https://github.com/Instagram/instagram-ruby-gem/blob/master/LICENSE.md) for details.
|
data/instagram.gemspec
CHANGED
@@ -5,7 +5,7 @@ Gem::Specification.new do |s|
|
|
5
5
|
s.add_development_dependency('rake', '~> 0.9.2.2')
|
6
6
|
s.add_development_dependency('rspec', '~> 2.4')
|
7
7
|
s.add_development_dependency('webmock', '~> 1.6')
|
8
|
-
s.add_development_dependency('bluecloth', '~> 2.0
|
8
|
+
s.add_development_dependency('bluecloth', '~> 2.2.0')
|
9
9
|
s.add_runtime_dependency('faraday', ['>= 0.7', '< 0.10'])
|
10
10
|
s.add_runtime_dependency('faraday_middleware', ['>= 0.8', '< 0.10'])
|
11
11
|
s.add_runtime_dependency('multi_json', '>= 1.0.3', '~> 1.0')
|
@@ -23,6 +23,7 @@ module Instagram
|
|
23
23
|
# @overload location_recent_media(id, options={})
|
24
24
|
# @param user [Integer] An Instagram location ID.
|
25
25
|
# @param options [Hash] A customizable set of options.
|
26
|
+
# @option options [Integer] :max_timestamp (nil) Return media before this UNIX timestamp
|
26
27
|
# @option options [Integer] :max_id (nil) Returns results with an ID less than (that is, older than) or equal to the specified ID.
|
27
28
|
# @option options [Integer] :count (nil) Limits the number of results returned per page.
|
28
29
|
# @return [Hashie::Mash]
|
@@ -21,6 +21,25 @@ module Instagram
|
|
21
21
|
response
|
22
22
|
end
|
23
23
|
|
24
|
+
# Returns extended information of a given media item
|
25
|
+
#
|
26
|
+
# @overload media_shortcode(shortcode)
|
27
|
+
# @param shortcode [String] An Instagram media item shortcode
|
28
|
+
# @return [Hashie::Mash] The requested media item.
|
29
|
+
# @example Return extended information for media item with shortcode 'D'
|
30
|
+
# Instagram.media_shortcode('D')
|
31
|
+
# @format none
|
32
|
+
# @authenticated false unless requesting media from a protected user
|
33
|
+
#
|
34
|
+
# If getting this data of a protected user, you must authenticate (and be allowed to see that user).
|
35
|
+
# @rate_limited true
|
36
|
+
# @see http://instagram.com/developer/endpoints/media/#get_media_by_shortcode
|
37
|
+
def media_shortcode(*args)
|
38
|
+
shortcode = args.first
|
39
|
+
response = get("media/shortcode/#{shortcode}", {}, false, false, true)
|
40
|
+
response
|
41
|
+
end
|
42
|
+
|
24
43
|
# Returns a list of the overall most popular media
|
25
44
|
#
|
26
45
|
# @overload media_popular(options={})
|
@@ -126,7 +126,7 @@ module Instagram
|
|
126
126
|
end
|
127
127
|
|
128
128
|
# Public: As a security measure, all updates from Instagram are signed using
|
129
|
-
# X-Hub-Signature:
|
129
|
+
# X-Hub-Signature: XXXX where XXX is the sha1 of the json payload
|
130
130
|
# using your application secret as the key.
|
131
131
|
#
|
132
132
|
# Example:
|
@@ -143,9 +143,7 @@ module Instagram
|
|
143
143
|
raise ArgumentError, "client_secret must be set during configure"
|
144
144
|
end
|
145
145
|
|
146
|
-
if request_signature = headers['X-Hub-Signature'] || headers['HTTP_X_HUB_SIGNATURE']
|
147
|
-
signature_parts = request_signature.split('sha1=')
|
148
|
-
request_signature = signature_parts[1]
|
146
|
+
if request_signature = headers['X-Hub-Signature'] || headers['HTTP_X_HUB_SIGNATURE']
|
149
147
|
calculated_signature = OpenSSL::HMAC.hexdigest('sha1', client_secret, body)
|
150
148
|
calculated_signature == request_signature
|
151
149
|
end
|
@@ -23,12 +23,12 @@ module Instagram
|
|
23
23
|
# @overload tag_recent_media(tag, options={})
|
24
24
|
# @param tag-name [String] An Instagram tag name.
|
25
25
|
# @param options [Hash] A customizable set of options.
|
26
|
-
# @option options [Integer] :
|
27
|
-
# @option options [Integer] :
|
26
|
+
# @option options [Integer] :max_tag_id (nil) Returns results with an ID less than (that is, older than) or equal to the specified ID. The value can be retrieved from the returned response via pagination.max_tag_id.
|
27
|
+
# @option options [Integer] :min_tag_id (nil) Returns results with an ID greater than (that is, newer than) or equal to the specified ID. The value can be retrieved from the returned response via pagination.min_tag_id.
|
28
28
|
# @return [Hashie::Mash]
|
29
29
|
# @example Return a list of the most recent media items tagged "cat"
|
30
30
|
# Instagram.tag_recent_media('cat')
|
31
|
-
# @see
|
31
|
+
# @see https://instagram.com/developer/endpoints/tags/#get_tags_media_recent
|
32
32
|
# @format :json
|
33
33
|
# @authenticated false
|
34
34
|
# @rate_limited true
|
data/lib/instagram/request.rb
CHANGED
@@ -5,22 +5,22 @@ module Instagram
|
|
5
5
|
# Defines HTTP request methods
|
6
6
|
module Request
|
7
7
|
# Perform an HTTP GET request
|
8
|
-
def get(path, options={}, signature=false, raw=false, unformatted=false, no_response_wrapper=no_response_wrapper)
|
8
|
+
def get(path, options={}, signature=false, raw=false, unformatted=false, no_response_wrapper=no_response_wrapper())
|
9
9
|
request(:get, path, options, signature, raw, unformatted, no_response_wrapper)
|
10
10
|
end
|
11
11
|
|
12
12
|
# Perform an HTTP POST request
|
13
|
-
def post(path, options={}, signature=false, raw=false, unformatted=false, no_response_wrapper=no_response_wrapper)
|
13
|
+
def post(path, options={}, signature=false, raw=false, unformatted=false, no_response_wrapper=no_response_wrapper())
|
14
14
|
request(:post, path, options, signature, raw, unformatted, no_response_wrapper)
|
15
15
|
end
|
16
16
|
|
17
17
|
# Perform an HTTP PUT request
|
18
|
-
def put(path, options={}, signature=false, raw=false, unformatted=false, no_response_wrapper=no_response_wrapper)
|
18
|
+
def put(path, options={}, signature=false, raw=false, unformatted=false, no_response_wrapper=no_response_wrapper())
|
19
19
|
request(:put, path, options, signature, raw, unformatted, no_response_wrapper)
|
20
20
|
end
|
21
21
|
|
22
22
|
# Perform an HTTP DELETE request
|
23
|
-
def delete(path, options={}, signature=false, raw=false, unformatted=false, no_response_wrapper=no_response_wrapper)
|
23
|
+
def delete(path, options={}, signature=false, raw=false, unformatted=false, no_response_wrapper=no_response_wrapper())
|
24
24
|
request(:delete, path, options, signature, raw, unformatted, no_response_wrapper)
|
25
25
|
end
|
26
26
|
|
@@ -43,7 +43,8 @@ module Instagram
|
|
43
43
|
end
|
44
44
|
return response if raw
|
45
45
|
return response.body if no_response_wrapper
|
46
|
-
return Response.create( response.body
|
46
|
+
return Response.create( response.body, {:limit => response.headers['x-ratelimit-limit'].to_i,
|
47
|
+
:remaining => response.headers['x-ratelimit-remaining'].to_i} )
|
47
48
|
end
|
48
49
|
|
49
50
|
def formatted_path(path)
|
data/lib/instagram/response.rb
CHANGED
@@ -1,16 +1,21 @@
|
|
1
1
|
module Instagram
|
2
2
|
module Response
|
3
|
-
def self.create( response_hash )
|
3
|
+
def self.create( response_hash, ratelimit_hash )
|
4
4
|
data = response_hash.data.dup rescue response_hash
|
5
5
|
data.extend( self )
|
6
6
|
data.instance_exec do
|
7
|
-
|
8
|
-
|
7
|
+
%w{pagination meta}.each do |k|
|
8
|
+
response_hash.public_send(k).tap do |v|
|
9
|
+
instance_variable_set("@#{k}", v) if v
|
10
|
+
end
|
11
|
+
end
|
12
|
+
ratelimit = ::Hashie::Mash.new(ratelimit_hash)
|
9
13
|
end
|
10
14
|
data
|
11
15
|
end
|
12
16
|
|
13
17
|
attr_reader :pagination
|
14
18
|
attr_reader :meta
|
19
|
+
attr_reader :ratelimit
|
15
20
|
end
|
16
21
|
end
|
data/lib/instagram/version.rb
CHANGED
@@ -0,0 +1 @@
|
|
1
|
+
{"meta":{"code":200},"data":{"attribution":null,"tags":["youknowitslate"],"type":"image","location":null,"comments":{"count":3,"data":[{"created_time":"1295535132","text":"Nice","from":{"username":"newyorkcity","profile_picture":"http:\/\/images.ak.instagram.com\/profiles\/profile_1483611_75sq_1391632115.jpg","id":"1483611","full_name":"newyorkcity"},"id":"20808205"},{"created_time":"1295549402","text":"I hope you guys got some good work done :)","from":{"username":"abelnation","profile_picture":"http:\/\/images.ak.instagram.com\/profiles\/profile_5315_75sq_1391467051.jpg","id":"5315","full_name":"Abel Allison"},"id":"20873301"},{"created_time":"1295556861","text":"Hey do you follow @docpop ?Him, and his friend, made a pretty awesome Instagram Scarf.","from":{"username":"jasonsposa","profile_picture":"http:\/\/photos-c.ak.instagram.com\/hphotos-ak-xaf1\/10616446_1460074390927282_1108706618_a.jpg","id":"102516","full_name":"jason"},"id":"20900554"}]},"filter":"X-Pro II","created_time":"1295525094","link":"http:\/\/instagram.com\/p\/BG9It\/","likes":{"count":52,"data":[{"username":"bailey","profile_picture":"http:\/\/images.ak.instagram.com\/profiles\/profile_120_75sq_1328690799.jpg","id":"120","full_name":"Bailey Siewert"},{"username":"bill","profile_picture":"http:\/\/photos-h.ak.instagram.com\/hphotos-ak-xfa1\/10597268_695384913848791_1949499102_a.jpg","id":"34","full_name":"Bill Bogenschutz"},{"username":"juss0445","profile_picture":"http:\/\/images.ak.instagram.com\/profiles\/profile_1416773_75sq_1296220025.jpg","id":"1416773","full_name":"juss0445"},{"username":"mimidea","profile_picture":"http:\/\/images.ak.instagram.com\/profiles\/profile_1133519_75sq_1361436617.jpg","id":"1133519","full_name":"mimi\ud83d\udc95"}]},"images":{"low_resolution":{"url":"http:\/\/scontent-a.cdninstagram.com\/hphotos-xfa1\/outbound-distillery\/t0.0-17\/OBPTH\/media\/2011\/01\/20\/6248835b0acd48d39d7ee606937ae9f7_6.jpg","width":306,"height":306},"thumbnail":{"url":"http:\/\/scontent-a.cdninstagram.com\/hphotos-xfa1\/outbound-distillery\/t0.0-17\/OBPTH\/media\/2011\/01\/20\/6248835b0acd48d39d7ee606937ae9f7_5.jpg","width":150,"height":150},"standard_resolution":{"url":"http:\/\/scontent-a.cdninstagram.com\/hphotos-xfa1\/outbound-distillery\/t0.0-17\/OBPTH\/media\/2011\/01\/20\/6248835b0acd48d39d7ee606937ae9f7_7.jpg","width":612,"height":612}},"users_in_photo":[],"caption":{"created_time":"1295525094","text":"#youknowitslate when the cab driver wishes you good morning","from":{"username":"mikeyk","profile_picture":"http:\/\/images.ak.instagram.com\/profiles\/profile_4_75sq_1374110869.jpg","id":"4","full_name":"Mike Krieger"},"id":"20757161"},"user_has_liked":false,"id":"18600493_4","user":{"username":"mikeyk","website":"","profile_picture":"http:\/\/images.ak.instagram.com\/profiles\/profile_4_75sq_1374110869.jpg","full_name":"Mike Krieger","bio":"","id":"4"}}}
|
@@ -28,6 +28,27 @@ describe Instagram::Client do
|
|
28
28
|
end
|
29
29
|
end
|
30
30
|
|
31
|
+
describe ".media_shortcode" do
|
32
|
+
|
33
|
+
before do
|
34
|
+
stub_get('media/shortcode/BG9It').
|
35
|
+
with(:query => {:access_token => @client.access_token}).
|
36
|
+
to_return(:body => fixture("media_shortcode.#{format}"), :headers => {:content_type => "application/#{format}; charset=utf-8"})
|
37
|
+
end
|
38
|
+
|
39
|
+
it "should get the correct resource" do
|
40
|
+
@client.media_shortcode('BG9It')
|
41
|
+
a_get('media/shortcode/BG9It').
|
42
|
+
with(:query => {:access_token => @client.access_token}).
|
43
|
+
should have_been_made
|
44
|
+
end
|
45
|
+
|
46
|
+
it "should return extended information of a given media item" do
|
47
|
+
media = @client.media_shortcode('BG9It')
|
48
|
+
media.user.username.should == 'mikeyk'
|
49
|
+
end
|
50
|
+
end
|
51
|
+
|
31
52
|
describe ".media_popular" do
|
32
53
|
|
33
54
|
before do
|
@@ -67,6 +67,29 @@ describe Instagram::Client do
|
|
67
67
|
end
|
68
68
|
end
|
69
69
|
|
70
|
+
describe ".validate_update" do
|
71
|
+
|
72
|
+
subject { @client.validate_update(body, headers) }
|
73
|
+
|
74
|
+
context "when calculated signature matches request signature" do
|
75
|
+
|
76
|
+
let(:body) { {foo: "bar"}.to_json }
|
77
|
+
let(:request_signature) { OpenSSL::HMAC.hexdigest('sha1', @client.client_secret, body) }
|
78
|
+
let(:headers) { {"X-Hub-Signature" => request_signature} }
|
79
|
+
|
80
|
+
it { expect(subject).to be_true }
|
81
|
+
end
|
82
|
+
|
83
|
+
context "when calculated signature does not match request signature" do
|
84
|
+
|
85
|
+
let(:body) { {foo: "bar"}.to_json }
|
86
|
+
let(:request_signature) { "going to fail" }
|
87
|
+
let(:headers) { {"X-Hub-Signature" => request_signature} }
|
88
|
+
|
89
|
+
it { expect(subject).to be_false }
|
90
|
+
end
|
91
|
+
end
|
92
|
+
|
70
93
|
describe ".process_subscriptions" do
|
71
94
|
|
72
95
|
context "without a callbacks block" do
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: instagram
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 1.1.
|
4
|
+
version: 1.1.4
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Shayne Sweeney
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date:
|
11
|
+
date: 2015-03-16 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: rake
|
@@ -58,14 +58,14 @@ dependencies:
|
|
58
58
|
requirements:
|
59
59
|
- - ~>
|
60
60
|
- !ruby/object:Gem::Version
|
61
|
-
version: 2.0
|
61
|
+
version: 2.2.0
|
62
62
|
type: :development
|
63
63
|
prerelease: false
|
64
64
|
version_requirements: !ruby/object:Gem::Requirement
|
65
65
|
requirements:
|
66
66
|
- - ~>
|
67
67
|
- !ruby/object:Gem::Version
|
68
|
-
version: 2.0
|
68
|
+
version: 2.2.0
|
69
69
|
- !ruby/object:Gem::Dependency
|
70
70
|
name: faraday
|
71
71
|
requirement: !ruby/object:Gem::Requirement
|
@@ -201,6 +201,7 @@ files:
|
|
201
201
|
- spec/fixtures/media_likes.json
|
202
202
|
- spec/fixtures/media_popular.json
|
203
203
|
- spec/fixtures/media_search.json
|
204
|
+
- spec/fixtures/media_shortcode.json
|
204
205
|
- spec/fixtures/media_unliked.json
|
205
206
|
- spec/fixtures/mikeyk.json
|
206
207
|
- spec/fixtures/oembed.json
|
@@ -322,6 +323,7 @@ test_files:
|
|
322
323
|
- spec/fixtures/media_likes.json
|
323
324
|
- spec/fixtures/media_popular.json
|
324
325
|
- spec/fixtures/media_search.json
|
326
|
+
- spec/fixtures/media_shortcode.json
|
325
327
|
- spec/fixtures/media_unliked.json
|
326
328
|
- spec/fixtures/mikeyk.json
|
327
329
|
- spec/fixtures/oembed.json
|