thornbed 0.1.0 → 0.2.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/README.md CHANGED
@@ -52,3 +52,8 @@ You should inherit from `Thornbed::Providers::Provider`. See imgur.rb for an exa
52
52
  3. Commit your changes (`git commit -am 'Add some feature'`)
53
53
  4. Push to the branch (`git push origin my-new-feature`)
54
54
  5. Create new Pull Request
55
+
56
+
57
+ ## Contributors
58
+
59
+ [frodsan](https://github.com/frodsan)
@@ -10,21 +10,29 @@ module Thornbed
10
10
  end
11
11
 
12
12
  def self.inherited(subclass)
13
- @providers << subclass
13
+ providers << subclass
14
+ end
15
+
16
+ def pattern
17
+ raise NotImplementedError,
18
+ 'Subclasses must implement a pattern method'
14
19
  end
15
20
 
16
21
  def valid?(url)
17
- !!@pattern.match(url)
22
+ !!pattern.match(url)
18
23
  end
19
24
 
20
25
  def provider_name
21
26
  self.class.to_s.split('::')[-1]
22
27
  end
28
+
29
+ def get(url)
30
+ raise NotImplementedError, "Subclasses must implement a get method."
31
+ end
23
32
  end
24
33
 
25
34
  def self.get(url)
26
- providers = Thornbed::Providers::Provider.providers
27
- provider = providers.detect { |p| p.new.valid?(url) }
35
+ provider = Provider.providers.detect { |p| p.new.valid?(url) }
28
36
  raise Thornbed::NotFound, url if provider.nil?
29
37
  provider.new.get(url)
30
38
  end
@@ -0,0 +1,32 @@
1
+ require "uri"
2
+ require "thornbed"
3
+
4
+ module Thornbed::Providers
5
+ class NineGag < Thornbed::Providers::Provider
6
+ attr_accessor :pattern
7
+
8
+ def initialize
9
+ self.pattern = /^http(s)?:\/\/(\w+\.)?(9gag\.com\/|d24w6bsrhbeh9d\.cloudfront\.net\/photo\/)(gag\/|fast#)?(\d+)(\?[\w=]+)?(_\d+b\.jpg)?$/
10
+ end
11
+
12
+ def get(url)
13
+ raise Thornbed::NotValid, url if !valid?(url)
14
+ url = URI.parse(url)
15
+ ptype = "jpg"
16
+
17
+ pic_id = url.path == '/fast' ? url.fragment : /(\d+)/.match(url.path)[0]
18
+
19
+ {
20
+ url: "http://d24w6bsrhbeh9d.cloudfront.net/photo/#{pic_id}_700b.#{ptype}",
21
+ type: "photo",
22
+ provider_name: provider_name,
23
+ provider_url: "http://9gag.com",
24
+ thumbnail_url: "http://d24w6bsrhbeh9d.cloudfront.net/photo/#{pic_id}_fbthumbnail.#{ptype}",
25
+ version: "1.0",
26
+ page: "http://9gag.com/gag/#{pic_id}",
27
+ width: nil,
28
+ height: nil
29
+ }
30
+ end
31
+ end
32
+ end
@@ -3,14 +3,14 @@ require "thornbed"
3
3
 
4
4
  module Thornbed::Providers
5
5
  class Imgur < Thornbed::Providers::Provider
6
+ attr_accessor :pattern
7
+
6
8
  def initialize
7
- @pattern = /^http(s)?:\/\/((i\.)|(www\.))?imgur.com\/(gallery\/)?(\w){5}(s|l|b|m|t)?(\.gif|\.jpg|.jpeg|\.png)?(\?full)?$/
8
- @type = "photo"
9
- @provider_url = "http://imgur.com"
9
+ self.pattern = /^http(s)?:\/\/((i\.)|(www\.))?imgur.com\/(gallery\/)?(\w){5}(s|l|b|m|t)?(\.gif|\.jpg|.jpeg|\.png)?(\?full)?$/
10
10
  end
11
11
 
12
12
  def get(url)
13
- raise Thornbed::NotValid, url if !self.valid?(url)
13
+ raise Thornbed::NotValid, url if !valid?(url)
14
14
  url = URI.parse(url)
15
15
  gallery = /gallery/ =~ url.path
16
16
  direct = /\/(\w){5}(\.gif|\.jpg|\.jpeg|\.png)$/.match(url.path)
@@ -31,9 +31,9 @@ module Thornbed::Providers
31
31
 
32
32
  {
33
33
  url: "http://i.imgur.com/#{pic_id}.#{ptype}",
34
- type: "#{@type}",
35
- provider_name: self.provider_name,
36
- provider_url: @provider_url,
34
+ type: "photo",
35
+ provider_name: provider_name,
36
+ provider_url: "http://imgur.com",
37
37
  thumbnail_url: "http://i.imgur.com/#{pic_id}s.#{ptype}",
38
38
  version: "1.0",
39
39
  page: "http://imgur.com/#{pic_id}",
@@ -3,22 +3,22 @@ require "thornbed"
3
3
 
4
4
  module Thornbed::Providers
5
5
  class Memegenerator < Thornbed::Providers::Provider
6
+ attr_accessor :pattern
7
+
6
8
  def initialize
7
- @pattern = /^http(s)?:\/\/(cdn\.)?memegenerator\.net\/instance(s)?\/(\d+x\/)?\d+(\.jpg)?(\?[\w\W]*)?$/
8
- @type = "photo"
9
- @provider_url = "http://memegenerator.com"
9
+ self.pattern = /^http(s)?:\/\/(cdn\.)?memegenerator\.net\/instance(s)?\/(\d+x\/)?\d+(\.jpg)?(\?[\w\W]*)?$/
10
10
  end
11
11
 
12
12
  def get(url)
13
- raise Thornbed::NotValid, url if !self.valid?(url)
13
+ raise Thornbed::NotValid, url if !valid?(url)
14
14
  url = URI.parse(url)
15
15
  ptype = "jpg"
16
16
  pic_id = /(\d+x\/)?\d+(\.jpg)?(\?[\w\W]*)?$/.match(url.path)
17
17
  {
18
18
  url: "http://cdn.memegenerator.net/instances/400x/#{pic_id}.#{ptype}",
19
- type: "#{@type}",
20
- provider_name: self.provider_name,
21
- provider_url: @provider_url,
19
+ type: "photo",
20
+ provider_name: provider_name,
21
+ provider_url: "http://memegenerator.com",
22
22
  thumbnail_url: "http://cdn.memegenerator.net/instances/100x/#{pic_id}.#{ptype}",
23
23
  version: "1.0",
24
24
  page: "http://memegenerator.net/instance/#{pic_id}",
@@ -3,14 +3,14 @@ require "thornbed"
3
3
 
4
4
  module Thornbed::Providers
5
5
  class QuickMeme < Thornbed::Providers::Provider
6
+ attr_accessor :pattern
7
+
6
8
  def initialize
7
- @pattern = /http(s)?:\/\/(i|t)?(\.)?(www\.)?(quickmeme.com|qkme.me)\/(meme\/)?(\w){6}(\/)?(.jpg)?((\?|#).*)?$/
8
- @type = "photo"
9
- @provider_url = "http://quickmeme.com"
9
+ self.pattern = /http(s)?:\/\/(i|t)?(\.)?(www\.)?(quickmeme.com|qkme.me)\/(meme\/)?(\w){6}(\/)?(.jpg)?((\?|#).*)?$/
10
10
  end
11
11
 
12
12
  def get(url)
13
- raise Thornbed::NotValid, url if !self.valid?(url)
13
+ raise Thornbed::NotValid, url if !valid?(url)
14
14
  url = URI.parse(url)
15
15
  normal = /quickmeme.com/ =~ url.to_s
16
16
  direct = /qkme.me/ =~ url.to_s
@@ -25,9 +25,9 @@ module Thornbed::Providers
25
25
 
26
26
  {
27
27
  url: "http://i.qkme.me/#{pic_id}.#{ptype}",
28
- type: "#{@type}",
29
- provider_name: self.provider_name,
30
- provider_url: @provider_url,
28
+ type: "photo",
29
+ provider_name: provider_name,
30
+ provider_url: "http://quickmeme.com",
31
31
  thumbnail_url: "http://t.qkme.me/#{pic_id}.#{ptype}",
32
32
  version: "1.0",
33
33
  page: "http://quickmeme.com/#{pic_id}/",
@@ -1,3 +1,3 @@
1
1
  module Thornbed
2
- VERSION = "0.1.0"
2
+ VERSION = "0.2.0"
3
3
  end
@@ -0,0 +1,8 @@
1
+ require 'spec_helper'
2
+
3
+ describe Thornbed::Providers::Provider do
4
+ it "raises NotImplementedError when pattern is not implemented in a subclass" do
5
+ klass = Class.new(Thornbed::Providers::Provider)
6
+ -> { klass.new.pattern }.should raise_error(NotImplementedError)
7
+ end
8
+ end
@@ -0,0 +1,44 @@
1
+ require "spec_helper"
2
+
3
+ describe "NineGag" do
4
+ it "should have NineGag as a provider" do
5
+ Thornbed::Providers.constants.should include(:NineGag)
6
+ end
7
+
8
+ it "should accept different NineGag urls" do
9
+ ninegag = Thornbed::Providers::NineGag.new
10
+ ninegag.valid?("http://9gag.com/gag/5931764").should be_true
11
+ ninegag.valid?("http://d24w6bsrhbeh9d.cloudfront.net/photo/5931764_700b.jpg").should be_true
12
+ ninegag.valid?("http://9gag.com/gag/5929873?ref=popular").should be_true
13
+ ninegag.valid?("http://9gag.com/fast#5931764").should be_true
14
+ end
15
+
16
+ it "should return OEmbed hash for NineGag urls" do
17
+ ninegag = Thornbed::Providers::NineGag.new
18
+ res = ninegag.get("http://9gag.com/gag/5931764")
19
+ res.should include(url: "http://d24w6bsrhbeh9d.cloudfront.net/photo/5931764_700b.jpg")
20
+
21
+ res = ninegag.get("http://d24w6bsrhbeh9d.cloudfront.net/photo/5931764_700b.jpg")
22
+ res.should include(url: "http://d24w6bsrhbeh9d.cloudfront.net/photo/5931764_700b.jpg")
23
+
24
+ res = ninegag.get("http://9gag.com/gag/5929873?ref=popular")
25
+ res.should include(url: "http://d24w6bsrhbeh9d.cloudfront.net/photo/5929873_700b.jpg")
26
+
27
+ res = ninegag.get("http://9gag.com/fast#5931764")
28
+ res.should include(url: "http://d24w6bsrhbeh9d.cloudfront.net/photo/5931764_700b.jpg")
29
+ end
30
+
31
+ it "should discover NineGag provider" do
32
+ res = Thornbed.get("http://9gag.com/gag/5931764")
33
+ res.should include(url: "http://d24w6bsrhbeh9d.cloudfront.net/photo/5931764_700b.jpg")
34
+ res.should include(thumbnail_url: "http://d24w6bsrhbeh9d.cloudfront.net/photo/5931764_fbthumbnail.jpg")
35
+ res.should include(page: "http://9gag.com/gag/5931764")
36
+ res.should include(provider_name: "NineGag")
37
+
38
+ res = Thornbed.get("http://9gag.com/fast#5931764")
39
+ res.should include(url: "http://d24w6bsrhbeh9d.cloudfront.net/photo/5931764_700b.jpg")
40
+ res.should include(thumbnail_url: "http://d24w6bsrhbeh9d.cloudfront.net/photo/5931764_fbthumbnail.jpg")
41
+ res.should include(page: "http://9gag.com/gag/5931764")
42
+ res.should include(provider_name: "NineGag")
43
+ end
44
+ end
@@ -29,4 +29,9 @@ describe Thornbed do
29
29
  imgur = Thornbed::Providers::Imgur.new
30
30
  lambda { imgur.get('http://imgur.com/none.jpg') }.should raise_error(Thornbed::NotValid)
31
31
  end
32
+
33
+ it "should raise an error when pattern is not set" do
34
+ foo = Thornbed::Providers::Provider.new
35
+ lambda { foo.get('http://imgur.com/none.jpg') }.should raise_error(NotImplementedError)
36
+ end
32
37
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: thornbed
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.0
4
+ version: 0.2.0
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-11-24 00:00:00.000000000 Z
12
+ date: 2012-11-30 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: ruby-oembed
@@ -141,10 +141,13 @@ files:
141
141
  - lib/thornbed/errors.rb
142
142
  - lib/thornbed/provider.rb
143
143
  - lib/thornbed/providers.rb
144
+ - lib/thornbed/providers/9gag.rb
144
145
  - lib/thornbed/providers/imgur.rb
145
146
  - lib/thornbed/providers/memegenerator.rb
146
147
  - lib/thornbed/providers/quickmeme.rb
147
148
  - lib/thornbed/version.rb
149
+ - spec/provider_spec.rb
150
+ - spec/providers/9gag_spec.rb
148
151
  - spec/providers/imgur_spec.rb
149
152
  - spec/providers/memegenerator_spec.rb
150
153
  - spec/providers/quickmeme_spec.rb
@@ -165,7 +168,7 @@ required_ruby_version: !ruby/object:Gem::Requirement
165
168
  version: '0'
166
169
  segments:
167
170
  - 0
168
- hash: -793414226059006888
171
+ hash: -965882264884968861
169
172
  required_rubygems_version: !ruby/object:Gem::Requirement
170
173
  none: false
171
174
  requirements:
@@ -174,7 +177,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
174
177
  version: '0'
175
178
  segments:
176
179
  - 0
177
- hash: -793414226059006888
180
+ hash: -965882264884968861
178
181
  requirements: []
179
182
  rubyforge_project:
180
183
  rubygems_version: 1.8.24
@@ -183,6 +186,8 @@ specification_version: 3
183
186
  summary: Thornbed provides a single interface to get embeddable content from many
184
187
  sites, even sites with no OEmbed support.
185
188
  test_files:
189
+ - spec/provider_spec.rb
190
+ - spec/providers/9gag_spec.rb
186
191
  - spec/providers/imgur_spec.rb
187
192
  - spec/providers/memegenerator_spec.rb
188
193
  - spec/providers/quickmeme_spec.rb