link_thumbnailer 0.0.3 → 0.0.4

Sign up to get free protection for your applications and to get access to all the features.
data/CHANGELOG.md CHANGED
@@ -1,3 +1,13 @@
1
+ # 0.0.4
2
+
3
+ - Add specs for almost all classes
4
+ - Add a method `to_json` for WebImage class to be able to get a usable array of images' attributes
5
+
6
+ # 0.0.3
7
+
8
+ - Add specs for LinkThumbnailer class
9
+ - Refactor config system, now using dedicated configuration class
10
+
1
11
  # 0.0.2
2
12
 
3
13
  - Added Rspec
@@ -16,4 +26,4 @@
16
26
  - LinkThumbnailer::Opengraph
17
27
  - LinkThumbnailer::WebImage
18
28
  - LinkThumbnailer.configure
19
- - LinkThumbnailer.generate
29
+ - LinkThumbnailer.generate
@@ -14,6 +14,7 @@ module LinkThumbnailer
14
14
  end
15
15
  end
16
16
 
17
+ # TODO remove blank call. Rails dependent.
17
18
  def valid?
18
19
  return false if self.keys.empty?
19
20
  LinkThumbnailer.configuration.mandatory_attributes.each {|a| return false if self[a].blank? } if LinkThumbnailer.configuration.strict
@@ -1,3 +1,3 @@
1
1
  module LinkThumbnailer
2
- VERSION = "0.0.3"
2
+ VERSION = "0.0.4"
3
3
  end
@@ -1,8 +1,19 @@
1
+ require 'json'
2
+
1
3
  module LinkThumbnailer
2
4
  module WebImage
3
5
 
4
6
  attr_accessor :source_url
5
7
  attr_accessor :doc
6
8
 
9
+ def to_json
10
+ result = []
11
+ %w(source_url mime_type density colums rows filesize number_colors).each {|m|
12
+ result << { m.to_sym => self.send(m) } if self.respond_to?(m)
13
+ }
14
+
15
+ JSON(result)
16
+ end
17
+
7
18
  end
8
19
  end
@@ -16,7 +16,8 @@ module LinkThumbnailer
16
16
 
17
17
  class << self
18
18
 
19
- attr_accessor :configuration, :object, :fetcher, :doc_parser, :img_url_filters, :img_parser
19
+ attr_accessor :configuration, :object, :fetcher, :doc_parser,
20
+ :img_url_filters, :img_parser
20
21
 
21
22
  def config
