earl 0.3.0 → 1.0.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (55) hide show
  1. data/.document +5 -0
  2. data/.gitignore +4 -15
  3. data/.rspec +1 -0
  4. data/.travis.yml +11 -0
  5. data/Gemfile +2 -2
  6. data/Gemfile.lock +60 -0
  7. data/Guardfile +10 -0
  8. data/LICENSE +2 -4
  9. data/README.rdoc +145 -0
  10. data/Rakefile +35 -2
  11. data/earl.gemspec +13 -7
  12. data/lib/earl.rb +7 -22
  13. data/lib/earl/earl.rb +158 -0
  14. data/lib/earl/scraper.rb +93 -0
  15. data/lib/earl/version.rb +2 -2
  16. data/script/console +10 -0
  17. data/spec/fixtures/bicycles.html +490 -0
  18. data/spec/fixtures/bicycles_without_description.html +489 -0
  19. data/spec/fixtures/bicycles_without_images.html +457 -0
  20. data/spec/fixtures/page_as_atom.html +161 -0
  21. data/spec/fixtures/page_as_rss.html +151 -0
  22. data/spec/fixtures/page_with_atom_feed.html +39 -0
  23. data/spec/fixtures/page_with_rss_and_atom_feeds.html +40 -0
  24. data/spec/fixtures/page_with_rss_feed.html +39 -0
  25. data/spec/fixtures/page_without_feeds.html +36 -0
  26. data/spec/fixtures/youtube.html +1839 -0
  27. data/spec/integration/feed_spec.rb +78 -0
  28. data/spec/integration/oembed_spec.rb +40 -0
  29. data/spec/spec_helper.rb +18 -28
  30. data/spec/support/fixtures.rb +10 -0
  31. data/spec/unit/earl/earl_spec.rb +16 -0
  32. data/spec/unit/earl/feed_spec.rb +59 -0
  33. data/spec/unit/earl/oembed_spec.rb +49 -0
  34. data/spec/unit/earl/scraper_spec.rb +48 -0
  35. data/spec/unit/earl_spec.rb +65 -0
  36. metadata +123 -46
  37. data/.rvmrc +0 -48
  38. data/README.md +0 -41
  39. data/lib/earl/email_assembler.rb +0 -11
  40. data/lib/earl/email_entity.rb +0 -27
  41. data/lib/earl/email_parser.tt +0 -58
  42. data/lib/earl/entity_base.rb +0 -37
  43. data/lib/earl/hash_inquirer.rb +0 -16
  44. data/lib/earl/string_inquirer.rb +0 -11
  45. data/lib/earl/url_assembler.rb +0 -15
  46. data/lib/earl/url_entity.rb +0 -23
  47. data/lib/earl/url_parser.tt +0 -163
  48. data/spec/earl/earl_spec.rb +0 -17
  49. data/spec/earl/email_entity_spec.rb +0 -31
  50. data/spec/earl/email_parser_spec.rb +0 -29
  51. data/spec/earl/entity_base_spec.rb +0 -39
  52. data/spec/earl/hash_inquirer_spec.rb +0 -24
  53. data/spec/earl/string_inquirer_spec.rb +0 -9
  54. data/spec/earl/url_entity_spec.rb +0 -45
  55. data/spec/earl/url_parser_spec.rb +0 -189
