technicalpickles-feedra 0.0.2 → 0.1.1
Sign up to get free protection for your applications and to get access to all the features.
- data/.gitignore +2 -0
- data/VERSION +1 -1
- data/feedra.gemspec +12 -7
- data/generators/feedra/templates/feed_error.rb +1 -0
- data/generators/feedra/templates/migration.rb +1 -1
- data/lib/feedra.rb +16 -2
- data/lib/feedra/entry.rb +8 -0
- data/lib/feedra/feed.rb +12 -10
- data/lib/feedra/feed_error.rb +30 -0
- data/lib/summifire.rb +13 -0
- data/spec/entry_spec.rb +20 -0
- data/spec/feed_error_spec.rb +33 -0
- data/spec/feed_spec.rb +84 -0
- data/spec/spec_helper.rb +43 -3
- metadata +14 -7
- data/spec/feedra_spec.rb +0 -7
data/.gitignore
CHANGED
data/VERSION
CHANGED
@@ -1 +1 @@
|
|
1
|
-
0.
|
1
|
+
0.1.1
|
data/feedra.gemspec
CHANGED
@@ -2,11 +2,11 @@
|
|
2
2
|
|
3
3
|
Gem::Specification.new do |s|
|
4
4
|
s.name = %q{feedra}
|
5
|
-
s.version = "0.
|
5
|
+
s.version = "0.1.1"
|
6
6
|
|
7
7
|
s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
|
8
8
|
s.authors = ["Josh Nichols"]
|
9
|
-
s.date = %q{2009-
|
9
|
+
s.date = %q{2009-07-29}
|
10
10
|
s.email = %q{josh@technicalpickles.com}
|
11
11
|
s.extra_rdoc_files = [
|
12
12
|
"LICENSE",
|
@@ -29,26 +29,31 @@ Gem::Specification.new do |s|
|
|
29
29
|
"lib/feedra/entry.rb",
|
30
30
|
"lib/feedra/extensions/feedzirra.rb",
|
31
31
|
"lib/feedra/feed.rb",
|
32
|
-
"
|
32
|
+
"lib/feedra/feed_error.rb",
|
33
|
+
"lib/summifire.rb",
|
34
|
+
"spec/entry_spec.rb",
|
35
|
+
"spec/feed_error_spec.rb",
|
36
|
+
"spec/feed_spec.rb",
|
33
37
|
"spec/spec_helper.rb",
|
34
38
|
"spec/summifire_spec.rb"
|
35
39
|
]
|
36
|
-
s.has_rdoc = true
|
37
40
|
s.homepage = %q{http://github.com/technicalpickles/feedra}
|
38
41
|
s.rdoc_options = ["--charset=UTF-8"]
|
39
42
|
s.require_paths = ["lib"]
|
40
43
|
s.rubyforge_project = %q{pickles}
|
41
|
-
s.rubygems_version = %q{1.3.
|
44
|
+
s.rubygems_version = %q{1.3.4}
|
42
45
|
s.summary = %q{Simple feed aggregation for Rails.}
|
43
46
|
s.test_files = [
|
44
|
-
"spec/
|
47
|
+
"spec/entry_spec.rb",
|
48
|
+
"spec/feed_error_spec.rb",
|
49
|
+
"spec/feed_spec.rb",
|
45
50
|
"spec/spec_helper.rb",
|
46
51
|
"spec/summifire_spec.rb"
|
47
52
|
]
|
48
53
|
|
49
54
|
if s.respond_to? :specification_version then
|
50
55
|
current_version = Gem::Specification::CURRENT_SPECIFICATION_VERSION
|
51
|
-
s.specification_version =
|
56
|
+
s.specification_version = 3
|
52
57
|
|
53
58
|
if Gem::Version.new(Gem::RubyGemsVersion) >= Gem::Version.new('1.2.0') then
|
54
59
|
s.add_runtime_dependency(%q<pauldix-feedzirra>, [">= 0"])
|
data/lib/feedra.rb
CHANGED
@@ -1,5 +1,19 @@
|
|
1
|
-
|
1
|
+
if defined? Rails.configuration
|
2
|
+
config = Rails.configuration
|
2
3
|
|
3
|
-
|
4
|
+
config.gem 'taf2-curb', :lib => 'curb', :version => '0.2.8.0' # feezirra would normally depend on this, but doesn't depend a working it works with
|
5
|
+
config.gem 'pauldix-feedzirra', :lib => 'feedzirra', :source => 'http://gems.github.com'
|
6
|
+
else
|
7
|
+
gem 'taf2-curb', '= 0.2.8.0'
|
8
|
+
gem 'pauldix-feedzirra'
|
9
|
+
|
10
|
+
require 'curb'
|
11
|
+
require 'feedzirra'
|
12
|
+
end
|
13
|
+
|
14
|
+
|
15
|
+
require 'summifire'
|
4
16
|
require 'feedra/entry'
|
17
|
+
require 'feedra/feed'
|
18
|
+
require 'feedra/feed_error'
|
5
19
|
require 'feedra/extensions/feedzirra'
|
data/lib/feedra/entry.rb
CHANGED
@@ -3,6 +3,7 @@ module Feedra
|
|
3
3
|
|
4
4
|
def self.included(other)
|
5
5
|
other.class_eval do
|
6
|
+
extend ClassMethods
|
6
7
|
validates_presence_of :checksum
|
7
8
|
belongs_to :feed
|
8
9
|
end
|
@@ -18,5 +19,12 @@ module Feedra
|
|
18
19
|
Summifire.new(self.summary, self.content).to_s(options)
|
19
20
|
end
|
20
21
|
|
22
|
+
module ClassMethods
|
23
|
+
def find_by_feedzirra_entry(feedzirra_entry)
|
24
|
+
find_by_title_and_url(feedzirra_entry.title, feedzirra_entry.url)
|
25
|
+
end
|
26
|
+
|
27
|
+
end
|
28
|
+
|
21
29
|
end
|
22
30
|
end
|
data/lib/feedra/feed.rb
CHANGED
@@ -12,17 +12,19 @@ module Feedra
|
|
12
12
|
has_many :feed_errors
|
13
13
|
named_scope :stale, lambda {{ :conditions => ['stale_at < ? OR stale_at IS NULL', Time.now] }}
|
14
14
|
|
15
|
-
before_create :populate_metadata_from_feed
|
15
|
+
#before_create :populate_metadata_from_feed
|
16
16
|
before_validation :normalize_feed_url
|
17
17
|
end
|
18
18
|
end
|
19
19
|
|
20
20
|
def create_feed_error_from_exception(ex)
|
21
|
-
|
22
|
-
|
23
|
-
|
24
|
-
|
25
|
-
|
21
|
+
self.feed_errors.create_from_feedzirra_error(ex)
|
22
|
+
end
|
23
|
+
|
24
|
+
def create_entries_from_feedzirra_entries(feedzirra_entries)
|
25
|
+
feedzirra_entries.each do |entry|
|
26
|
+
entry_attributes = build_entry_attributes(entry.attributes)
|
27
|
+
entries.create!(entry_attributes) unless entries.find_by_feedzirra_entry(entry)
|
26
28
|
end
|
27
29
|
end
|
28
30
|
|
@@ -57,16 +59,16 @@ module Feedra
|
|
57
59
|
else
|
58
60
|
feedzirra_feed.sanitize_entries!
|
59
61
|
|
60
|
-
feedzirra_feed.entries
|
61
|
-
entry_attributes = build_entry_attributes(entry.attributes)
|
62
|
-
entries.create!(entry_attributes) unless entries.find_by_checksum(entry.checksum)
|
63
|
-
end
|
62
|
+
create_entries_from_feedzirra_entries(feedzirra_feed.entries)
|
64
63
|
end
|
64
|
+
rescue NoMethodError
|
65
|
+
raise
|
65
66
|
rescue Exception => ex
|
66
67
|
create_feed_error_from_exception(ex)
|
67
68
|
end
|
68
69
|
end
|
69
70
|
|
71
|
+
# hook, in case you need to add anything extra
|
70
72
|
def build_entry_attributes(attributes)
|
71
73
|
attributes
|
72
74
|
end
|
@@ -0,0 +1,30 @@
|
|
1
|
+
module Feedra
|
2
|
+
module FeedError
|
3
|
+
|
4
|
+
def self.included(other)
|
5
|
+
other.class_eval do
|
6
|
+
extend ClassMethods
|
7
|
+
end
|
8
|
+
end
|
9
|
+
|
10
|
+
module ClassMethods
|
11
|
+
def create_from_feedzirra_error(feedzirra_error)
|
12
|
+
attributes = {:error_type => feedzirra_error.class.to_s}
|
13
|
+
|
14
|
+
attributes[:message] = if feedzirra_error.respond_to?(:message)
|
15
|
+
feedzirra_error.message
|
16
|
+
else
|
17
|
+
feedzirra_error.inspect
|
18
|
+
end
|
19
|
+
if feedzirra_error.respond_to?(:backtrace)
|
20
|
+
attributes[:backtrace] = feedzirra_error.backtrace
|
21
|
+
end
|
22
|
+
|
23
|
+
create(attributes)
|
24
|
+
end
|
25
|
+
|
26
|
+
end
|
27
|
+
|
28
|
+
end
|
29
|
+
end
|
30
|
+
|
data/lib/summifire.rb
ADDED
data/spec/entry_spec.rb
ADDED
@@ -0,0 +1,20 @@
|
|
1
|
+
require File.expand_path(File.dirname(__FILE__) + '/spec_helper')
|
2
|
+
|
3
|
+
describe Entry do
|
4
|
+
|
5
|
+
describe "find_by_feedzirra_entry" do
|
6
|
+
|
7
|
+
it "should return a entry found by title and url" do
|
8
|
+
feedzirra_entry = "feedzirra entry"
|
9
|
+
stub(feedzirra_entry).title { "zomg" }
|
10
|
+
stub(feedzirra_entry).url { "http://example.com/zomg" }
|
11
|
+
|
12
|
+
entry = "entry"
|
13
|
+
mock(Entry).find(:first, :conditions => {:title => "zomg", :url => "http://example.com/zomg"}) { entry }
|
14
|
+
|
15
|
+
Entry.find_by_feedzirra_entry(feedzirra_entry).should == entry
|
16
|
+
end
|
17
|
+
|
18
|
+
end
|
19
|
+
|
20
|
+
end
|
@@ -0,0 +1,33 @@
|
|
1
|
+
require File.expand_path(File.dirname(__FILE__) + '/spec_helper')
|
2
|
+
|
3
|
+
describe FeedError do
|
4
|
+
describe "create_from_feedzirra_error" do
|
5
|
+
it "should work from a Fixnum" do
|
6
|
+
expected_attributes = {:error_type => "Fixnum", :message => "404"}
|
7
|
+
|
8
|
+
mock(FeedError).create(expected_attributes)
|
9
|
+
|
10
|
+
FeedError.create_from_feedzirra_error(404)
|
11
|
+
end
|
12
|
+
|
13
|
+
it "should work from nil" do
|
14
|
+
expected_attributes = {:error_type => "NilClass", :message => "nil"}
|
15
|
+
|
16
|
+
mock(FeedError).create(expected_attributes)
|
17
|
+
|
18
|
+
FeedError.create_from_feedzirra_error(nil)
|
19
|
+
end
|
20
|
+
|
21
|
+
it "should work from an RuntimeError or otherwise" do
|
22
|
+
expected_attributes = {:error_type => "RuntimeError", :message => "zomg", :backtrace => "somebacktrace"}
|
23
|
+
|
24
|
+
mock(FeedError).create(expected_attributes)
|
25
|
+
|
26
|
+
feedzirra_error = RuntimeError.new
|
27
|
+
stub(feedzirra_error).backtrace { "somebacktrace" }
|
28
|
+
stub(feedzirra_error).message { "zomg" }
|
29
|
+
FeedError.create_from_feedzirra_error(feedzirra_error)
|
30
|
+
end
|
31
|
+
|
32
|
+
end
|
33
|
+
end
|
data/spec/feed_spec.rb
ADDED
@@ -0,0 +1,84 @@
|
|
1
|
+
require File.expand_path(File.dirname(__FILE__) + '/spec_helper')
|
2
|
+
|
3
|
+
describe Feed do
|
4
|
+
it { should validate_presence_of(:feed_url) }
|
5
|
+
it { should have_many(:entries).dependent(:destroy) }
|
6
|
+
it { should have_many(:feed_errors) }
|
7
|
+
|
8
|
+
describe "normalize_feed_url" do
|
9
|
+
it "should prepend http if feed_url is missing it" do
|
10
|
+
feed = Feed.new(:feed_url => 'example.com/atom')
|
11
|
+
|
12
|
+
feed.normalize_feed_url
|
13
|
+
|
14
|
+
feed.feed_url_changed?.should be_true
|
15
|
+
feed.feed_url.should == 'http://example.com/atom'
|
16
|
+
end
|
17
|
+
|
18
|
+
it "should not change if feed_url is nil" do
|
19
|
+
feed = Feed.new(:feed_url => nil)
|
20
|
+
|
21
|
+
feed.normalize_feed_url
|
22
|
+
|
23
|
+
feed.feed_url.should == nil
|
24
|
+
end
|
25
|
+
|
26
|
+
it "should not change if feed_url is a empty string" do
|
27
|
+
feed = Feed.new(:feed_url => "")
|
28
|
+
|
29
|
+
feed.normalize_feed_url
|
30
|
+
|
31
|
+
feed.feed_url.should == ""
|
32
|
+
end
|
33
|
+
end
|
34
|
+
|
35
|
+
describe "fetch!" do
|
36
|
+
it "should create a feed error if feedzirra returns a number" do
|
37
|
+
feed = Feed.new(:feed_url => 'http://example.com/atom')
|
38
|
+
|
39
|
+
stub(Feedzirra::Feed).fetch_and_parse('http://example.com/atom') { 404 }
|
40
|
+
|
41
|
+
mock(feed).create_feed_error_from_exception(404)
|
42
|
+
|
43
|
+
feed.fetch!
|
44
|
+
end
|
45
|
+
|
46
|
+
it "should create a feed error if feedzirra returns nil" do
|
47
|
+
feed = Feed.new(:feed_url => 'http://example.com/atom')
|
48
|
+
|
49
|
+
stub(Feedzirra::Feed).fetch_and_parse('http://example.com/atom') { nil }
|
50
|
+
|
51
|
+
mock(feed).create_feed_error_from_exception(nil)
|
52
|
+
|
53
|
+
feed.fetch!
|
54
|
+
end
|
55
|
+
|
56
|
+
it "should create a feed error if feedzirra raises an error" do
|
57
|
+
feed = Feed.new(:feed_url => 'http://example.com/atom')
|
58
|
+
|
59
|
+
error = RuntimeError.new("zomg")
|
60
|
+
stub(Feedzirra::Feed).fetch_and_parse('http://example.com/atom') { raise error }
|
61
|
+
|
62
|
+
mock(feed).create_feed_error_from_exception(error)
|
63
|
+
|
64
|
+
feed.fetch!
|
65
|
+
end
|
66
|
+
|
67
|
+
it "should create entries from feedzirra entries" do
|
68
|
+
feed = Feed.new(:feed_url => 'http://example.com/atom')
|
69
|
+
|
70
|
+
feedzirra_feed = "fake feed"
|
71
|
+
feedzirra_entries = "fake entries"
|
72
|
+
stub(feedzirra_feed).entries { feedzirra_entries }
|
73
|
+
|
74
|
+
stub(Feedzirra::Feed).fetch_and_parse('http://example.com/atom') { feedzirra_feed }
|
75
|
+
|
76
|
+
mock(feedzirra_feed).sanitize_entries!
|
77
|
+
|
78
|
+
mock(feed).create_entries_from_feedzirra_entries(feedzirra_entries)
|
79
|
+
|
80
|
+
feed.fetch!
|
81
|
+
end
|
82
|
+
end
|
83
|
+
|
84
|
+
end
|
data/spec/spec_helper.rb
CHANGED
@@ -1,9 +1,49 @@
|
|
1
|
-
require 'spec'
|
2
1
|
|
3
|
-
|
4
|
-
|
2
|
+
|
3
|
+
here = File.dirname(__FILE__)
|
4
|
+
$LOAD_PATH.unshift here
|
5
|
+
$LOAD_PATH.unshift "#{here}/../lib"
|
6
|
+
|
7
|
+
require 'activerecord'
|
8
|
+
|
5
9
|
require 'feedra'
|
6
10
|
|
11
|
+
ActiveRecord::Migration.verbose = false
|
12
|
+
RAILS_ENV = 'test'
|
13
|
+
RAILS_ROOT = here
|
14
|
+
RAILS_DEFAULT_LOGGER = Logger.new("#{RAILS_ROOT}/test.log")
|
15
|
+
|
16
|
+
require 'spec'
|
17
|
+
require 'shoulda/active_record/matchers'
|
18
|
+
|
19
|
+
class Feed < ActiveRecord::Base
|
20
|
+
include Feedra::Feed
|
21
|
+
end
|
22
|
+
|
23
|
+
class Entry < ActiveRecord::Base
|
24
|
+
include Feedra::Entry
|
25
|
+
end
|
26
|
+
|
27
|
+
class FeedError < ActiveRecord::Base
|
28
|
+
include Feedra::FeedError
|
29
|
+
end
|
30
|
+
|
31
|
+
require 'shoulda'
|
7
32
|
Spec::Runner.configure do |config|
|
33
|
+
config.mock_with :rr
|
34
|
+
|
35
|
+
config.include(Shoulda::ActiveRecord::Matchers)
|
36
|
+
|
37
|
+
config.before(:all) do
|
38
|
+
FileUtils.mkdir_p "#{here}/migrate"
|
39
|
+
FileUtils.cp "#{here}/../generators/feedra/templates/migration.rb", "#{here}/migrate/001_create_feed_and_events.rb"
|
40
|
+
|
41
|
+
ActiveRecord::Base.logger = Logger.new("#{here}/activerecord_base.log")
|
42
|
+
|
43
|
+
ActiveRecord::Base.establish_connection :adapter => 'sqlite3',
|
44
|
+
:database => ':memory:'
|
45
|
+
|
46
|
+
ActiveRecord::Migrator.migrate "#{here}/migrate"
|
47
|
+
end
|
8
48
|
|
9
49
|
end
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: technicalpickles-feedra
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.1.1
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Josh Nichols
|
@@ -9,7 +9,7 @@ autorequire:
|
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
11
|
|
12
|
-
date: 2009-
|
12
|
+
date: 2009-07-29 00:00:00 -07:00
|
13
13
|
default_executable:
|
14
14
|
dependencies:
|
15
15
|
- !ruby/object:Gem::Dependency
|
@@ -48,11 +48,16 @@ files:
|
|
48
48
|
- lib/feedra/entry.rb
|
49
49
|
- lib/feedra/extensions/feedzirra.rb
|
50
50
|
- lib/feedra/feed.rb
|
51
|
-
-
|
51
|
+
- lib/feedra/feed_error.rb
|
52
|
+
- lib/summifire.rb
|
53
|
+
- spec/entry_spec.rb
|
54
|
+
- spec/feed_error_spec.rb
|
55
|
+
- spec/feed_spec.rb
|
52
56
|
- spec/spec_helper.rb
|
53
57
|
- spec/summifire_spec.rb
|
54
|
-
has_rdoc:
|
58
|
+
has_rdoc: false
|
55
59
|
homepage: http://github.com/technicalpickles/feedra
|
60
|
+
licenses:
|
56
61
|
post_install_message:
|
57
62
|
rdoc_options:
|
58
63
|
- --charset=UTF-8
|
@@ -73,11 +78,13 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
73
78
|
requirements: []
|
74
79
|
|
75
80
|
rubyforge_project: pickles
|
76
|
-
rubygems_version: 1.
|
81
|
+
rubygems_version: 1.3.5
|
77
82
|
signing_key:
|
78
|
-
specification_version:
|
83
|
+
specification_version: 3
|
79
84
|
summary: Simple feed aggregation for Rails.
|
80
85
|
test_files:
|
81
|
-
- spec/
|
86
|
+
- spec/entry_spec.rb
|
87
|
+
- spec/feed_error_spec.rb
|
88
|
+
- spec/feed_spec.rb
|
82
89
|
- spec/spec_helper.rb
|
83
90
|
- spec/summifire_spec.rb
|