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 CHANGED
@@ -3,3 +3,5 @@
3
3
  coverage
4
4
  rdoc
5
5
  pkg
6
+ spec/*.log
7
+ spec/migrate/*
data/VERSION CHANGED
@@ -1 +1 @@
1
- 0.0.2
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.0.2"
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-05-26}
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
- "spec/feedra_spec.rb",
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.1}
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/feedra_spec.rb",
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 = 2
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"])
@@ -1,2 +1,3 @@
1
1
  class FeedError < ActiveRecord::Base
2
+ include Feedra::FeedError
2
3
  end
@@ -6,7 +6,7 @@ class CreateFeedAndEvents < ActiveRecord::Migration
6
6
  t.string :etag
7
7
  t.time :last_modified_at
8
8
  t.string :feed_url
9
- t.time :stale_at
9
+ t.datetime :stale_at
10
10
 
11
11
  t.timestamps
12
12
  end
data/lib/feedra.rb CHANGED
@@ -1,5 +1,19 @@
1
- require 'feedzirra'
1
+ if defined? Rails.configuration
2
+ config = Rails.configuration
2
3
 
3
- require 'feedra/feed'
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
- case ex
22
- when Fixnum, nil
23
- self.feed_errors.create :error_type => ex.class.to_s, :message => ex.to_s
24
- else
25
- self.feed_errors.create :error_type => ex.class.to_s, :message => ex.message, :trace => ex.backtrace
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.each do |entry|
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
@@ -0,0 +1,13 @@
1
+ class Summifire
2
+
3
+ attr_accessor :summary, :content
4
+ def initialize(summary, content)
5
+ @summary = summary
6
+ @content = content
7
+ end
8
+
9
+ def to_s(options = {})
10
+ @summary.present? ? @summary : @content
11
+ end
12
+
13
+ end
@@ -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
- $LOAD_PATH.unshift(File.dirname(__FILE__))
4
- $LOAD_PATH.unshift(File.join(File.dirname(__FILE__), '..', 'lib'))
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.0.2
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-05-26 00:00:00 -07:00
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
- - spec/feedra_spec.rb
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: true
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.2.0
81
+ rubygems_version: 1.3.5
77
82
  signing_key:
78
- specification_version: 2
83
+ specification_version: 3
79
84
  summary: Simple feed aggregation for Rails.
80
85
  test_files:
81
- - spec/feedra_spec.rb
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
data/spec/feedra_spec.rb DELETED
@@ -1,7 +0,0 @@
1
- require File.expand_path(File.dirname(__FILE__) + '/spec_helper')
2
-
3
- describe "Feedra" do
4
- it "fails" do
5
- fail "hey buddy, you should probably rename this file and start specing for real"
6
- end
7
- end