@@ -0,0 +1,78 @@
1
+ require 'spec_helper'
2
+
3
+ # These tests hit real network endpoints - not included in the default test runs. Run with:
4
+ # rake spec:integration
5
+ # or
6
+ # rake spec:all
7
+ #
8
+ describe Earl do
9
+ let(:instance) { Earl[url] }
10
+
11
+ subject { instance }
12
+
13
+ context "when page has no feeds associated" do
14
+ let(:url) { 'http://google.com/' }
15
+ its(:has_feed?) { should be_false }
16
+ its(:rss_feed) { should be_nil }
17
+ its(:feed) { should be_nil }
18
+ end
19
+
20
+ context "when page has rss feed associated" do
21
+ let(:url) { 'http://www.readwriteweb.com/' }
22
+ its(:has_feed?) { should be_true }
23
+ its(:rss_feed) { should eql('http://www.readwriteweb.com/rss.xml') }
24
+ its(:feed) { should eql('http://www.readwriteweb.com/rss.xml') }
25
+ end
26
+
27
+ # context "when page has atom feed associated" do
28
+ # let(:url) { 'http:// still looking for a page that just has atom' }
29
+ # its(:has_feed?) { should be_true }
30
+ # its(:atom_feed) { should eql('http://www.readwriteweb.com/atom.xml') }
31
+ # its(:feed) { should eql('http://www.readwriteweb.com/atom.xml') }
32
+ # end
33
+
34
+ context "when page has rss and atom feed associated" do
35
+ let(:url) { 'http://tardate.blogspot.com' }
36
+ let(:expected_rss_feed) { 'http://tardate.blogspot.com/feeds/posts/default?alt=rss' }
37
+ let(:expected_atom_feed) { 'http://tardate.blogspot.com/feeds/posts/default' }
38
+
39
+ its(:has_feed?) { should be_true }
40
+ its(:rss_feed) { should eql(expected_rss_feed) }
41
+ its(:atom_feed) { should eql(expected_atom_feed) }
42
+ describe "#feed" do
43
+ context "default (rss)" do
44
+ subject { instance.feed }
45
+ it { should eql(expected_rss_feed) }
46
+ end
47
+ context "rss prefered" do
48
+ subject { instance.feed(:rss) }
49
+ it { should eql(expected_rss_feed) }
50
+ end
51
+ context "atom prefered" do
52
+ subject { instance.feed(:atom) }
53
+ it { should eql(expected_atom_feed) }
54
+ end
55
+ end
56
+ end
57
+
58
+ context "when page IS an rss feed" do
59
+ let(:url) { 'http://www.readwriteweb.com/rss.xml' }
60
+ its(:url) { should eql(url) }
61
+ its(:base_url) { should eql('http://feeds.feedburner.com/readwriteweb') }
62
+ its(:content_type) { should eql('text/xml') }
63
+ its(:has_feed?) { should be_true }
64
+ its(:rss_feed) { should eql(url) }
65
+ its(:feed) { should eql(url) }
66
+ end
67
+
68
+ context "when page IS an atom feed" do
69
+ let(:url) { 'http://tardate.blogspot.com/feeds/posts/default' }
70
+ its(:url) { should eql(url) }
71
+ its(:base_url) { should eql('http://feeds.feedburner.com/tardate') }
72
+ its(:content_type) { should eql('text/xml') }
73
+ its(:has_feed?) { should be_true }
74
+ its(:atom_feed) { should eql(url) }
75
+ its(:feed) { should eql(url) }
76
+ end
77
+
78
+ end
@@ -0,0 +1,40 @@
1
+ require 'spec_helper'
2
+
3
+ # These tests hit real network endpoints - not included in the default test runs. Run with:
4
+ # rake spec:integration
5
+ # or
6
+ # rake spec:all
7
+ #
8
+ describe Earl do
9
+ let(:instance) { Earl[url] }
10
+
11
+ subject { instance }
12
+
13
+ context "when page does not support oembed" do
14
+ let(:url) { 'http://google.com/' }
15
+ its(:oembed) { should be_nil }
16
+ its(:oembed_html) { should be_nil }
17
+ describe "#metadata" do
18
+ subject { instance.metadata }
19
+ it { subject[:base_url].should match(/google/) }
20
+ it { subject[:content_type].should eql("text/html") }
21
+ it { subject[:html].should be_nil }
22
+ end
23
+ end
24
+
25
+ context "when page supports oembed" do
26
+ let(:url) { 'http://www.youtube.com/watch?v=g3DCEcSlfhw' }
27
+ let(:expected_oembed_html) { %(<iframe width="420" height="315" src="http://www.youtube.com/embed/g3DCEcSlfhw?fs=1&feature=oembed" frameborder="0" allowfullscreen></iframe>) }
28
+
29
+ its(:oembed) { should be_a(Hash) }
30
+ its(:oembed_html) { should eql(expected_oembed_html) }
31
+ describe "#metadata" do
32
+ subject { instance.metadata }
33
+ it { subject[:base_url].should eql("http://www.youtube.com/watch?v=g3DCEcSlfhw") }
34
+ it { subject[:content_type].should eql("text/html") }
35
+ it { subject[:title].should eql("'Virtuosos of Guitar 2008' festival, Moscow. Marcin Dylla") }
36
+ it { subject[:html].should eql(expected_oembed_html) }
37
+ end
38
+ end
39
+
40
+ end
@@ -1,34 +1,24 @@
1
1
  require 'earl'
