embedly 1.7.1 → 1.8.0
Sign up to get free protection for your applications and to get access to all the features.
- data/ChangeLog +18 -0
- data/README.rdoc +1 -1
- data/Rakefile +3 -1
- data/VERSION +1 -1
- data/embedly.gemspec +6 -2
- data/lib/embedly/api.rb +11 -34
- data/lib/embedly/command_line.rb +2 -10
- data/lib/embedly/configuration.rb +52 -3
- data/lib/embedly/request.rb +3 -0
- data/lib/embedly/request/base.rb +50 -0
- data/lib/embedly/request/net_http.rb +27 -0
- data/lib/embedly/request/typhoeus.rb +25 -0
- data/spec/embedly/api_spec.rb +23 -0
- data/spec/embedly/command_line_spec.rb +8 -1
- data/spec/embedly/configuration_spec.rb +14 -0
- metadata +8 -2
data/ChangeLog
CHANGED
@@ -1,3 +1,21 @@
|
|
1
|
+
*embedly-1.8.0 (17 Jun 2013)
|
2
|
+
|
3
|
+
17 Jun 2013: Felipe Elias Philipp <felipeelias@gmail.com>
|
4
|
+
Abstracts http client to allow for custom requesters
|
5
|
+
|
6
|
+
17 Jun 2013: Nitesh <me@coffeebite.com>
|
7
|
+
Gets key from Embedly::Configuration
|
8
|
+
|
9
|
+
*embedly-1.7.0 (17 Jun 2013)
|
10
|
+
|
11
|
+
17 Jun 2013: Anton Dieterle <antondie@gmail.com>
|
12
|
+
Adds Net::HTTP::Proxy support
|
13
|
+
|
14
|
+
*embedly-1.6.0 (2 Apr 2013)
|
15
|
+
|
16
|
+
2 Apr 2013: Bob Corsaro <bob@embed.ly>
|
17
|
+
Adds extract endpoint
|
18
|
+
|
1
19
|
*embedly-1.5.6 (23 May 2012)
|
2
20
|
|
3
21
|
23 May 2012: Bob Corsaro <bob@embed.ly>
|
data/README.rdoc
CHANGED
data/Rakefile
CHANGED
data/VERSION
CHANGED
@@ -1 +1 @@
|
|
1
|
-
1.
|
1
|
+
1.8.0
|
data/embedly.gemspec
CHANGED
@@ -5,10 +5,10 @@
|
|
5
5
|
|
6
6
|
Gem::Specification.new do |s|
|
7
7
|
s.name = "embedly"
|
8
|
-
s.version = "1.
|
8
|
+
s.version = "1.8.0"
|
9
9
|
|
10
10
|
s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
|
11
|
-
s.authors = ["Bob Corsaro", "Felipe Elias Philipp", "Russ Bradberry", "Arun Thampi"]
|
11
|
+
s.authors = ["Bob Corsaro", "Felipe Elias Philipp", "Russ Bradberry", "Arun Thampi", "Anton Dieterle", "Nitesh"]
|
12
12
|
s.date = "2013-06-17"
|
13
13
|
s.description = "Ruby Embedly client library"
|
14
14
|
s.email = "bob@embed.ly"
|
@@ -41,6 +41,10 @@ Gem::Specification.new do |s|
|
|
41
41
|
"lib/embedly/configuration.rb",
|
42
42
|
"lib/embedly/exceptions.rb",
|
43
43
|
"lib/embedly/model.rb",
|
44
|
+
"lib/embedly/request.rb",
|
45
|
+
"lib/embedly/request/base.rb",
|
46
|
+
"lib/embedly/request/net_http.rb",
|
47
|
+
"lib/embedly/request/typhoeus.rb",
|
44
48
|
"spec/embedly/api_spec.rb",
|
45
49
|
"spec/embedly/command_line_spec.rb",
|
46
50
|
"spec/embedly/configuration_spec.rb",
|
data/lib/embedly/api.rb
CHANGED
@@ -1,16 +1,11 @@
|
|
1
|
-
require 'net/http'
|
2
|
-
require 'net/https'
|
3
1
|
require 'json'
|
4
2
|
require 'ostruct'
|
5
3
|
require 'embedly/configuration'
|
6
4
|
require 'embedly/model'
|
7
5
|
require 'embedly/exceptions'
|
6
|
+
require 'embedly/request'
|
8
7
|
require 'querystring'
|
9
8
|
require 'oauth'
|
10
|
-
begin
|
11
|
-
require 'typhoeus'
|
12
|
-
rescue LoadError => e
|
13
|
-
end
|
14
9
|
|
15
10
|
# Performs api calls to embedly.
|
16
11
|
#
|
@@ -55,11 +50,11 @@ class Embedly::API
|
|
55
50
|
# [:+proxy+] Proxy settings in format {:host => '', :port => '', :user => '', :password => ''}
|
56
51
|
def initialize opts={}
|
57
52
|
@endpoints = [:oembed, :objectify, :preview, :extract]
|
58
|
-
@key = opts[:key]
|
53
|
+
@key = opts[:key] || configuration.key
|
59
54
|
@secret = opts[:secret] == "" ? nil : opts[:secret]
|
60
55
|
@api_version = Hash.new('1')
|
61
56
|
@api_version.merge!({:objectify => '2'})
|
62
|
-
@hostname = opts[:hostname] || 'api.embed.ly'
|
57
|
+
@hostname = opts[:hostname] || 'http://api.embed.ly'
|
63
58
|
@timeout = opts[:timeout] || 180
|
64
59
|
@headers = {
|
65
60
|
'User-Agent' => opts[:user_agent] || "Mozilla/5.0 (compatible; embedly-ruby/#{Embedly::VERSION};)"
|
@@ -67,31 +62,6 @@ class Embedly::API
|
|
67
62
|
@proxy = opts[:proxy]
|
68
63
|
end
|
69
64
|
|
70
|
-
def _do_typhoeus_call path
|
71
|
-
logger.debug { 'using Typhoeus HTTP Client' }
|
72
|
-
scheme, host, port = uri_parse hostname
|
73
|
-
url = "#{scheme}://#{hostname}:#{port}#{path}"
|
74
|
-
logger.debug { "calling #{site}#{path} with headers #{headers} using Typhoeus" }
|
75
|
-
Typhoeus::Request.get(url, {:headers => headers, :timeout => (@timeout*1000) })
|
76
|
-
end
|
77
|
-
|
78
|
-
def _do_basic_call path
|
79
|
-
logger.debug { 'using Net:HTTP client' }
|
80
|
-
scheme, host, port = uri_parse hostname
|
81
|
-
logger.debug { "calling #{site}#{path} with headers #{headers} using Net::HTTP" }
|
82
|
-
http_class = if proxy
|
83
|
-
logger.debug { 'using Net::HTTP::Proxy' }
|
84
|
-
http_class = Net::HTTP::Proxy(proxy[:host], proxy[:port], proxy[:user], proxy[:password])
|
85
|
-
else
|
86
|
-
Net::HTTP
|
87
|
-
end
|
88
|
-
http_class.start(host, port) do |http|
|
89
|
-
http.use_ssl = (scheme == 'https')
|
90
|
-
http.read_timeout = @timeout
|
91
|
-
http.get(path, headers)
|
92
|
-
end
|
93
|
-
end
|
94
|
-
|
95
65
|
def _do_oauth_call path
|
96
66
|
consumer = OAuth::Consumer.new(key, secret,
|
97
67
|
:site => site,
|
@@ -109,7 +79,9 @@ class Embedly::API
|
|
109
79
|
if key and secret
|
110
80
|
_do_oauth_call path
|
111
81
|
else
|
112
|
-
|
82
|
+
logger.debug { "calling #{site}#{path} with headers #{headers} using #{request}" }
|
83
|
+
uri = URI.join(hostname, path)
|
84
|
+
request.get(uri, :headers => headers, :timeout => @timeout, :proxy => @proxy)
|
113
85
|
end
|
114
86
|
end
|
115
87
|
|
@@ -230,7 +202,12 @@ class Embedly::API
|
|
230
202
|
end
|
231
203
|
end
|
232
204
|
|
205
|
+
def request
|
206
|
+
configuration.current_requester.call(self)
|
207
|
+
end
|
208
|
+
|
233
209
|
private
|
210
|
+
|
234
211
|
def uri_parse uri
|
235
212
|
uri =~ %r{^((http(s?))://)?([^:/]+)(:([\d]+))?(/.*)?$}
|
236
213
|
scheme = $2 || 'http'
|
data/lib/embedly/command_line.rb
CHANGED
@@ -1,12 +1,5 @@
|
|
1
1
|
require "optparse"
|
2
2
|
|
3
|
-
begin
|
4
|
-
require "typhoeus"
|
5
|
-
Embedly.configuration.typhoeus = true
|
6
|
-
rescue LoadError
|
7
|
-
Embedly.configuration.typhoeus = false
|
8
|
-
end
|
9
|
-
|
10
3
|
module Embedly
|
11
4
|
class CommandLine
|
12
5
|
|
@@ -40,8 +33,7 @@ module Embedly
|
|
40
33
|
:secret => ENV['EMBEDLY_SECRET'],
|
41
34
|
:timeout => nil,
|
42
35
|
:headers => {},
|
43
|
-
:query => {}
|
44
|
-
:typhoeus => Embedly.configuration.typhoeus
|
36
|
+
:query => {}
|
45
37
|
}
|
46
38
|
end
|
47
39
|
|
@@ -99,7 +91,7 @@ Usage [OPTIONS] <url> [url] ..
|
|
99
91
|
end
|
100
92
|
|
101
93
|
parser.on("--no-typhoeus", "Don't use typhoeus.") do
|
102
|
-
Embedly.configuration.
|
94
|
+
Embedly.configuration.request_with :net_http
|
103
95
|
end
|
104
96
|
|
105
97
|
parser.separator ""
|
@@ -6,6 +6,7 @@ require 'logger'
|
|
6
6
|
#
|
7
7
|
# * [+debug+] Prints debugging information to logger. Default +false+. Errors still will be logged
|
8
8
|
# * [+logger+] Configure the logger; set this if you want to use a custom logger.
|
9
|
+
# * [+request_with+] Sets the desired library to perform requests. Default is +Typhoeus+
|
9
10
|
#
|
10
11
|
# === Usage
|
11
12
|
#
|
@@ -15,10 +16,13 @@ require 'logger'
|
|
15
16
|
#
|
16
17
|
# # customize the logger
|
17
18
|
# config.logger = MyAwesomeLogger.new(STDERR)
|
19
|
+
#
|
20
|
+
# # performs requests with net/http
|
21
|
+
# config.request_with :net_http
|
18
22
|
# end
|
19
23
|
#
|
20
24
|
class Embedly::Configuration
|
21
|
-
attr_accessor :key, :
|
25
|
+
attr_accessor :key, :requester # :nodoc:
|
22
26
|
|
23
27
|
def initialize # :nodoc:
|
24
28
|
self.reset
|
@@ -41,10 +45,47 @@ class Embedly::Configuration
|
|
41
45
|
set_logger_level(self.debug?)
|
42
46
|
end
|
43
47
|
|
48
|
+
# Configures a new requester
|
49
|
+
#
|
50
|
+
# To add a new requester class, you can do the following:
|
51
|
+
#
|
52
|
+
# Embedly.configuration.add_requester :custom do |api|
|
53
|
+
# MyRequester.new(api)
|
54
|
+
# end
|
55
|
+
#
|
56
|
+
# The requester class should respond to +get+ method, which performs the request
|
57
|
+
# for more details, see +embedly/request/base.rb+
|
58
|
+
def add_requester(name, &block)
|
59
|
+
requesters[name] = block
|
60
|
+
end
|
61
|
+
|
62
|
+
def requesters # :nodoc:
|
63
|
+
@requesters ||= {}
|
64
|
+
end
|
65
|
+
|
66
|
+
# Sets api to use the desired requester class
|
67
|
+
#
|
68
|
+
# When configuring the API, you can do the following:
|
69
|
+
#
|
70
|
+
# Embedly.configure do |config|
|
71
|
+
# config.request_with :net_http
|
72
|
+
# end
|
73
|
+
#
|
74
|
+
# This way, the API will use the +net_http+ class to perform requests
|
75
|
+
def request_with(adapter_name)
|
76
|
+
self.requester = adapter_name
|
77
|
+
end
|
78
|
+
|
79
|
+
# Returns the current configured request block
|
80
|
+
def current_requester
|
81
|
+
requesters[requester]
|
82
|
+
end
|
83
|
+
|
44
84
|
# reset configuration
|
45
85
|
def reset
|
46
|
-
self.logger
|
47
|
-
self.debug
|
86
|
+
self.logger = default_logger
|
87
|
+
self.debug = false
|
88
|
+
self.request_with :typhoeus
|
48
89
|
end
|
49
90
|
|
50
91
|
private
|
@@ -57,3 +98,11 @@ class Embedly::Configuration
|
|
57
98
|
logger.level = true_or_false ? Logger::DEBUG : Logger::ERROR
|
58
99
|
end
|
59
100
|
end
|
101
|
+
|
102
|
+
# Use typhoeus by default if it is installed
|
103
|
+
begin
|
104
|
+
require "typhoeus"
|
105
|
+
Embedly.configuration.request_with :typhoeus
|
106
|
+
rescue LoadError
|
107
|
+
Embedly.configuration.request_with :net_http
|
108
|
+
end
|
@@ -0,0 +1,50 @@
|
|
1
|
+
module Embedly
|
2
|
+
module Request # :nodoc:
|
3
|
+
# Interface to create custom requesters
|
4
|
+
#
|
5
|
+
# == The class
|
6
|
+
#
|
7
|
+
# If you want to define a custom requester, you should create a class that
|
8
|
+
# inherits from this base class.
|
9
|
+
#
|
10
|
+
# The class should respond to +get+ that receives the uri object and the api
|
11
|
+
# options. The method should perform a get request to Embedly api and return
|
12
|
+
# a response object:
|
13
|
+
#
|
14
|
+
# class MyRequester < Embedly::Request::Base
|
15
|
+
# def get(uri, options = {})
|
16
|
+
# # performs the request
|
17
|
+
# end
|
18
|
+
# end
|
19
|
+
#
|
20
|
+
# For more examples, see embedly/requests/*.rb files
|
21
|
+
#
|
22
|
+
# == Adding to configuration
|
23
|
+
#
|
24
|
+
# Make sure to add your class to +embedly+ requesters, like the following:
|
25
|
+
#
|
26
|
+
# Embedly.configuration.add_requester :my_requester do |api|
|
27
|
+
# MyRequester.new(api)
|
28
|
+
# end
|
29
|
+
#
|
30
|
+
# This way you can configure the API to use your custom request object:
|
31
|
+
#
|
32
|
+
# Embedly.configure do |config|
|
33
|
+
# config.request_with :my_requester
|
34
|
+
# end
|
35
|
+
#
|
36
|
+
class Base
|
37
|
+
attr_accessor :api # :nodoc:
|
38
|
+
|
39
|
+
# Receives the current api object
|
40
|
+
def initialize(api)
|
41
|
+
@api = api
|
42
|
+
end
|
43
|
+
|
44
|
+
# Implement this method
|
45
|
+
def get(uri, options = {})
|
46
|
+
raise NotImplementedError
|
47
|
+
end
|
48
|
+
end
|
49
|
+
end
|
50
|
+
end
|
@@ -0,0 +1,27 @@
|
|
1
|
+
require "net/http"
|
2
|
+
|
3
|
+
module Embedly
|
4
|
+
module NetHTTP # :nodoc:
|
5
|
+
class Request < Embedly::Request::Base
|
6
|
+
# Perform request using net/http library
|
7
|
+
def get(uri, options = {})
|
8
|
+
proxy = options['proxy']
|
9
|
+
http_class = if proxy
|
10
|
+
logger.debug { 'using Net::HTTP::Proxy' }
|
11
|
+
http_class = Net::HTTP::Proxy(proxy[:host], proxy[:port], proxy[:user], proxy[:password])
|
12
|
+
else
|
13
|
+
Net::HTTP
|
14
|
+
end
|
15
|
+
|
16
|
+
http_class.start(uri.host, uri.port, :use_ssl => uri.scheme == 'https') do |http|
|
17
|
+
http.read_timeout = options[:timeout]
|
18
|
+
http.get([uri.path, uri.query].join('?'), options[:headers])
|
19
|
+
end
|
20
|
+
end
|
21
|
+
end
|
22
|
+
end
|
23
|
+
end
|
24
|
+
|
25
|
+
Embedly.configuration.add_requester :net_http do |api|
|
26
|
+
Embedly::NetHTTP::Request.new(api)
|
27
|
+
end
|
@@ -0,0 +1,25 @@
|
|
1
|
+
# TODO: a better solution is to only load the requester if it is in use,
|
2
|
+
# rather than loading them all on startup.
|
3
|
+
begin
|
4
|
+
require "typhoeus"
|
5
|
+
|
6
|
+
module Embedly
|
7
|
+
module Typhoeus # :nodoc:
|
8
|
+
class Request < Embedly::Request::Base
|
9
|
+
# Perform request using typhoeus
|
10
|
+
def get(uri, options = {})
|
11
|
+
options[:timeout] *= 1000
|
12
|
+
::Typhoeus::Request.get uri.to_s, :headers => options[:headers], :timeout => options[:timeout]
|
13
|
+
end
|
14
|
+
end
|
15
|
+
end
|
16
|
+
end
|
17
|
+
|
18
|
+
Embedly.configuration.add_requester :typhoeus do |api|
|
19
|
+
Embedly::Typhoeus::Request.new(api)
|
20
|
+
end
|
21
|
+
rescue LoadError
|
22
|
+
require "logger"
|
23
|
+
logger = Logger.new(STDERR)
|
24
|
+
logger.warn { "typhoeus failed to load" }
|
25
|
+
end
|
data/spec/embedly/api_spec.rb
CHANGED
@@ -1,5 +1,6 @@
|
|
1
1
|
require "spec_helper"
|
2
2
|
|
3
|
+
|
3
4
|
module Embedly
|
4
5
|
describe API do
|
5
6
|
let(:api) { API.new :key => ENV['EMBEDLY_KEY'], :secret => ENV['EMBEDLY_SECRET'] }
|
@@ -19,5 +20,27 @@ module Embedly
|
|
19
20
|
io.string.should =~ %r{.*DEBUG -- : .*}
|
20
21
|
end
|
21
22
|
end
|
23
|
+
|
24
|
+
describe "requesters" do
|
25
|
+
describe "net/http" do
|
26
|
+
before do
|
27
|
+
Embedly.configure { |c| c.request_with :net_http }
|
28
|
+
end
|
29
|
+
|
30
|
+
it "sets the correct request adapter" do
|
31
|
+
api.request.should be_a(Embedly::NetHTTP::Request)
|
32
|
+
end
|
33
|
+
end
|
34
|
+
|
35
|
+
describe "typhoeus" do
|
36
|
+
before do
|
37
|
+
Embedly.configure { |c| c.request_with :typhoeus }
|
38
|
+
end
|
39
|
+
|
40
|
+
it "sets the correct request adapter" do
|
41
|
+
api.request.should be_a(Embedly::Typhoeus::Request)
|
42
|
+
end
|
43
|
+
end
|
44
|
+
end
|
22
45
|
end
|
23
46
|
end
|
@@ -13,7 +13,7 @@ module Embedly
|
|
13
13
|
let(:api) { mock(API) }
|
14
14
|
|
15
15
|
it "calls api with options" do
|
16
|
-
API.should_receive(:new).with(:key => 'MY_KEY', :headers => {}
|
16
|
+
API.should_receive(:new).with(:key => 'MY_KEY', :headers => {}) { api }
|
17
17
|
api.should_receive(:oembed).with(:urls => ['http://yfrog.com/h7qqespj'], :maxwidth => '10')
|
18
18
|
CommandLine.run!(:oembed, arguments)
|
19
19
|
end
|
@@ -87,6 +87,13 @@ module Embedly
|
|
87
87
|
end
|
88
88
|
end
|
89
89
|
|
90
|
+
describe "with --no-typhoeus" do
|
91
|
+
it "sets the request with net/http" do
|
92
|
+
command(['--no-typhoeus'])
|
93
|
+
Embedly.configuration.requester.should == :net_http
|
94
|
+
end
|
95
|
+
end
|
96
|
+
|
90
97
|
describe "with --option" do
|
91
98
|
%w[-o --option].each do |option|
|
92
99
|
it "sets custom option with #{option}" do
|
@@ -48,6 +48,20 @@ module Embedly
|
|
48
48
|
config.key = 'my_api_key'
|
49
49
|
config.key.should == 'my_api_key'
|
50
50
|
end
|
51
|
+
|
52
|
+
it "requests typhoeus by default" do
|
53
|
+
config.requester.should == :typhoeus
|
54
|
+
end
|
55
|
+
end
|
56
|
+
|
57
|
+
describe "registering a requester" do
|
58
|
+
it "adds a new requester" do
|
59
|
+
config.add_requester :sample do |api|
|
60
|
+
Embedly::NetHTTP::Request.new(api)
|
61
|
+
end
|
62
|
+
config.request_with :sample
|
63
|
+
config.current_requester.call({}).should be_a(Embedly::NetHTTP::Request)
|
64
|
+
end
|
51
65
|
end
|
52
66
|
end
|
53
67
|
end
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: embedly
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 1.
|
4
|
+
version: 1.8.0
|
5
5
|
prerelease:
|
6
6
|
platform: ruby
|
7
7
|
authors:
|
@@ -9,6 +9,8 @@ authors:
|
|
9
9
|
- Felipe Elias Philipp
|
10
10
|
- Russ Bradberry
|
11
11
|
- Arun Thampi
|
12
|
+
- Anton Dieterle
|
13
|
+
- Nitesh
|
12
14
|
autorequire:
|
13
15
|
bindir: bin
|
14
16
|
cert_chain: []
|
@@ -209,6 +211,10 @@ files:
|
|
209
211
|
- lib/embedly/configuration.rb
|
210
212
|
- lib/embedly/exceptions.rb
|
211
213
|
- lib/embedly/model.rb
|
214
|
+
- lib/embedly/request.rb
|
215
|
+
- lib/embedly/request/base.rb
|
216
|
+
- lib/embedly/request/net_http.rb
|
217
|
+
- lib/embedly/request/typhoeus.rb
|
212
218
|
- spec/embedly/api_spec.rb
|
213
219
|
- spec/embedly/command_line_spec.rb
|
214
220
|
- spec/embedly/configuration_spec.rb
|
@@ -228,7 +234,7 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
228
234
|
version: '0'
|
229
235
|
segments:
|
230
236
|
- 0
|
231
|
-
hash:
|
237
|
+
hash: 1864796039289790567
|
232
238
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
233
239
|
none: false
|
234
240
|
requirements:
|