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 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