technicalpickles-feedra 0.0.2 → 0.1.1
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 +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
|