embedly 1.7.1 → 1.8.0
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.
- 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:
|