2
2
 
3
- # Configure RSpec
4
- RSpec.configure do |config|
5
- # Use color
6
- config.color_enabled = true
7
- # Change the formatter
8
- config.formatter = :documentation
9
- end
10
-
11
- # Custom entity manipulation matcher
12
- RSpec::Matchers.define :produce do |expected|
3
+ # Requires supporting files with custom matchers and macros, etc,
4
+ # in ./support/ and its subdirectories.
5
+ Dir["#{File.dirname(__FILE__)}/support/**/*.rb"].each {|f| require f}
13
6
 
14
- match do |entity_class|
15
- entity = entity_class.new @start
16
- @changes.each do |key, value|
17
- entity.send :"#{key}=", value
18
- end
19
- @actual = entity.to_s
20
- @actual == expected
21
- end
22
-
23
- failure_message_for_should do |entity|
24
- %Q{expected that "#{@start}" would become "#{expected}" when given #{@changes}, but was "#{@actual}"}
25
- end
7
+ RSpec.configure do |config|
8
+ # == Mock Framework
9
+ #
10
+ # If you prefer to use mocha, flexmock or RR, uncomment the appropriate line:
11
+ #
12
+ # config.mock_with :mocha
13
+ # config.mock_with :flexmock
14
+ # config.mock_with :rr
15
+ config.mock_with :rspec
26
16
 
27
- chain :from do |start|
28
- @start = start
29
- end
17
+ # Remove this line if you're not using ActiveRecord or ActiveRecord fixtures
18
+ # config.fixture_path = "#{::Rails.root}/spec/fixtures"
30
19
 
31
- chain :when_given do |changes|
32
- @changes = changes
33
- end
20
+ # If you're not using ActiveRecord, or you'd prefer not to run each of your
21
+ # examples within a transaction, remove the following line or assign false
22
+ # instead of true.
23
+ # config.use_transactional_fixtures = true
34
24
  end
@@ -0,0 +1,10 @@
1
+ module FixtureHelper
2
+ def fixture(name)
3
+ # File.new( File.dirname(__FILE__) + "/../fixtures/#{name}.html" ).read
4
+ File.dirname(__FILE__) + "/../fixtures/#{name}.html"
5
+ end
6
+ end
7
+
8
+ RSpec.configure do |conf|
9
+ conf.include FixtureHelper
10
+ end
@@ -0,0 +1,16 @@
1
+ require 'spec_helper'
2
+
3
+ describe Earl do
4
+
5
+
6
+ describe '##new' do
7
+ subject { Earl.new('http://test.host/') }
8
+ its(:to_s) { should eql('http://test.host/') }
9
+ end
10
+
11
+ describe '[]=' do
12
+ subject { Earl['http://test.host/'] }
13
+ its(:to_s) { should eql('http://test.host/') }
14
+ end
15
+
16
+ end
@@ -0,0 +1,59 @@
1
+ require 'spec_helper'
2
+
3
+ describe Earl do
4
+ let(:instance) { Earl[url] }
5
+ let(:url) { 'http:://example.com' }
6
+
7
+ before { Earl.any_instance.stub(:uri).and_return(source) }
8
+ subject { instance }
9
+
10
+ context "when page has no feeds associated" do
11
+ let(:source) { fixture(:page_without_feeds) }
12
+ its(:has_feed?) { should be_false }
13
+ its(:rss_feed) { should be_nil }
14
+ its(:feed) { should be_nil }
15
+ end
16
+
17
+ context "when page has rss feed associated" do
18
+ let(:source) { fixture(:page_with_rss_feed) }
19
+ its(:has_feed?) { should be_true }
20
+ its(:rss_feed) { should eql('http://www.readwriteweb.com/rss.xml') }
21
+ its(:feed) { should eql('http://www.readwriteweb.com/rss.xml') }
22
+ end
23
+
24
+ context "when page has atom feed associated" do
25
+ let(:source) { fixture(:page_with_atom_feed) }
26
+ its(:has_feed?) { should be_true }
27
+ its(:atom_feed) { should eql('http://www.readwriteweb.com/atom.xml') }
28
+ its(:feed) { should eql('http://www.readwriteweb.com/atom.xml') }
29
+ end
30
+
31
+ context "when page has rss and atom feed associated" do
32
+ let(:source) { fixture(:page_with_rss_and_atom_feeds) }
33
+ its(:has_feed?) { should be_true }
34
+ its(:rss_feed) { should eql('http://www.readwriteweb.com/rss.xml') }
35
+ its(:atom_feed) { should eql('http://www.readwriteweb.com/atom.xml') }
36
+ describe "#feed" do
37
+ context "default (rss)" do
38
+ subject { instance.feed }
39
+ it { should eql('http://www.readwriteweb.com/rss.xml') }
40
+ end
41
+ context "rss prefered" do
42
+ subject { instance.feed(:rss) }
43
+ it { should eql('http://www.readwriteweb.com/rss.xml') }
44
+ end
45
+ context "atom prefered" do
46
+ subject { instance.feed(:atom) }
47
+ it { should eql('http://www.readwriteweb.com/atom.xml') }
48
+ end
49
+ end
50
+ end
51
+
52
+ # context "when page IS an rss feed" do
53
+ # let(:source) { fixture(:page_as_rss) }
54
+ # its(:has_feed?) { should be_true }
55
+ # its(:rss_feed) { should eql(url) }
56
+ # its(:feed) { should eql(url) }
57
+ # end
58
+
59
+ end
@@ -0,0 +1,49 @@
1
+ require 'spec_helper'
2
+
3
+ class MockOembedResponse
4
+ def body
5
+ { 'html' => '<iframe/>' }
6
+ end
7
+ end
8
+
9
+ describe Earl do
10
+ let(:instance) { Earl.new(url,options) }
11
+ let(:url) { 'http:://example.com' }
12
+ let(:options) { {} }
13
+
14
+ describe "#oembed_options" do
15
+ subject { instance.oembed_options }
16
+ context "with default options" do
17
+ let(:expected) { { :maxwidth => "560", :maxheight => "315" } }
18
+ it { should eql(expected) }
19
+ end
20
+ context "with custom options" do
21
+ let(:options) { { :oembed => { :maxwidth => "260" } } }
22
+ let(:expected) { { :maxwidth => "260", :maxheight => "315" } }
23
+ it { should eql(expected) }
24
+ end
25
+ context "with custom options passed to oembed" do
26
+ let(:expected) { { :maxwidth => "360", :maxheight => "315" } }
27
+ before do
28
+ Oembedr.stub(:fetch).and_return(nil)
29
+ instance.oembed({ :maxwidth => "360" })
30
+ end
31
+ it { should eql(expected) }
32
+ end
33
+ end
34
+
35
+ describe "#oembed" do
36
+ let(:dummy_response) { MockOembedResponse.new }
37
+ before do
38
+ instance.stub(:base_url).and_return('')
39
+ Oembedr.stub(:fetch).and_return(dummy_response)
40
+ end
41
+ subject { instance.oembed }
42
+ it { should eql({ :html => '<iframe/>' }) }
43
+ describe "#oembed_html" do
44
+ subject { instance.oembed_html }
45
+ it { should eql('<iframe/>') }
46
+ end
47
+ end
48
+
49
+ end
@@ -0,0 +1,48 @@
1
+ require 'spec_helper'
2
+
3
+ describe Earl::Scraper do
4
+
5
+ before :each do
6
+ Earl.any_instance.stub(:uri_response).and_return(<<-DOC
7
+ <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN" "http://www.w3.org/TR/REC-html40/loose.dtd">
8
+ <html></html>
9
+ DOC
10
+ )
11
+ end
12
+
13
+ describe 'When validating URLs' do
14
+ before :each do
15
+ class Earl::TestScraper < Earl::Scraper
16
+ match /^http\:\/\/www\.test\.com\/$/
17
+ define_attribute(:title) {|response| :test_title }
18
+ end
19
+ end
20
+
21
+ it 'should return the result if the URL matches the scraper regexp' do
22
+ Earl['http://www.test.com/'].title.should == :test_title
23
+ end
24
+ end
25
+
26
+ describe 'When retrieving the response' do
27
+ it 'should return a Nokogiri document' do
28
+ Earl['test'].response.css('html').size.should == 1
29
+ end
30
+ end
31
+
32
+ describe 'Scraper inheritance' do
33
+ class SubScraper < Earl::Scraper
34
+ define_attribute :some_attribute do |doc|
35
+ doc
36
+ end
37
+ end
38
+
39
+ it 'inherits all attributes from its superclass' do
40
+ scraper = SubScraper.new('foo.bar')
41
+ scraper.attributes.should include(:title)
42
+ scraper.attributes.should include(:description)
43
+ scraper.attributes.should include(:image)
44
+ scraper.attributes.should include(:some_attribute)
45
+ end
46
+ end
47
+
48
+ end
@@ -0,0 +1,65 @@
1
+ require 'spec_helper'
2
+
3
+ describe Earl do
4
+
5
+ before { Earl.any_instance.stub(:uri).and_return(source) }
6
+ let(:url) { 'http://mock.net' }
7
+ let(:instance) { Earl[url] }
8
+ subject { instance }
9
+
10
+ describe '#title' do
11
+ context "example with title tag" do
12
+ let(:source) { fixture(:bicycles) }
13
+ its(:title) { should eql('bicycles (bicycles) on Twitter') }
14
+ end
15
+ context "youtube example with title tag" do
16
+ let(:source) { fixture(:youtube) }
17
+ its(:title) { should eql('YouTube - Symptoms of Swine Flu') }
18
+ end
19
+ end
20
+
21
+ describe '#description' do
22
+ context "example with description tag" do
23
+ let(:source) { fixture(:bicycles) }
24
+ its(:description) { should eql('I write business plans for a living and fiction to stay sane. I also try my hand at all sorts of creative side projects: painting, game dev, whiskey drinking..') }
25
+ end
26
+ context "example without description tag" do
27
+ let(:source) { fixture(:bicycles_without_description) }
28
+ its(:description) { should be_nil }
29
+ end
30
+ end
31
+
32
+ describe '#image' do
33
+ context "example with image tag" do
34
+ let(:source) { fixture(:bicycles) }
35
+ its(:image) { should eql('http://assets0.twitter.com/images/loader.gif') }
36
+ end
37
+ context "example without image tag" do
38
+ let(:source) { fixture(:bicycles_without_images) }
39
+ its(:image) { should be_nil }
40
+ end
41
+ end
42
+
43
+ describe '#attributes' do
44
+ let(:source) { fixture(:bicycles) }
45
+ its(:attributes) { should be_an(Array) }
46
+ [ :description, :title, :image ].each do |attribute|
47
+ its(:attributes) { should include(attribute) }
48
+ end
49
+ end
50
+
51
+ describe '#metadata' do
52
+ let(:source) { fixture(:bicycles) }
53
+ its(:metadata) { should be_a(Hash) }
54
+ its(:metadata) { should eql({
55
+ :title => 'bicycles (bicycles) on Twitter',
56
+ :description => 'I write business plans for a living and fiction to stay sane. I also try my hand at all sorts of creative side projects: painting, game dev, whiskey drinking..',
57
+ :image => 'http://assets0.twitter.com/images/loader.gif',
58
+ :rss_feed => "/statuses/user_timeline/user_id.rss",
59
+ :base_url => "http://mock.net",
60
+ :feed => "/statuses/user_timeline/user_id.rss"
61
+ }) }
62
+ end
63
+
64
+ end
65
+
metadata CHANGED
@@ -1,83 +1,149 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: earl
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.3.0
4
+ version: 1.0.0
5
5
  prerelease:
6
6
  platform: ruby
7
7
  authors:
8
- - Jeremy Ruppel
8
+ - teejayvanslyke
9
+ - Paul Gallagher
9
10
  autorequire:
10
11
  bindir: bin
11
12
  cert_chain: []
12
- date: 2012-04-25 00:00:00.000000000 Z
13
+ date: 2012-10-16 00:00:00.000000000 Z
13
14
  dependencies:
14
15
  - !ruby/object:Gem::Dependency
15
- name: treetop
16
- requirement: !ruby/object:Gem::Requirement
16
+ name: nokogiri
17
+ requirement: &70141387965520 !ruby/object:Gem::Requirement
17
18
  none: false
18
19
  requirements:
19
20
  - - ! '>='
20
21
  - !ruby/object:Gem::Version
21
- version: 1.4.10
22
+ version: 1.4.4
22
23
  type: :runtime
23
24
  prerelease: false
24
- version_requirements: !ruby/object:Gem::Requirement
25
+ version_requirements: *70141387965520
26
+ - !ruby/object:Gem::Dependency
27
+ name: oembedr
28
+ requirement: &70141387964980 !ruby/object:Gem::Requirement
25
29
  none: false
26
30
  requirements:
27
31
  - - ! '>='
28
32
  - !ruby/object:Gem::Version
29
- version: 1.4.10
33
+ version: 1.0.0
34
+ type: :runtime
35
+ prerelease: false
36
+ version_requirements: *70141387964980
37
+ - !ruby/object:Gem::Dependency
38
+ name: bundler
39
+ requirement: &70141387964420 !ruby/object:Gem::Requirement
40
+ none: false
41
+ requirements:
42
+ - - ! '>'
43
+ - !ruby/object:Gem::Version
44
+ version: 1.1.0
45
+ type: :development
46
+ prerelease: false
47
+ version_requirements: *70141387964420
48
+ - !ruby/object:Gem::Dependency
49
+ name: rake
50
+ requirement: &70141387963920 !ruby/object:Gem::Requirement
51
+ none: false
52
+ requirements:
53
+ - - ~>
54
+ - !ruby/object:Gem::Version
55
+ version: 0.9.2.2
56
+ type: :development
57
+ prerelease: false
58
+ version_requirements: *70141387963920
30
59
  - !ruby/object:Gem::Dependency
31
60
  name: rspec
32
- requirement: !ruby/object:Gem::Requirement
61
+ requirement: &70141387963380 !ruby/object:Gem::Requirement
33
62
  none: false
34
63
  requirements:
35
- - - ! '>='
64
+ - - ~>
36
65
  - !ruby/object:Gem::Version
37
- version: 2.9.0
66
+ version: 2.8.0
38
67
  type: :development
39
68
  prerelease: false
40
- version_requirements: !ruby/object:Gem::Requirement
69
+ version_requirements: *70141387963380
70
+ - !ruby/object:Gem::Dependency
71
+ name: rdoc
72
+ requirement: &70141387962880 !ruby/object:Gem::Requirement
41
73
  none: false
42
74
  requirements:
43
- - - ! '>='
75
+ - - ~>
76
+ - !ruby/object:Gem::Version
77
+ version: '3.11'
78
+ type: :development
79
+ prerelease: false
80
+ version_requirements: *70141387962880
81
+ - !ruby/object:Gem::Dependency
82
+ name: guard-rspec
83
+ requirement: &70141387962240 !ruby/object:Gem::Requirement
84
+ none: false
85
+ requirements:
86
+ - - ~>
44
87
  - !ruby/object:Gem::Version
45
- version: 2.9.0
46
- description: What URI wishes it could look like
88
+ version: 1.2.0
89
+ type: :development
90
+ prerelease: false
91
+ version_requirements: *70141387962240
92
+ - !ruby/object:Gem::Dependency
93
+ name: rb-fsevent
94
+ requirement: &70141387961480 !ruby/object:Gem::Requirement
95
+ none: false
96
+ requirements:
97
+ - - ~>
98
+ - !ruby/object:Gem::Version
99
+ version: 0.9.1
100
+ type: :development
101
+ prerelease: false
102
+ version_requirements: *70141387961480
103
+ description: URL metadata API
47
104
  email:
48
- - jeremy.ruppel@gmail.com
105
+ - tj@elctech.com
106
+ - gallagher.paul@gmail.com
49
107
  executables: []
50
108
  extensions: []
51
109
  extra_rdoc_files: []
52
110
  files:
111
+ - .document
53
112
  - .gitignore
54
- - .rvmrc
113
+ - .rspec
114
+ - .travis.yml
55
115
  - Gemfile
116
+ - Gemfile.lock
117
+ - Guardfile
56
118
  - LICENSE
57
- - README.md
119
+ - README.rdoc
58
120
  - Rakefile
59
121
  - earl.gemspec
60
122
  - lib/earl.rb
61
- - lib/earl/email_assembler.rb
62
- - lib/earl/email_entity.rb
63
- - lib/earl/email_parser.tt
64
- - lib/earl/entity_base.rb
65
- - lib/earl/hash_inquirer.rb
66
- - lib/earl/string_inquirer.rb
67
- - lib/earl/url_assembler.rb
68
- - lib/earl/url_entity.rb
69
- - lib/earl/url_parser.tt
123
+ - lib/earl/earl.rb
124
+ - lib/earl/scraper.rb
70
125
  - lib/earl/version.rb
71
- - spec/earl/earl_spec.rb
72
- - spec/earl/email_entity_spec.rb
73
- - spec/earl/email_parser_spec.rb
74
- - spec/earl/entity_base_spec.rb
75
- - spec/earl/hash_inquirer_spec.rb
76
- - spec/earl/string_inquirer_spec.rb
77
- - spec/earl/url_entity_spec.rb
78
- - spec/earl/url_parser_spec.rb
126
+ - script/console
127
+ - spec/fixtures/bicycles.html
128
+ - spec/fixtures/bicycles_without_description.html
129
+ - spec/fixtures/bicycles_without_images.html
130
+ - spec/fixtures/page_as_atom.html
131
+ - spec/fixtures/page_as_rss.html
132
+ - spec/fixtures/page_with_atom_feed.html
133
+ - spec/fixtures/page_with_rss_and_atom_feeds.html
134
+ - spec/fixtures/page_with_rss_feed.html
135
+ - spec/fixtures/page_without_feeds.html
136
+ - spec/fixtures/youtube.html
137
+ - spec/integration/feed_spec.rb
138
+ - spec/integration/oembed_spec.rb
79
139
  - spec/spec_helper.rb
80
- homepage: https://github.com/remind101/earl
140
+ - spec/support/fixtures.rb
141
+ - spec/unit/earl/earl_spec.rb
142
+ - spec/unit/earl/feed_spec.rb
143
+ - spec/unit/earl/oembed_spec.rb
144
+ - spec/unit/earl/scraper_spec.rb
145
+ - spec/unit/earl_spec.rb
146
+ homepage: https://github.com/evendis/earl
81
147
  licenses: []
82
148
  post_install_message:
83
149
  rdoc_options: []
@@ -97,17 +163,28 @@ required_rubygems_version: !ruby/object:Gem::Requirement
97
163
  version: '0'
98
164
  requirements: []
99
165
  rubyforge_project:
100
- rubygems_version: 1.8.19
166
+ rubygems_version: 1.8.15
101
167
  signing_key:
102
168
  specification_version: 3
103
- summary: What URI wishes it could look like
169
+ summary: URL metadata API for scraping titles, descriptions, images, and videos from
170
+ URL's
104
171
  test_files:
105
- - spec/earl/earl_spec.rb
106
- - spec/earl/email_entity_spec.rb
107
- - spec/earl/email_parser_spec.rb
108
- - spec/earl/entity_base_spec.rb
109
- - spec/earl/hash_inquirer_spec.rb
110
- - spec/earl/string_inquirer_spec.rb
111
- - spec/earl/url_entity_spec.rb
112
- - spec/earl/url_parser_spec.rb
172
+ - spec/fixtures/bicycles.html
173
+ - spec/fixtures/bicycles_without_description.html
174
+ - spec/fixtures/bicycles_without_images.html
175
+ - spec/fixtures/page_as_atom.html
176
+ - spec/fixtures/page_as_rss.html
177
+ - spec/fixtures/page_with_atom_feed.html
178
+ - spec/fixtures/page_with_rss_and_atom_feeds.html
179
+ - spec/fixtures/page_with_rss_feed.html
180
+ - spec/fixtures/page_without_feeds.html
181
+ - spec/fixtures/youtube.html
182
+ - spec/integration/feed_spec.rb
183
+ - spec/integration/oembed_spec.rb
113
184
  - spec/spec_helper.rb
185
+ - spec/support/fixtures.rb
186
+ - spec/unit/earl/earl_spec.rb
187
+ - spec/unit/earl/feed_spec.rb
188
+ - spec/unit/earl/oembed_spec.rb
189
+ - spec/unit/earl/scraper_spec.rb
190
+ - spec/unit/earl_spec.rb