link_thumbnailer 1.0.3 → 1.0.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.
- data/.gitignore +1 -0
- data/CHANGELOG.md +9 -0
- data/README.md +14 -4
- data/lib/generators/templates/initializer.rb +6 -0
- data/lib/link_thumbnailer/fetcher.rb +2 -1
- data/lib/link_thumbnailer/img_parser.rb +10 -11
- data/lib/link_thumbnailer/version.rb +1 -1
- data/lib/link_thumbnailer.rb +3 -1
- data/link_thumbnailer.gemspec +5 -5
- data/spec/examples/empty_example.html +11 -0
- data/spec/link_thumbnailer_spec.rb +71 -41
- data/spec/web_image_spec.rb +4 -0
- metadata +4 -2
data/.gitignore
CHANGED
data/CHANGELOG.md
CHANGED
@@ -1,3 +1,12 @@
|
|
1
|
+
# 1.0.4
|
2
|
+
|
3
|
+
- Fix issue #7: nil img was returned when exception is raised. Now skiping nil images in results.
|
4
|
+
- Thanks to [phlegx](https://github.com/phlegx), support for SSL and User Agent customization through configurations.
|
5
|
+
|
6
|
+
# 1.0.3
|
7
|
+
|
8
|
+
- Fix issue #5: Url was incorect in case of HTTP Redirections.
|
9
|
+
|
1
10
|
# 1.0.2
|
2
11
|
|
3
12
|
- Feature: User can now set options at runtime by passing valid options to ```generate``` method
|
data/README.md
CHANGED
@@ -85,7 +85,7 @@ You can check whether this object is valid or not (set mandatory attributes in t
|
|
85
85
|
You also can set options at runtime:
|
86
86
|
|
87
87
|
object = LinkThumbnailer.generate('http://foo.com', top: 10, limit: 20, redirect_limit: 5)
|
88
|
-
|
88
|
+
|
89
89
|
## Preview Controller
|
90
90
|
|
91
91
|
For an easy integration into your application, use the builtin `PreviewController`.
|
@@ -98,15 +98,15 @@ Basically, all you have to do in your view is something like this:
|
|
98
98
|
<%= text_field_tag :url %>
|
99
99
|
<%= submit_tag 'Preview' %>
|
100
100
|
<% end %>
|
101
|
-
|
101
|
+
|
102
102
|
Don't forget to add this anywhere in your `routes.rb` file:
|
103
103
|
|
104
104
|
use_link_thumbnailer
|
105
|
-
|
105
|
+
|
106
106
|
Note: You won't have to bother with this if you did run the installer using:
|
107
107
|
|
108
108
|
$ rails g link_thumbnailer:install
|
109
|
-
|
109
|
+
|
110
110
|
The `PreviewController` will automatically respond to json calls, returning json version of the preview object. Just like in the IRB console above.
|
111
111
|
|
112
112
|
## Configuration
|
@@ -137,6 +137,12 @@ In `config/initializers/link_thumbnailer.rb`
|
|
137
137
|
|
138
138
|
# Return top 5 images only.
|
139
139
|
# config.top = 5
|
140
|
+
|
141
|
+
# Set user agent
|
142
|
+
# config.user_agent = 'linkthumbnailer'
|
143
|
+
|
144
|
+
# Enable or disable SSL verification
|
145
|
+
# config.verify_ssl = true
|
140
146
|
end
|
141
147
|
|
142
148
|
## Features
|
@@ -162,3 +168,7 @@ Coming soon:
|
|
162
168
|
4. Commit your changes (`git commit -am 'Added some feature'`)
|
163
169
|
5. Push to the branch (`git push origin my-new-feature`)
|
164
170
|
6. Create new Pull Request
|
171
|
+
|
172
|
+
## Contributors
|
173
|
+
|
174
|
+
- [phlegx](https://github.com/phlegx)
|
@@ -16,7 +16,8 @@ module LinkThumbnailer
|
|
16
16
|
|
17
17
|
if self.url.is_a?(URI::HTTP)
|
18
18
|
http = Net::HTTP::Persistent.new('linkthumbnailer')
|
19
|
-
http.headers['User-Agent'] =
|
19
|
+
http.headers['User-Agent'] = LinkThumbnailer.configuration.user_agent
|
20
|
+
http.verify_mode = OpenSSL::SSL::VERIFY_NONE unless LinkThumbnailer.configuration.verify_ssl
|
20
21
|
resp = http.request(self.url)
|
21
22
|
case resp
|
22
23
|
when Net::HTTPSuccess; resp.body
|
@@ -19,27 +19,26 @@ module LinkThumbnailer
|
|
19
19
|
img_urls.each { |i|
|
20
20
|
break if count >= LinkThumbnailer.configuration.limit
|
21
21
|
img = parse_one(i)
|
22
|
+
next unless img
|
22
23
|
img.extend LinkThumbnailer::ImgComparator
|
23
24
|
imgs << img
|
24
25
|
count += 1
|
25
26
|
}
|
26
27
|
|
27
|
-
imgs.sort!
|
28
|
+
imgs.sort! unless imgs.count <= 1
|
28
29
|
|
29
30
|
imgs.first(LinkThumbnailer.configuration.top)
|
30
31
|
end
|
31
32
|
|
32
33
|
def parse_one(img_url)
|
33
|
-
|
34
|
-
|
35
|
-
|
36
|
-
|
37
|
-
|
38
|
-
|
39
|
-
|
40
|
-
|
41
|
-
nil
|
42
|
-
end
|
34
|
+
img_data = @fetcher.fetch(img_url)
|
35
|
+
img = Magick::ImageList.new.from_blob(img_data).extend(
|
36
|
+
LinkThumbnailer::WebImage
|
37
|
+
)
|
38
|
+
img.source_url = img_url
|
39
|
+
img
|
40
|
+
rescue Exception
|
41
|
+
nil
|
43
42
|
end
|
44
43
|
|
45
44
|
end
|
data/lib/link_thumbnailer.rb
CHANGED
data/link_thumbnailer.gemspec
CHANGED
@@ -15,12 +15,12 @@ Gem::Specification.new do |gem|
|
|
15
15
|
gem.require_paths = ["lib"]
|
16
16
|
gem.version = LinkThumbnailer::VERSION
|
17
17
|
|
18
|
-
gem.add_dependency(%q{nokogiri},
|
19
|
-
gem.add_dependency(%q{hashie},
|
18
|
+
gem.add_dependency(%q{nokogiri}, ['~> 1.5.5'])
|
19
|
+
gem.add_dependency(%q{hashie}, ['~> 1.2.0'])
|
20
20
|
gem.add_dependency(%q{net-http-persistent}, ['~> 2.7'])
|
21
|
-
gem.add_dependency(%q{rmagick},
|
22
|
-
gem.add_dependency(%q{json},
|
21
|
+
gem.add_dependency(%q{rmagick}, ['~> 2.13.1'])
|
22
|
+
gem.add_dependency(%q{json}, ['~> 1.7.6'])
|
23
23
|
|
24
|
-
gem.add_development_dependency(%q{rspec},
|
24
|
+
gem.add_development_dependency(%q{rspec}, ['~> 2.11.0'])
|
25
25
|
gem.add_development_dependency(%q{webmock}, ['~> 1.8.10'])
|
26
26
|
end
|
@@ -2,8 +2,9 @@ require 'spec_helper'
|
|
2
2
|
|
3
3
|
describe LinkThumbnailer do
|
4
4
|
|
5
|
-
let(:og_example)
|
6
|
-
let(:example)
|
5
|
+
let(:og_example) { File.open(File.dirname(__FILE__) + '/examples/og_example.html').read() }
|
6
|
+
let(:example) { File.open(File.dirname(__FILE__) + '/examples/example.html').read() }
|
7
|
+
let(:empty_example) { File.open(File.dirname(__FILE__) + '/examples/empty_example.html').read() }
|
7
8
|
|
8
9
|
it { should respond_to :configuration }
|
9
10
|
it { should respond_to :configure }
|
@@ -20,12 +21,14 @@ describe LinkThumbnailer do
|
|
20
21
|
before do
|
21
22
|
LinkThumbnailer.configure {|config|
|
22
23
|
config.mandatory_attributes = %w(foo bar)
|
23
|
-
config.strict
|
24
|
-
config.redirect_limit
|
25
|
-
config.blacklist_urls
|
26
|
-
config.rmagick_attributes
|
27
|
-
config.limit
|
28
|
-
config.top
|
24
|
+
config.strict = false
|
25
|
+
config.redirect_limit = 5
|
26
|
+
config.blacklist_urls = []
|
27
|
+
config.rmagick_attributes = []
|
28
|
+
config.limit = 5
|
29
|
+
config.top = 10
|
30
|
+
config.user_agent = 'linkthumbnailer'
|
31
|
+
config.verify_ssl = true
|
29
32
|
}
|
30
33
|
end
|
31
34
|
|
@@ -34,12 +37,14 @@ describe LinkThumbnailer do
|
|
34
37
|
end
|
35
38
|
|
36
39
|
specify { LinkThumbnailer.configuration.mandatory_attributes.should eq(%w(foo bar)) }
|
37
|
-
specify { LinkThumbnailer.configuration.strict.should
|
38
|
-
specify { LinkThumbnailer.configuration.redirect_limit.should
|
39
|
-
specify { LinkThumbnailer.configuration.blacklist_urls.should
|
40
|
-
specify { LinkThumbnailer.configuration.rmagick_attributes.should
|
41
|
-
specify { LinkThumbnailer.configuration.limit.should
|
42
|
-
specify { LinkThumbnailer.configuration.top.should
|
40
|
+
specify { LinkThumbnailer.configuration.strict.should be_false }
|
41
|
+
specify { LinkThumbnailer.configuration.redirect_limit.should eq(5) }
|
42
|
+
specify { LinkThumbnailer.configuration.blacklist_urls.should eq([]) }
|
43
|
+
specify { LinkThumbnailer.configuration.rmagick_attributes.should eq([]) }
|
44
|
+
specify { LinkThumbnailer.configuration.limit.should eq(5) }
|
45
|
+
specify { LinkThumbnailer.configuration.top.should eq(10) }
|
46
|
+
specify { LinkThumbnailer.configuration.user_agent.should eq('linkthumbnailer') }
|
47
|
+
specify { LinkThumbnailer.configuration.verify_ssl.should be_true }
|
43
48
|
|
44
49
|
end
|
45
50
|
|
@@ -50,17 +55,19 @@ describe LinkThumbnailer do
|
|
50
55
|
end
|
51
56
|
|
52
57
|
specify { LinkThumbnailer.configuration.mandatory_attributes.should eq(%w(url title images)) }
|
53
|
-
specify { LinkThumbnailer.configuration.strict.should
|
54
|
-
specify { LinkThumbnailer.configuration.redirect_limit.should
|
55
|
-
specify { LinkThumbnailer.configuration.blacklist_urls.should
|
58
|
+
specify { LinkThumbnailer.configuration.strict.should be_true }
|
59
|
+
specify { LinkThumbnailer.configuration.redirect_limit.should eq(3) }
|
60
|
+
specify { LinkThumbnailer.configuration.blacklist_urls.should eq([
|
56
61
|
%r{^http://ad\.doubleclick\.net/},
|
57
62
|
%r{^http://b\.scorecardresearch\.com/},
|
58
63
|
%r{^http://pixel\.quantserve\.com/},
|
59
64
|
%r{^http://s7\.addthis\.com/}
|
60
65
|
]) }
|
61
|
-
specify { LinkThumbnailer.configuration.rmagick_attributes.should
|
62
|
-
specify { LinkThumbnailer.configuration.limit.should
|
63
|
-
specify { LinkThumbnailer.configuration.top.should
|
66
|
+
specify { LinkThumbnailer.configuration.rmagick_attributes.should eq(%w(source_url mime_type colums rows filesize number_colors)) }
|
67
|
+
specify { LinkThumbnailer.configuration.limit.should eq(10) }
|
68
|
+
specify { LinkThumbnailer.configuration.top.should eq(5) }
|
69
|
+
specify { LinkThumbnailer.configuration.user_agent.should eq('linkthumbnailer') }
|
70
|
+
specify { LinkThumbnailer.configuration.verify_ssl.should be_true }
|
64
71
|
|
65
72
|
end
|
66
73
|
|
@@ -76,33 +83,40 @@ describe LinkThumbnailer do
|
|
76
83
|
context "and options" do
|
77
84
|
|
78
85
|
it "should set top option" do
|
79
|
-
expect { LinkThumbnailer.generate('foo', :
|
86
|
+
expect { LinkThumbnailer.generate('foo', top: 20).to change(LinkThumbnailer.configuration.top).from(5).to(20) }
|
80
87
|
end
|
81
88
|
|
82
89
|
it "should set limit option" do
|
83
|
-
expect { LinkThumbnailer.generate('foo', :
|
90
|
+
expect { LinkThumbnailer.generate('foo', limit: 20).to change(LinkThumbnailer.configuration.limit).from(10).to(20) }
|
84
91
|
end
|
85
92
|
|
86
93
|
it "should set mandatory_attributes option" do
|
87
|
-
expect { LinkThumbnailer.generate('foo', :
|
94
|
+
expect { LinkThumbnailer.generate('foo', mandatory_attributes: %w(one two)).to change(LinkThumbnailer.configuration.mandatory_attributes).from(%w(url title images)).to(%w(one two)) }
|
88
95
|
end
|
89
96
|
|
90
97
|
it "should set strict option" do
|
91
|
-
expect { LinkThumbnailer.generate('foo', :
|
98
|
+
expect { LinkThumbnailer.generate('foo', strict: false).to change(LinkThumbnailer.configuration.strict).from(true).to(false) }
|
92
99
|
end
|
93
100
|
|
94
101
|
it "should set redirect_limit option" do
|
95
|
-
expect { LinkThumbnailer.generate('foo', :
|
102
|
+
expect { LinkThumbnailer.generate('foo', redirect_limit: 5).to change(LinkThumbnailer.configuration.redirect_limit).from(3).to(5) }
|
96
103
|
end
|
97
104
|
|
98
105
|
it "should set blacklist_urls option" do
|
99
|
-
expect { LinkThumbnailer.generate('foo', :
|
106
|
+
expect { LinkThumbnailer.generate('foo', blacklist_urls: [%r{^http://foo\.bar\.com/}]).to change(LinkThumbnailer.configuration.blacklist_urls).to([%r{^http://foo\.bar\.com/}]) }
|
100
107
|
end
|
101
108
|
|
102
109
|
it "should set rmagick_attributes option" do
|
103
|
-
expect { LinkThumbnailer.generate('foo', :
|
110
|
+
expect { LinkThumbnailer.generate('foo', rmagick_attributes: %w(one two)).to change(LinkThumbnailer.configuration.rmagick_attributes).to(%w(one two)) }
|
104
111
|
end
|
105
112
|
|
113
|
+
it "should set user_agent option" do
|
114
|
+
expect { LinkThumbnailer.generate('foo', user_agent: 'Mac Safari').to change(LinkThumbnailer.configuration.mandatory_attributes).from('linkthumbnailer').to('Mac Safari') }
|
115
|
+
end
|
116
|
+
|
117
|
+
it "should set verify_ssl option" do
|
118
|
+
expect { LinkThumbnailer.generate('foo', verify_ssl: false).to change(LinkThumbnailer.configuration.verify_ssl).from(true).to(false) }
|
119
|
+
end
|
106
120
|
end
|
107
121
|
|
108
122
|
context "when strict" do
|
@@ -111,20 +125,29 @@ describe LinkThumbnailer do
|
|
111
125
|
|
112
126
|
subject { LinkThumbnailer.generate('foo') }
|
113
127
|
|
114
|
-
it {
|
128
|
+
it { expect(LinkThumbnailer.generate('foo')).to be_nil }
|
115
129
|
|
116
130
|
end
|
117
131
|
|
118
132
|
context "and valid" do
|
119
133
|
|
120
134
|
before do
|
121
|
-
stub_request(:get,
|
135
|
+
stub_request(:get, 'http://foo.com/').to_return(status: 200, body: og_example, headers: {})
|
122
136
|
end
|
123
137
|
|
124
|
-
|
138
|
+
it { expect(LinkThumbnailer.generate('http://foo.com')).to_not be_nil }
|
139
|
+
it { expect(LinkThumbnailer.generate('http://foo.com')).to be_valid }
|
140
|
+
|
141
|
+
end
|
142
|
+
|
143
|
+
context "and empty" do
|
144
|
+
|
145
|
+
before do
|
146
|
+
stub_request(:get, 'http://foo.com/').to_return(status: 200, body: empty_example, headers: {})
|
147
|
+
end
|
125
148
|
|
126
|
-
it {
|
127
|
-
it {
|
149
|
+
it { expect(LinkThumbnailer.generate('http://foo.com/')).to be_nil }
|
150
|
+
it { expect { LinkThumbnailer.generate('http://foo.com/') }.to_not raise_exception }
|
128
151
|
|
129
152
|
end
|
130
153
|
|
@@ -133,28 +156,35 @@ describe LinkThumbnailer do
|
|
133
156
|
context "when not strict" do
|
134
157
|
|
135
158
|
before do
|
136
|
-
LinkThumbnailer.configure {|config| config.strict = false}
|
159
|
+
LinkThumbnailer.configure {|config| config.strict = false }
|
137
160
|
end
|
138
161
|
|
139
162
|
context "and not valid" do
|
140
163
|
|
141
|
-
|
142
|
-
|
143
|
-
it { should_not be_nil }
|
144
|
-
it { should be_valid }
|
164
|
+
it { expect(LinkThumbnailer.generate('foo')).to_not be_nil }
|
165
|
+
it { expect(LinkThumbnailer.generate('foo')).to be_valid }
|
145
166
|
|
146
167
|
end
|
147
168
|
|
148
169
|
context "and valid" do
|
149
170
|
|
150
171
|
before do
|
151
|
-
stub_request(:get,
|
172
|
+
stub_request(:get, 'http://foo.com/').to_return(status: 200, body: og_example, headers: {})
|
152
173
|
end
|
153
174
|
|
154
|
-
|
175
|
+
it { expect(LinkThumbnailer.generate('http://foo.com')).to_not be_nil }
|
176
|
+
it { expect(LinkThumbnailer.generate('http://foo.com')).to be_valid }
|
177
|
+
|
178
|
+
end
|
179
|
+
|
180
|
+
context "and empty" do
|
181
|
+
|
182
|
+
before do
|
183
|
+
stub_request(:get, 'http://foo.com/').to_return(status: 200, body: empty_example, headers: {})
|
184
|
+
end
|
155
185
|
|
156
|
-
it {
|
157
|
-
it {
|
186
|
+
it { expect(LinkThumbnailer.generate('http://foo.com/')).to_not be_nil }
|
187
|
+
it { expect { LinkThumbnailer.generate('http://foo.com/') }.to_not raise_exception }
|
158
188
|
|
159
189
|
end
|
160
190
|
|
data/spec/web_image_spec.rb
CHANGED
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: link_thumbnailer
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 1.0.
|
4
|
+
version: 1.0.4
|
5
5
|
prerelease:
|
6
6
|
platform: ruby
|
7
7
|
authors:
|
@@ -9,7 +9,7 @@ authors:
|
|
9
9
|
autorequire:
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
|
-
date: 2013-
|
12
|
+
date: 2013-05-01 00:00:00.000000000 Z
|
13
13
|
dependencies:
|
14
14
|
- !ruby/object:Gem::Dependency
|
15
15
|
name: nokogiri
|
@@ -160,6 +160,7 @@ files:
|
|
160
160
|
- link_thumbnailer.gemspec
|
161
161
|
- spec/doc_parser_spec.rb
|
162
162
|
- spec/doc_spec.rb
|
163
|
+
- spec/examples/empty_example.html
|
163
164
|
- spec/examples/example.html
|
164
165
|
- spec/examples/og_example.html
|
165
166
|
- spec/fetcher_spec.rb
|
@@ -198,6 +199,7 @@ summary: Ruby gem ranking images from a given URL returning an object containing
|
|
198
199
|
test_files:
|
199
200
|
- spec/doc_parser_spec.rb
|
200
201
|
- spec/doc_spec.rb
|
202
|
+
- spec/examples/empty_example.html
|
201
203
|
- spec/examples/example.html
|
202
204
|
- spec/examples/og_example.html
|
203
205
|
- spec/fetcher_spec.rb
|