instagram 1.1.3 → 1.1.4
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.
- 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
|