22
23
  self.configuration ||= Configuration.new(
@@ -19,6 +19,7 @@ Gem::Specification.new do |gem|
19
19
  gem.add_dependency(%q{hashie}, ['~> 1.2.0'])
20
20
  gem.add_dependency(%q{net-http-persistent}, ['~> 2.7'])
21
21
  gem.add_dependency(%q{rmagick}, ['~> 2.13.1'])
22
+ gem.add_dependency(%q{json}, ['~> 1.7.5'])
22
23
 
23
24
  gem.add_development_dependency(%q{rspec}, ['~> 2.11.0'])
24
25
  gem.add_development_dependency(%q{webmock}, ['~> 1.8.10'])
@@ -0,0 +1,7 @@
1
+ require 'spec_helper'
2
+
3
+ describe LinkThumbnailer::DocParser do
4
+
5
+ it { should respond_to :parse }
6
+
7
+ end
data/spec/doc_spec.rb ADDED
@@ -0,0 +1,23 @@
1
+ require 'spec_helper'
2
+
3
+ describe LinkThumbnailer::Doc do
4
+
5
+ class Foo
6
+ end
7
+
8
+ let(:foo) { Foo.new }
9
+
10
+ before do
11
+ foo.extend LinkThumbnailer::Doc
12
+ end
13
+
14
+ subject { foo }
15
+
16
+ it { should respond_to :doc_base_href }
17
+ it { should respond_to :img_srcs }
18
+ it { should respond_to :img_abs_urls }
19
+ it { should respond_to :title }
20
+ it { should respond_to :description }
21
+ it { should respond_to :source_url }
22
+
23
+ end
@@ -0,0 +1,363 @@
1
+ <!DOCTYPE html>
2
+ <!-- saved from url=(0019)http://www.foo.com/ -->
3
+ <html><head><meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
4
+ <meta charset="UTF-8">
5
+ <title>Foo.com</title>
6
+ <link href="./example_files/style-3706572431311a3a4cf5c6f3266c9bce.css" media="all" rel="stylesheet" type="text/css">
7
+ <link href="./example_files/belt_layout1_google-1c8ee8bd905a6121e7a7ac73b7ffb888.css" media="all" rel="stylesheet" type="text/css">
8
+ <script src="./example_files/application-e8b3208729190cb9cc8a800ff3283fd8.js" type="text/javascript"></script>
9
+ <link href="./example_files/load_style.css" media="all" rel="stylesheet" type="text/css">
10
+ <meta content="authenticity_token" name="csrf-param">
11
+ <meta content="Mh9Ervhd7HlDNhhJdZ+nKec9RE0sn2FO8nyJXUrKUng=" name="csrf-token">
12
+ </head>
13
+ <body>
14
+
15
+
16
+ <style>
17
+ .listing .sitelinks{
18
+ padding:5px 15px;
19
+ }
20
+
21
+ .listing .sitelinks td{
22
+ padding-right:16px;
23
+
24
+ }
25
+ .listing .sitelinks a, .listing .ratings a{
26
+ color:#0000DE;
27
+ }
28
+ .listing .url a:hover{
29
+ color:#a02934;
30
+ }
31
+ .ratings{
32
+ color: #666666;
33
+ }
34
+ .listing{
35
+ margin-bottom:15px;
36
+ }
37
+ .listing .url {
38
+ font-size:16px;
39
+ }
40
+ .listing .host {
41
+ color:#a02934;
42
+ display:block;
43
+ font-size:16px;
44
+ text-decoration:none;
45
+ }
46
+
47
+ .listing .url a{
48
+ color:#0000DE;
49
+ line-height:auto;
50
+ }
51
+ .listing .description a{
52
+ text-decoration:none;
53
+ color:black;
54
+ font-size:16px;
55
+ line-height:12pt;
56
+ }
57
+ .listing .host a{
58
+ text-decoration:none;
59
+ color:#008000;
60
+ font-size:16px;
61
+ line-height:12pt;
62
+ }
63
+ </style>
64
+ <script src="./example_files/jquery-1.5.js"></script>
65
+ <script>
66
+ var google_about_url = '';
67
+ var ads_array = new Array();
68
+ var bottom_ads_array = new Array();
69
+ var webSearch = "";
70
+ var google_tag = "";
71
+
72
+ var genCatSearches_array=new Array();
73
+ var relatedSearches_array=new Array();
74
+ var popularCategories_array = new Array();
75
+ var digi_keyword_links_array = new Array();
76
+ var global_afd_response = "";
77
+
78
+ var call_num = 1;
79
+ function redirect(){
80
+ document.getElementById('results').innerHTML = "No results found";
81
+ }
82
+
83
+ function jscript_log(name, severity, message, page){
84
+ $.ajax({
85
+ type: "POST",
86
+ url: "/log_error",
87
+ data: {
88
+ name: name,
89
+ severity: severity,
90
+ domain: window.location.hostname,
91
+ message: message,
92
+ tag: google_tag,
93
+ page: page
94
+ },
95
+ context: document.body
96
+ })
97
+ }
98
+
99
+ function token_link(keyword){
100
+ window.location = '/results' + '?q=' + encodeURIComponent(keyword) + '&token=' + global_afd_response.token;
101
+ return false;
102
+ }
103
+
104
+ function link_to_google(){
105
+ if(google_about_url!=''){
106
+ window.open(google_about_url,'_blank');
107
+ }
108
+ }
109
+
110
+ function gadlink(ga, inner_text, visible_url){
111
+ visible_url = visible_url.replace(/<b>/gi,'')
112
+ visible_url = visible_url.replace(/<\/b>/gi,'')
113
+ return '<a ' +
114
+ 'href="http://' + visible_url + '"' +
115
+ ' onclick="window.open(\'' + ga.url + '\');return false;"' +
116
+ ' target="_blank" ' +
117
+ '>' +
118
+ inner_text + '</a>';
119
+
120
+ }
121
+
122
+ function google_afd_ad_request_done(google_afd_response) {
123
+ if(google_afd_response.faillisted==true){
124
+ jscript_log('faillisted', 10, JSON.stringify(google_afd_response), "/")
125
+ }
126
+ if(google_afd_response.token || google_afd_response.ads){
127
+
128
+ global_afd_response = google_afd_response;
129
+ if(google_afd_response.feedback_url){
130
+ google_about_url = google_afd_response.feedback_url;
131
+ }
132
+
133
+ if (google_afd_response.ads && google_afd_response.ads.length > 0) {
134
+ var google_ads = google_afd_response.ads;
135
+ for (var i = 0; i < google_ads.length; i++) {
136
+ seller_ratings = google_ads[i].seller_ratings;
137
+ site_links = google_ads[i].sitelinks;
138
+ ads="";
139
+ ads +=
140
+ '<div class="listing"><div class="url">' +
141
+ gadlink(google_ads[i], google_ads[i].line1, google_ads[i].visible_url) +
142
+ '</div>';
143
+ if (seller_ratings) {
144
+ ads += '<div class="ratings">'+seller_ratings.advertiser_info+' <img src="/assets/'+seller_ratings.rating+'star.gif" border="0"> <a href="'+seller_ratings.source_url+'" target="_blank">('+seller_ratings.review_count+')</a></div>';
145
+ }
146
+ ads +=
147
+ '<div class="description">' + google_ads[i].line2 + ' ' +
148
+ (google_ads[i].line3 != undefined ? google_ads[i].line3 + '' : '') +
149
+ '</div>' +
150
+ '<div class="host">' +
151
+ gadlink(google_ads[i], google_ads[i].visible_url, google_ads[i].visible_url) +
152
+ '</div>';
153
+ if (site_links && site_links.length > 0) {
154
+ ads += '<table class="sitelinks" cellpadding=0 cellspacing=0 border=0>';
155
+ for (var x = 0; x < site_links.length; x++) {
156
+ if(x % 2 == 0){
157
+ ads += '<tr>';
158
+ }
159
+ ads +=
160
+ '<td class="sitelink">' +
161
+ gadlink(site_links[x], site_links[x].link_text, google_ads[i].visible_url) +
162
+ '</td>';
163
+ if(x % 2 == 1){
164
+ ads += '</tr>';
165
+ }
166
+ }
167
+ if(x % 2 == 0){
168
+ ads += '</tr>';
169
+ }
170
+ ads += '</table>';
171
+ }
172
+
173
+ ads += '</div>';
174
+ if(google_ads[i].position=="Top"){
175
+ ads_array.push(ads);
176
+ }else{
177
+ bottom_ads_array.push(ads);
178
+ }
179
+ }
180
+ }
181
+
182
+ if (google_afd_response.categories && google_afd_response.categories.length > 0) {
183
+ var google_categories = google_afd_response.categories;
184
+ for (var i = 0; i < google_categories.length; i++) {
185
+ subcats = google_categories[i].subcategories;
186
+ popularCategories =
187
+ '<div class="termgroup">' +
188
+ '<h3><a class="popular_category" ' +
189
+ 'href="/#' + google_categories[i].term + '"' +
190
+ ' onclick="window.location=\'/results' +
191
+ '?q=' + encodeURIComponent(google_categories[i].term) +
192
+ '&token=' + google_categories[i].token + '\';return false;"' +
193
+ '>' +
194
+ google_categories[i].term +
195
+ '</a></h3>';
196
+ for(var gci =0; gci < subcats.length; gci++){
197
+ popularCategories = popularCategories +
198
+ '<div class="term">' +
199
+ '<a class="popular_category" ' +
200
+ 'href="/#' + subcats[gci].term + '"' +
201
+ ' onclick="window.location=\'/results' +
202
+ '?q=' + encodeURIComponent(subcats[gci].term) +
203
+ '&token=' + subcats[gci].token + '\';return false;"' +
204
+ '>' +
205
+ subcats[gci].term +
206
+ '</a></div>';
207
+ }
208
+ popularCategories = popularCategories + '</div>';
209
+ popularCategories_array.push(popularCategories);
210
+ }
211
+ }
212
+
213
+ if (google_afd_response.link_units && google_afd_response.link_units.length > 0) {
214
+ var google_link_units = google_afd_response.link_units;
215
+ for (var i = 0; i < google_link_units.length; i++) {
216
+ relatedSearches =
217
+ '<div class="term">' +
218
+ '<a class="related_searches" ' +
219
+ 'href="/#' + google_link_units[i].term + '"' +
220
+ ' onclick="window.location=\'/results' +
221
+ '?q=' + encodeURIComponent(google_link_units[i].term) +
222
+ '&token=' + google_link_units[i].token + '\';return false;"' +
223
+ '>' +
224
+ google_link_units[i].term +
225
+ '</a>' +
226
+ '</div>';
227
+ relatedSearches_array.push(relatedSearches);
228
+ }
229
+
230
+ }
231
+ if (google_afd_response.link_units && google_afd_response.link_units.length > 0) {
232
+ var google_link_units = google_afd_response.link_units;
233
+ for (var i = 0; i < google_link_units.length; i++) {
234
+ relatedSearches = "";
235
+ if(i % 5 == 0){
236
+ relatedSearches += "<div class='termgroup'>";
237
+ }
238
+ relatedSearches +=
239
+ '<div class="term">' +
240
+ '<a class="related_searches" ' +
241
+ 'href="/#' + google_link_units[i].term + '"' +
242
+ ' onclick="window.location=\'/results' +
243
+ '?q=' + encodeURIComponent(google_link_units[i].term) +
244
+ '&token=' + google_link_units[i].token + '\';return false;"' +
245
+ '>' +
246
+ google_link_units[i].term +
247
+ '</a>' +
248
+ '</div>';
249
+ if(((i % 5) == 4) || ((i-1)==google_link_units.length)){
250
+ relatedSearches += "</div>";
251
+ }
252
+ if(((i+1) % 10 == 0)){
253
+ relatedSearches += "<div class='clear'>&nbsp;</div>";
254
+ }
255
+ genCatSearches_array.push(relatedSearches);
256
+ }
257
+
258
+ }
259
+ try{document.getElementById('results').innerHTML = ads_array.join("\n");}catch(error){}
260
+ try{document.getElementById('bottomresults').innerHTML = bottom_ads_array.join("\n");}catch(error){}
261
+
262
+ if(ads_array.length>1){
263
+ document.getElementById('sponsoredresults').style.display='block';
264
+ }
265
+ if(bottom_ads_array.length>1){
266
+ document.getElementById('bottomsponsoredresults').style.display='block';
267
+ }
268
+
269
+ try{document.getElementById('keywords').innerHTML = relatedSearches_array.join("\n");}catch(error){}
270
+ try{document.getElementById('gencats').innerHTML = genCatSearches_array.join("\n");}catch(error){}
271
+ // if(genCatSearches_array.length==0){
272
+ // try{
273
+ // document.getElementById('gencats').innerHTML = popularCategories_array.join("\n");
274
+ // }catch(error){}
275
+ // }
276
+ try{document.getElementById('popcats').innerHTML = popularCategories_array.join("\n");}catch(error){}
277
+ try{document.getElementById('token').value = google_afd_response.search_token;}catch(error){}
278
+ console.log(google_afd_response);
279
+ try{document.getElementById('token2').value = google_afd_response.search_token;}catch(error){}
280
+ }
281
+ }
282
+
283
+ function getParam(name) {
284
+ var match = new RegExp('[\?&]' + name + "=([^&]+)","i").exec(location.search);
285
+ if (match==null) return null;
286
+ else return decodeURIComponent(match[1]).replace(/\+/g,' ');
287
+ }
288
+ </script>
289
+
290
+
291
+
292
+ <center>
293
+ <div id="container">
294
+ <div id="header">
295
+ <div class="logo">
296
+ <a href="./example_files/example.html">Foo.com</a>
297
+ </div>
298
+ </div>
299
+
300
+
301
+
302
+
303
+
304
+
305
+
306
+ <div id="main">
307
+ <div class="image">
308
+ <img alt="Cordovabeach" border="0" src="./example_files/cordovabeach.jpg">
309
+ </div>
310
+ <div class="search">
311
+ <div class="catch_phrase">
312
+ <div id="wysiwyg_id_322" class="mercury-region" data-type="editable">Search FOO.com
313
+ </div>
314
+ </div>
315
+ <div id="search">
316
+ <form action="http://www.foo.com/results" method="/get">
317
+ <input class="search_field" name="q" type="text">
318
+ <input id="token" name="token" type="hidden" value="AG06ipADDhq1IogUPtnbN7KiSVdr6HlXngoTCITm8PO41bICFSENtAodnwEA0RgDIAA4AUCwAlCUjqIBUIO6sAhQ4a65DlDN_pgPUOK53A9Qqo3jD1C1q_YPUM3B_g9QivCIEVCU-qcTUIfrhBtQx4yNHVCsxv8eUPD02SBQ1PXZIFDd2ZEhUIOcrSlQu5ytKVDSsa0pUPKxrSlQ3KCvKVCTnKYtULKU5y1QsKX8U1CTtJSVAVDL74OWAVDqp6KyAVCslfPAAVC6lfPAAVCOl_PAAVCYrMGbA1DlhNOdA2iUjqIBcQL5qk1K1hZJggETCOW09_O41bICFfILtAodzTkAq5EBp8Lq2utL_VI">
319
+ <input class="search_button" type="submit" value="Search">
320
+ </form>
321
+ </div>
322
+
323
+ </div>
324
+ </div>
325
+
326
+ <div id="footer">
327
+ <a href="http://www.foo.com/digimedia_privacy_policy.html" target="_blank">Privacy Policy</a>
328
+ -
329
+ © 2012 Digimedia.com, L.P.
330
+ </div>
331
+
332
+ </div>
333
+ </center>
334
+ <script type="text/javascript">
335
+ var gaJsHost = (("https:" == document.location.protocol) ? "https://ssl." : "http://www.");
336
+ document.write(unescape("%3Cscript src='" + gaJsHost + "google-analytics.com/ga.js' type='text/javascript'%3E%3C/script%3E"));
337
+ </script><script src="./example_files/ga.js" type="text/javascript"></script>
338
+ <script type="text/javascript">
339
+ var pageTracker = _gat._getTracker('UA-1726084-83');
340
+ pageTracker._initData();
341
+ pageTracker._setDomainName('foo.com');
342
+ pageTracker._trackPageview('/');
343
+ </script>
344
+
345
+ <script>
346
+ google_tag = 'dp-digimedia_js';
347
+ var google_afd_request = {
348
+ client: 'ca-dp-digimedia-rs_js',
349
+ domain_name: 'www.foo.com',
350
+ num_ads: 0,
351
+ num_radlinks: 10,
352
+ token: getParam('token'),
353
+ q: getParam('q'),
354
+ kw: 'foo',
355
+ channel: 'afsonly'
356
+ }
357
+ </script>
358
+ <script language="JavaScript" src="./example_files/show_afd_ads.js" type="text/javascript"></script><script src="./example_files/domainpark.cgi"></script>
359
+
360
+
361
+
362
+
363
+ </body></html>
@@ -0,0 +1,45 @@
1
+ require 'spec_helper'
2
+
3
+ describe LinkThumbnailer::Fetcher do
4
+
5
+ it { should respond_to :fetch }
6
+
7
+ let(:fetcher) { LinkThumbnailer::Fetcher.new }
8
+
9
+ describe ".fetch" do
10
+
11
+ before do
12
+ LinkThumbnailer.configure {|config| config.redirect_count = 3}
13
+ end
14
+
15
+ context "when redirect_count is more than config" do
16
+
17
+ it { lambda { fetcher.fetch('http://foo.com', 10) }.should raise_exception(ArgumentError) }
18
+
19
+ end
20
+
21
+ context "when no http error" do
22
+
23
+ before do
24
+ stub_request(:get, 'http://foo.com/').to_return(:status => 200, :body => 'foo', :headers => {})
25
+ end
26
+
27
+ subject { fetcher.fetch('http://foo.com') }
28
+
29
+ it { should eq('foo') }
30
+
31
+ end
32
+
33
+ context "when http error" do
34
+
35
+ before do
36
+ stub_request(:get, 'http://foo.com/').to_return(:status => 500, :body => 'foo', :headers => {})
37
+ end
38
+
39
+ it { lambda { fetcher.fetch('http://foo.com') }.should raise_exception(Net::HTTPFatalError) }
40
+
41
+ end
42
+
43
+ end
44
+
45
+ end
@@ -0,0 +1,16 @@
1
+ require 'spec_helper'
2
+
3
+ describe LinkThumbnailer::ImgComparator do
4
+
5
+ class Foo
6
+ end
7
+
8
+ let(:foo) { Foo.new }
9
+
10
+ before do
11
+ foo.extend(LinkThumbnailer::ImgComparator)
12
+ end
13
+
14
+ it { should respond_to :<=> }
15
+
16
+ end
@@ -0,0 +1,31 @@
1
+ require 'spec_helper'
2
+
3
+ describe LinkThumbnailer::ImgUrlFilter do
4
+
5
+ it { should respond_to :reject? }
6
+
7
+ describe ".reject?" do
8
+
9
+ let(:img_url_filter) { LinkThumbnailer::ImgUrlFilter.new }
10
+
11
+ before do
12
+ LinkThumbnailer.configure {|config| config.blacklist_urls = [
13
+ %r{^http://not_valid\.net/}
14
+ ]}
15
+ end
16
+
17
+ context "when img_url does not contain any blacklisted urls" do
18
+
19
+ it { img_url_filter.reject?('http://valid.com/foo/bar.png').should be_false }
20
+
21
+ end
22
+
23
+ context "when img_url does contain any blacklisted urls" do
24
+
25
+ it { img_url_filter.reject?('http://not_valid.net/foo/bar.png').should be_true }
26
+
27
+ end
28
+
29
+ end
30
+
31
+ end
@@ -2,7 +2,8 @@ require 'spec_helper'
2
2
 
3
3
  describe LinkThumbnailer do
4
4
 
5
- let(:og_example) { File.open(File.dirname(__FILE__) + '/examples/og_example.html').read() }
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() }
6
7
 
7
8
  it { should respond_to :configuration }
8
9
  it { should respond_to :configure }
@@ -99,7 +100,7 @@ describe LinkThumbnailer do
99
100
  subject { LinkThumbnailer.generate('http://zerply.com') }
100
101
 
101
102
  it { should_not be_nil }
102
- it { subject.valid?.should be_true }
103
+ it { should be_valid }
103
104
 
104
105
  end
105
106
 
@@ -116,7 +117,7 @@ describe LinkThumbnailer do
116
117
  subject { LinkThumbnailer.generate('foo') }
117
118
 
118
119
  it { should_not be_nil }
119
- it { subject.valid?.should be_true }
120
+ it { should be_valid }
120
121
 
121
122
  end
122
123
 
@@ -129,7 +130,7 @@ describe LinkThumbnailer do
129
130
  subject { LinkThumbnailer.generate('http://zerply.com') }
130
131
 
131
132
  it { should_not be_nil }
132
- it { subject.valid?.should be_true }
133
+ it { should be_valid }
133
134
 
134
135
  end
135
136
 
@@ -0,0 +1,95 @@
1
+ require 'spec_helper'
2
+
3
+ describe LinkThumbnailer::Object do
4
+
5
+ it { should respond_to :valid? }
6
+
7
+ let(:object) { LinkThumbnailer::Object.new }
8
+
9
+ describe ".method_missing" do
10
+
11
+ before do
12
+ object[:foo] = 'foo'
13
+ end
14
+
15
+ subject { object }
16
+
17
+ it { subject.foo.should eq('foo') }
18
+ it { subject.foo?.should be_true }
19
+ it { subject.bar.should be_nil }
20
+ it { subject.bar?.should be_false }
21
+
22
+ end
23
+
24
+ describe ".valid" do
25
+
26
+ before do
27
+ LinkThumbnailer.configure {|config|}
28
+ end
29
+
30
+ context "when strict" do
31
+
32
+ before do
33
+ LinkThumbnailer.configure { |config| config.strict = true }
34
+ end
35
+
36
+ context "and valid" do
37
+
38
+ before do
39
+ LinkThumbnailer.configuration.mandatory_attributes.each { |a| object[a] = 'foo' }
40
+ end
41
+
42
+ subject { object }
43
+
44
+ it { should be_valid }
45
+ it { subject.keys.should eq(LinkThumbnailer.configuration.mandatory_attributes) }
46
+ it { subject.values.should include 'foo' }
47
+
48
+ end
49
+
50
+ context "and not valid" do
51
+
52
+ subject { object }
53
+
54
+ it { should_not be_valid }
55
+ it { subject.keys.should be_empty }
56
+ it { subject.values.should be_empty }
57
+
58
+ end
59
+
60
+ end
61
+
62
+ context "when not strict" do
63
+
64
+ before do
65
+ LinkThumbnailer.configure { |config| config.strict = false }
66
+ end
67
+
68
+ context "and empty" do
69
+
70
+ subject { object }
71
+
72
+ it { should_not be_valid }
73
+ it { subject.keys.should be_empty }
74
+ it { subject.values.should be_empty }
75
+
76
+ end
77
+
78
+ context "and not empty" do
79
+
80
+ before do
81
+ object[:foo] = 'foo'
82
+ end
83
+
84
+ subject { object }
85
+
86
+ it { should be_valid }
87
+ it { subject.foo.should eq('foo') }
88
+
89
+ end
90
+
91
+ end
92
+
93
+ end
94
+
95
+ end
@@ -0,0 +1,7 @@
1
+ require 'spec_helper'
2
+
3
+ describe LinkThumbnailer::Opengraph do
4
+
5
+ it { LinkThumbnailer::Opengraph.should respond_to :parse }
6
+
7
+ end
@@ -0,0 +1,49 @@
1
+ require 'spec_helper'
2
+
3
+ describe LinkThumbnailer::WebImage do
4
+
5
+ class Foo
6
+ end
7
+
8
+ let(:foo) { Foo.new }
9
+
10
+ before do
11
+ foo.extend LinkThumbnailer::WebImage
12
+ end
13
+
14
+ subject { foo }
15
+
16
+ it { should respond_to :to_json }
17
+ it { should respond_to :source_url }
18
+ it { should respond_to :doc }
19
+
20
+ describe ".to_json" do
21
+
22
+ context "with default attributes" do
23
+
24
+ let(:attributes) { %w(source_url) }
25
+
26
+ subject { foo.to_json }
27
+
28
+ it { JSON.parse(subject).first.keys.should eq(attributes) }
29
+
30
+ end
31
+
32
+ context "with all attributes" do
33
+
34
+ let(:attributes) { %w(source_url mime_type density colums rows filesize number_colors) }
35
+
36
+ before do
37
+ attributes.each {|a| foo.class.send(:define_method, a.to_sym) { 'foo' } }
38
+ end
39
+
40
+ subject { foo.to_json }
41
+
42
+ it { puts JSON.parse(subject).map {|e| e.keys.first }.should eq(attributes) }
43
+ it { puts JSON.parse(subject).map {|e| e.values.first }.should include('foo') }
44
+
45
+ end
46
+
47
+ end
48
+
49
+ end
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: 0.0.3
4
+ version: 0.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: 2012-09-24 00:00:00.000000000 Z
12
+ date: 2012-09-27 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: nokogiri
@@ -75,6 +75,22 @@ dependencies:
75
75
  - - ~>
76
76
  - !ruby/object:Gem::Version
77
77
  version: 2.13.1
78
+ - !ruby/object:Gem::Dependency
79
+ name: json
80
+ requirement: !ruby/object:Gem::Requirement
81
+ none: false
82
+ requirements:
83
+ - - ~>
84
+ - !ruby/object:Gem::Version
85
+ version: 1.7.5
86
+ type: :runtime
87
+ prerelease: false
88
+ version_requirements: !ruby/object:Gem::Requirement
89
+ none: false
90
+ requirements:
91
+ - - ~>
92
+ - !ruby/object:Gem::Version
93
+ version: 1.7.5
78
94
  - !ruby/object:Gem::Dependency
79
95
  name: rspec
80
96
  requirement: !ruby/object:Gem::Requirement
@@ -136,9 +152,18 @@ files:
136
152
  - lib/link_thumbnailer/version.rb
137
153
  - lib/link_thumbnailer/web_image.rb
138
154
  - link_thumbnailer.gemspec
155
+ - spec/doc_parser_spec.rb
156
+ - spec/doc_spec.rb
157
+ - spec/examples/example.html
139
158
  - spec/examples/og_example.html
159
+ - spec/fetcher_spec.rb
160
+ - spec/img_comparator_spec.rb
161
+ - spec/img_url_filter_spec.rb
140
162
  - spec/link_thumbnailer_spec.rb
163
+ - spec/object_spec.rb
164
+ - spec/opengraph_spec.rb
141
165
  - spec/spec_helper.rb
166
+ - spec/web_image_spec.rb
142
167
  homepage: https://github.com/gottfrois/link_thumbnailer
143
168
  licenses: []
144
169
  post_install_message:
@@ -165,6 +190,15 @@ specification_version: 3
165
190
  summary: Ruby gem ranking images from a given URL returning an object containing images
166
191
  and website informations.
167
192
  test_files:
193
+ - spec/doc_parser_spec.rb
194
+ - spec/doc_spec.rb
195
+ - spec/examples/example.html
168
196
  - spec/examples/og_example.html
197
+ - spec/fetcher_spec.rb
198
+ - spec/img_comparator_spec.rb
199
+ - spec/img_url_filter_spec.rb
169
200
  - spec/link_thumbnailer_spec.rb
201
+ - spec/object_spec.rb
202
+ - spec/opengraph_spec.rb
170
203
  - spec/spec_helper.rb
204
+ - spec/web_image_spec.rb