instagram-continued 1.3.0 → 1.3.1
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 +4 -4
- data/.rubocop.yml +11 -0
- data/.travis.yml +1 -0
- data/README.md +1 -1
- data/Rakefile +12 -11
- data/instagram-continued.gemspec +6 -5
- data/lib/faraday/loud_logger.rb +47 -48
- data/lib/faraday/oauth2.rb +16 -18
- data/lib/faraday/raise_http_exception.rb +9 -9
- data/lib/instagram.rb +8 -8
- data/lib/instagram/api.rb +4 -4
- data/lib/instagram/client.rb +1 -1
- data/lib/instagram/client/comments.rb +5 -5
- data/lib/instagram/client/embedding.rb +9 -9
- data/lib/instagram/client/likes.rb +5 -5
- data/lib/instagram/client/locations.rb +4 -4
- data/lib/instagram/client/media.rb +3 -3
- data/lib/instagram/client/subscriptions.rb +27 -27
- data/lib/instagram/client/tags.rb +3 -3
- data/lib/instagram/client/users.rb +19 -19
- data/lib/instagram/client/utils.rb +5 -5
- data/lib/instagram/configuration.rb +7 -6
- data/lib/instagram/connection.rb +7 -7
- data/lib/instagram/oauth.rb +8 -8
- data/lib/instagram/request.rb +23 -26
- data/lib/instagram/response.rb +8 -4
- data/lib/instagram/version.rb +1 -1
- data/spec/faraday/response_spec.rb +23 -25
- data/spec/instagram/api_spec.rb +90 -94
- data/spec/instagram/client/comments_spec.rb +21 -25
- data/spec/instagram/client/embedding_spec.rb +8 -8
- data/spec/instagram/client/geography_spec.rb +10 -13
- data/spec/instagram/client/likes_spec.rb +21 -25
- data/spec/instagram/client/locations_spec.rb +42 -48
- data/spec/instagram/client/media_spec.rb +33 -37
- data/spec/instagram/client/subscriptions_spec.rb +34 -46
- data/spec/instagram/client/tags_spec.rb +29 -33
- data/spec/instagram/client/users_spec.rb +155 -180
- data/spec/instagram/client/utils_spec.rb +8 -9
- data/spec/instagram/client_spec.rb +9 -9
- data/spec/instagram/request_spec.rb +27 -27
- data/spec/instagram_spec.rb +20 -24
- data/spec/spec_helper.rb +10 -10
- metadata +24 -9
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 2cffa2f9ed95f70c0a1cc4d47a530460810384ec
|
4
|
+
data.tar.gz: b0f80fe802d90b61b8ead906dc227f3cc23b70da
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: e384994413ba6a1c0cca8d7d536254e5f582c73003c0692d4a949d32171c19b7c84a50ad75ab9bc7db4c13e6a25836135a2997275e00962fe8dbd3c44178af1e
|
7
|
+
data.tar.gz: 97a873844d5d5f2f1c107ecea2399c8c1586b8e0276d3541fb89a302fb9a830a8c00d799d78677a7e0150ab18fd7c3da5573498937232b9da36459912d5084aa
|
data/.rubocop.yml
ADDED
@@ -0,0 +1,11 @@
|
|
1
|
+
Style/StringLiterals:
|
2
|
+
EnforcedStyle: double_quotes
|
3
|
+
Style/StringLiteralsInInterpolation:
|
4
|
+
EnforcedStyle: double_quotes
|
5
|
+
Metrics/LineLength:
|
6
|
+
Max: 100
|
7
|
+
Style/TrailingCommaInLiteral:
|
8
|
+
EnforcedStyleForMultiline: comma
|
9
|
+
SupportedStyles:
|
10
|
+
- comma
|
11
|
+
- no_comma
|
data/.travis.yml
CHANGED
data/README.md
CHANGED
@@ -1,6 +1,6 @@
|
|
1
1
|
# Instagram-Continued
|
2
2
|
|
3
|
-
[](https://badge.fury.io/rb/instagram-continued) [](https://badge.fury.io/rb/instagram-continued) [](https://travis-ci.org/icco/instagram-continued)
|
4
4
|
|
5
5
|
[](https://gemnasium.com/github.com/icco/instagram-continued)
|
6
6
|
|
data/Rakefile
CHANGED
@@ -1,26 +1,27 @@
|
|
1
|
-
require
|
1
|
+
require "bundler"
|
2
2
|
Bundler::GemHelper.install_tasks
|
3
3
|
|
4
|
-
require
|
4
|
+
require "rspec/core/rake_task"
|
5
5
|
RSpec::Core::RakeTask.new(:spec)
|
6
6
|
|
7
|
-
task :
|
7
|
+
task default: :spec
|
8
|
+
task test: :spec
|
8
9
|
|
9
10
|
namespace :doc do
|
10
11
|
begin
|
11
|
-
require
|
12
|
+
require "yard"
|
12
13
|
rescue LoadError
|
13
14
|
# ignore
|
14
15
|
else
|
15
16
|
YARD::Rake::YardocTask.new do |task|
|
16
|
-
task.files = [
|
17
|
+
task.files = ["HISTORY.mkd", "LICENSE.mkd", "lib/**/*.rb"]
|
17
18
|
task.options = [
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
|
19
|
+
"--protected",
|
20
|
+
"--output-dir", "doc/yard",
|
21
|
+
"--tag", "format:Supported formats",
|
22
|
+
"--tag", "authenticated:Requires Authentication",
|
23
|
+
"--tag", "rate_limited:Rate Limited",
|
24
|
+
"--markup", "markdown"
|
24
25
|
]
|
25
26
|
end
|
26
27
|
end
|
data/instagram-continued.gemspec
CHANGED
@@ -6,16 +6,17 @@ Gem::Specification.new do |s|
|
|
6
6
|
s.add_development_dependency("rspec", "~> 3.4")
|
7
7
|
s.add_development_dependency("webmock", "~> 1.22")
|
8
8
|
s.add_development_dependency("bluecloth", "~> 2.2")
|
9
|
+
s.add_development_dependency("rubocop")
|
9
10
|
|
10
11
|
s.add_runtime_dependency("faraday", "~> 0.11")
|
11
12
|
s.add_runtime_dependency("faraday_middleware")
|
12
|
-
s.add_runtime_dependency("multi_json"
|
13
|
-
s.add_runtime_dependency("hashie"
|
13
|
+
s.add_runtime_dependency("multi_json")
|
14
|
+
s.add_runtime_dependency("hashie")
|
14
15
|
|
15
16
|
s.authors = ["Shayne Sweeney", "Nat Welch"]
|
16
|
-
s.description =
|
17
|
+
s.description = "A Ruby wrapper for the Instagram REST and Search APIs"
|
17
18
|
s.email = ["shayne@instagr.am", "nat@natwelch.com"]
|
18
|
-
s.executables = `git ls-files -- bin/*`.split("\n").map{ |f| File.basename(f) }
|
19
|
+
s.executables = `git ls-files -- bin/*`.split("\n").map { |f| File.basename(f) }
|
19
20
|
s.files = `git ls-files`.split("\n")
|
20
21
|
s.homepage = "https://github.com/icco/instagram-continued"
|
21
22
|
s.name = "instagram-continued"
|
@@ -24,7 +25,7 @@ Gem::Specification.new do |s|
|
|
24
25
|
s.required_rubygems_version = Gem::Requirement.new(">= 1.3.6")
|
25
26
|
s.required_ruby_version = Gem::Requirement.new(">= 2.0.0")
|
26
27
|
s.rubyforge_project = s.name
|
27
|
-
s.summary =
|
28
|
+
s.summary = "Ruby wrapper for the Instagram API"
|
28
29
|
s.test_files = `git ls-files -- {test,spec,features}/*`.split("\n")
|
29
30
|
s.version = Instagram::VERSION.dup
|
30
31
|
end
|
data/lib/faraday/loud_logger.rb
CHANGED
@@ -1,61 +1,61 @@
|
|
1
|
-
require
|
1
|
+
require "faraday"
|
2
2
|
|
3
3
|
# @private
|
4
4
|
module FaradayMiddleware
|
5
5
|
# @private
|
6
6
|
class LoudLogger < Faraday::Middleware
|
7
|
-
|
8
|
-
|
7
|
+
extend Forwardable
|
8
|
+
def_delegators :@logger, :debug, :info, :warn, :error, :fatal
|
9
9
|
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
}
|
10
|
+
def initialize(app, options = {})
|
11
|
+
@app = app
|
12
|
+
@logger = options.fetch(:logger) do
|
13
|
+
require "logger"
|
14
|
+
::Logger.new($stdout)
|
16
15
|
end
|
16
|
+
end
|
17
17
|
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
|
24
|
-
|
25
|
-
|
26
|
-
|
27
|
-
end
|
18
|
+
def call(env)
|
19
|
+
start_time = Time.now
|
20
|
+
info { request_info(env) }
|
21
|
+
debug { request_debug(env) }
|
22
|
+
@app.call(env).on_complete do
|
23
|
+
end_time = Time.now
|
24
|
+
response_time = end_time - start_time
|
25
|
+
info { response_info(env, response_time) }
|
26
|
+
debug { response_debug(env) }
|
28
27
|
end
|
28
|
+
end
|
29
29
|
|
30
|
-
|
30
|
+
private
|
31
31
|
|
32
|
-
|
33
|
-
|
34
|
-
|
35
|
-
|
36
|
-
|
37
|
-
|
38
|
-
end
|
32
|
+
def filter(output)
|
33
|
+
if ENV["INSTAGRAM_GEM_REDACT"]
|
34
|
+
output = output.to_s.gsub(/client_id=[a-zA-Z0-9]*/, "client_id=[CLIENT-ID]")
|
35
|
+
output = output.to_s.gsub(/access_token=[a-zA-Z0-9]*/, "access_token=[ACCESS-TOKEN]")
|
36
|
+
else
|
37
|
+
output
|
39
38
|
end
|
39
|
+
end
|
40
40
|
|
41
|
-
|
42
|
-
|
43
|
-
|
41
|
+
def request_info(env)
|
42
|
+
"Started %s request to: %s" % [env[:method].to_s.upcase, filter(env[:url])]
|
43
|
+
end
|
44
44
|
|
45
|
-
|
46
|
-
|
47
|
-
|
45
|
+
def response_info(env, response_time)
|
46
|
+
"Response from %s; Status: %d; Time: %.1fms" % [filter(env[:url]), env[:status], (response_time * 1_000.0)]
|
47
|
+
end
|
48
48
|
|
49
|
-
|
50
|
-
|
51
|
-
|
49
|
+
def request_debug(env)
|
50
|
+
debug_message("Request", env[:request_headers], env[:body])
|
51
|
+
end
|
52
52
|
|
53
|
-
|
54
|
-
|
55
|
-
|
53
|
+
def response_debug(env)
|
54
|
+
debug_message("Response", env[:response_headers], env[:body])
|
55
|
+
end
|
56
56
|
|
57
|
-
|
58
|
-
|
57
|
+
def debug_message(name, headers, body)
|
58
|
+
<<-MESSAGE.gsub(/^ +([^ ])/m, '\\1')
|
59
59
|
#{name} Headers:
|
60
60
|
----------------
|
61
61
|
#{format_headers(headers)}
|
@@ -64,12 +64,11 @@ module FaradayMiddleware
|
|
64
64
|
-------------
|
65
65
|
#{filter(body)}
|
66
66
|
MESSAGE
|
67
|
-
|
68
|
-
|
69
|
-
def format_headers(headers)
|
70
|
-
length = headers.map {|k,v| k.to_s.size }.max
|
71
|
-
headers.map { |name, value| "#{name.to_s.ljust(length)} : #{filter(value)}" }.join("\n")
|
72
|
-
end
|
67
|
+
end
|
73
68
|
|
69
|
+
def format_headers(headers)
|
70
|
+
length = headers.map { |k, _v| k.to_s.size }.max
|
71
|
+
headers.map { |name, value| "#{name.to_s.ljust(length)} : #{filter(value)}" }.join("\n")
|
72
|
+
end
|
74
73
|
end
|
75
|
-
end
|
74
|
+
end
|
data/lib/faraday/oauth2.rb
CHANGED
@@ -1,39 +1,37 @@
|
|
1
|
-
require
|
1
|
+
require "faraday"
|
2
2
|
|
3
3
|
# @private
|
4
4
|
module FaradayMiddleware
|
5
5
|
# @private
|
6
6
|
class InstagramOAuth2 < Faraday::Middleware
|
7
7
|
def call(env)
|
8
|
+
if (env[:method] == :get) || (env[:method] == :delete)
|
9
|
+
query = if env[:url].query.nil?
|
10
|
+
{}
|
11
|
+
else
|
12
|
+
Faraday::Utils.parse_query(env[:url].query)
|
13
|
+
end
|
8
14
|
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
else
|
13
|
-
query = Faraday::Utils.parse_query(env[:url].query)
|
14
|
-
end
|
15
|
-
|
16
|
-
if @access_token and not query["client_secret"]
|
17
|
-
env[:url].query = Faraday::Utils.build_query(query.merge(:access_token => @access_token))
|
18
|
-
env[:request_headers] = env[:request_headers].merge('Authorization' => "Token token=\"#{@access_token}\"")
|
15
|
+
if @access_token && !(query["client_secret"])
|
16
|
+
env[:url].query = Faraday::Utils.build_query(query.merge(access_token: @access_token))
|
17
|
+
env[:request_headers] = env[:request_headers].merge("Authorization" => "Token token=\"#{@access_token}\"")
|
19
18
|
elsif @client_id
|
20
|
-
env[:url].query = Faraday::Utils.build_query(query.merge(:
|
19
|
+
env[:url].query = Faraday::Utils.build_query(query.merge(client_id: @client_id))
|
21
20
|
end
|
22
21
|
else
|
23
|
-
if @access_token
|
22
|
+
if @access_token && !(env[:body] && env[:body][:client_secret])
|
24
23
|
env[:body] = {} if env[:body].nil?
|
25
|
-
env[:body] = env[:body].merge(:
|
26
|
-
env[:request_headers] = env[:request_headers].merge(
|
24
|
+
env[:body] = env[:body].merge(access_token: @access_token)
|
25
|
+
env[:request_headers] = env[:request_headers].merge("Authorization" => "Token token=\"#{@access_token}\"")
|
27
26
|
elsif @client_id
|
28
|
-
env[:body] = env[:body].merge(:
|
27
|
+
env[:body] = env[:body].merge(client_id: @client_id)
|
29
28
|
end
|
30
29
|
end
|
31
30
|
|
32
|
-
|
33
31
|
@app.call env
|
34
32
|
end
|
35
33
|
|
36
|
-
def initialize(app, client_id, access_token=nil)
|
34
|
+
def initialize(app, client_id, access_token = nil)
|
37
35
|
@app = app
|
38
36
|
@client_id = client_id
|
39
37
|
@access_token = access_token
|
@@ -1,4 +1,4 @@
|
|
1
|
-
require
|
1
|
+
require "faraday"
|
2
2
|
|
3
3
|
# @private
|
4
4
|
module FaradayMiddleware
|
@@ -35,27 +35,27 @@ module FaradayMiddleware
|
|
35
35
|
private
|
36
36
|
|
37
37
|
def error_message_400(response)
|
38
|
-
"#{response[:method].to_s.upcase} #{response[:url]
|
38
|
+
"#{response[:method].to_s.upcase} #{response[:url]}: #{response[:status]}#{error_body(response[:body])}"
|
39
39
|
end
|
40
40
|
|
41
41
|
def error_body(body)
|
42
42
|
# body gets passed as a string, not sure if it is passed as something else from other spots?
|
43
|
-
if
|
43
|
+
if !body.nil? && !body.empty? && body.is_a?(String)
|
44
44
|
# removed multi_json thanks to wesnolte's commit
|
45
45
|
body = ::JSON.parse(body)
|
46
46
|
end
|
47
47
|
|
48
48
|
if body.nil?
|
49
49
|
nil
|
50
|
-
elsif body[
|
51
|
-
": #{body[
|
52
|
-
elsif body[
|
53
|
-
": #{body[
|
50
|
+
elsif body["meta"] && body["meta"]["error_message"] && !body["meta"]["error_message"].empty?
|
51
|
+
": #{body["meta"]["error_message"]}"
|
52
|
+
elsif body["error_message"] && !body["error_message"].empty?
|
53
|
+
": #{body["error_type"]}: #{body["error_message"]}"
|
54
54
|
end
|
55
55
|
end
|
56
56
|
|
57
|
-
def error_message_500(response, body=nil)
|
58
|
-
"#{response[:method].to_s.upcase} #{response[:url]
|
57
|
+
def error_message_500(response, body = nil)
|
58
|
+
"#{response[:method].to_s.upcase} #{response[:url]}: #{[response[:status].to_s + ":", body].compact.join(" ")}"
|
59
59
|
end
|
60
60
|
end
|
61
61
|
end
|
data/lib/instagram.rb
CHANGED
@@ -1,8 +1,8 @@
|
|
1
|
-
require File.expand_path(
|
2
|
-
require File.expand_path(
|
3
|
-
require File.expand_path(
|
4
|
-
require File.expand_path(
|
5
|
-
require File.expand_path(
|
1
|
+
require File.expand_path("../instagram/error", __FILE__)
|
2
|
+
require File.expand_path("../instagram/configuration", __FILE__)
|
3
|
+
require File.expand_path("../instagram/api", __FILE__)
|
4
|
+
require File.expand_path("../instagram/client", __FILE__)
|
5
|
+
require File.expand_path("../instagram/response", __FILE__)
|
6
6
|
|
7
7
|
module Instagram
|
8
8
|
extend Configuration
|
@@ -10,7 +10,7 @@ module Instagram
|
|
10
10
|
# Alias for Instagram::Client.new
|
11
11
|
#
|
12
12
|
# @return [Instagram::Client]
|
13
|
-
def self.client(options={})
|
13
|
+
def self.client(options = {})
|
14
14
|
Instagram::Client.new(options)
|
15
15
|
end
|
16
16
|
|
@@ -21,7 +21,7 @@ module Instagram
|
|
21
21
|
end
|
22
22
|
|
23
23
|
# Delegate to Instagram::Client
|
24
|
-
def self.respond_to?(method, include_all=false)
|
25
|
-
|
24
|
+
def self.respond_to?(method, include_all = false)
|
25
|
+
client.respond_to?(method, include_all) || super
|
26
26
|
end
|
27
27
|
end
|
data/lib/instagram/api.rb
CHANGED
@@ -1,6 +1,6 @@
|
|
1
|
-
require File.expand_path(
|
2
|
-
require File.expand_path(
|
3
|
-
require File.expand_path(
|
1
|
+
require File.expand_path("../connection", __FILE__)
|
2
|
+
require File.expand_path("../request", __FILE__)
|
3
|
+
require File.expand_path("../oauth", __FILE__)
|
4
4
|
|
5
5
|
module Instagram
|
6
6
|
# @private
|
@@ -9,7 +9,7 @@ module Instagram
|
|
9
9
|
attr_accessor *Configuration::VALID_OPTIONS_KEYS
|
10
10
|
|
11
11
|
# Creates a new API
|
12
|
-
def initialize(options={})
|
12
|
+
def initialize(options = {})
|
13
13
|
options = Instagram.options.merge(options)
|
14
14
|
Configuration::VALID_OPTIONS_KEYS.each do |key|
|
15
15
|
send("#{key}=", options[key])
|
data/lib/instagram/client.rb
CHANGED
@@ -4,7 +4,7 @@ module Instagram
|
|
4
4
|
# @note All methods have been separated into modules and follow the same grouping used in http://instagram.com/developer/
|
5
5
|
# @see http://instagram.com/developer/
|
6
6
|
class Client < API
|
7
|
-
Dir[File.expand_path(
|
7
|
+
Dir[File.expand_path("../client/*.rb", __FILE__)].each { |f| require f }
|
8
8
|
|
9
9
|
include Instagram::Client::Utils
|
10
10
|
|
@@ -15,7 +15,7 @@ module Instagram
|
|
15
15
|
# If getting this data of a protected user, you must be authenticated (and be allowed to see that user).
|
16
16
|
# @rate_limited true
|
17
17
|
# @see http://instagram.com/developer/endpoints/comments/#get_media_comments
|
18
|
-
def media_comments(id, *
|
18
|
+
def media_comments(id, *_args)
|
19
19
|
response = get("media/#{id}/comments")
|
20
20
|
response
|
21
21
|
end
|
@@ -34,8 +34,8 @@ module Instagram
|
|
34
34
|
# If getting this data of a protected user, you must be authenticated (and be allowed to see that user).
|
35
35
|
# @rate_limited true
|
36
36
|
# @see http://instagram.com/developer/endpoints/comments/#post_media_comments
|
37
|
-
def create_media_comment(id, text, options={})
|
38
|
-
response = post("media/#{id}/comments", options.merge(:
|
37
|
+
def create_media_comment(id, text, options = {})
|
38
|
+
response = post("media/#{id}/comments", options.merge(text: text), signature = true)
|
39
39
|
response
|
40
40
|
end
|
41
41
|
|
@@ -53,8 +53,8 @@ module Instagram
|
|
53
53
|
# In order to remove a comment, you must be the owner of the comment, the media item, or both.
|
54
54
|
# @rate_limited true
|
55
55
|
# @see http://instagram.com/developer/endpoints/comments/#delete_media_comments
|
56
|
-
def delete_media_comment(media_id, comment_id, options={})
|
57
|
-
response = delete("media/#{media_id}/comments/#{comment_id}", options, signature=true)
|
56
|
+
def delete_media_comment(media_id, comment_id, options = {})
|
57
|
+
response = delete("media/#{media_id}/comments/#{comment_id}", options, signature = true)
|
58
58
|
response
|
59
59
|
end
|
60
60
|
end
|
@@ -1,16 +1,16 @@
|
|
1
1
|
module Instagram
|
2
2
|
class Client
|
3
|
-
|
3
|
+
# Defines methods related to embedding
|
4
4
|
module Embedding
|
5
|
-
|
5
|
+
# Returns information about the media associated with the given short link
|
6
6
|
#
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
|
7
|
+
# @overload oembed(url=nil, options={})
|
8
|
+
# @param url [String] An instagram short link
|
9
|
+
# @param options [Hash] A customizable set of options
|
10
|
+
# @option options [Integer] :maxheight Maximum height of returned media
|
11
|
+
# @option options [Integer] :maxwidth Maximum width of returned media
|
12
|
+
# @option options [Integer] :callback A JSON callback to be invoked
|
13
|
+
# @return [Hashie::Mash] Information about the media associated with given short link
|
14
14
|
# @example Return information about the media associated with http://instagr.am/p/BUG/
|
15
15
|
# Instagram.oembed(http://instagr.am/p/BUG/)
|
16
16
|
#
|