Last active
December 23, 2015 23:19
-
-
Save shicholas/6709232 to your computer and use it in GitHub Desktop.
RssMessenger Kata 9/25/2013 - Instantiate the class with RSSMessenger.new(<url of your favorite rss>).create_messages and you will see a unique list of messages!
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
# -*- coding: utf-8 -*- | |
require 'feedzirra' | |
require 'fileutils' | |
class RSSMessenger | |
attr_reader :feed | |
def initialize(feed) | |
@feed = process_feed(feed) | |
end | |
def create_messages | |
new_entries.each do |entry| | |
puts %Q{#{entry.author} wrote "#{entry.title}" at #{entry.url}} # !> method redefined; discarding old url | |
end | |
end | |
def process_feed(feed) | |
if /\Ahttp/ =~ feed | |
Feedzirra::Feed.fetch_and_parse(feed) | |
else | |
Feedzirra::Feed.parse(feed) | |
end | |
end | |
def path_name | |
"lib/processed_feeds/#{@feed.title}.txt" | |
end | |
def write_marshal | |
File.open("lib/processed_feeds/#{@feed.title}.txt", "w") {|f| f.write(Marshal.dump(@feed)) } | |
end | |
def new_entries | |
FileUtils.mkdir_p("lib/processed_feeds/") | |
if File.exists?(path_name) | |
old_feed = Marshal.load(File.read(path_name)) | |
if @feed.entries.first == old_feed.entries.first | |
return [] | |
else | |
write_marshal | |
return @feed.entries.reject { |entry| entry.published <= old_feed.entries.first.published } | |
end | |
else | |
write_marshal | |
return @feed.entries | |
end | |
end | |
end |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
require 'spec_helper' | |
describe RSSMessenger do | |
let(:sparkfun) { "https://www.sparkfun.com/feeds/news"} | |
let(:adafruit) { "http://www.adafruit.com/blog/feed/" } | |
let(:old_feed) { File.read("spec/support/old_feed.xml") } | |
let(:new_feed) { File.read("spec/support/new_feed.xml") } | |
let(:old_rss) { RSSMessenger.new(old_feed) } | |
let(:new_rss) { RSSMessenger.new(new_feed) } | |
context '#initialize' do | |
it 'should require a url' do | |
expect{RSSMessenger.new}.to raise_error | |
expect{RSSMessenger.new("http://blah.com")}.to_not raise_error | |
end | |
end | |
context '#process_feed' do | |
it "should parse stubbed feeds" do | |
RSSMessenger.new(old_feed).feed.title.should eq "SparkFun Electronics News Posts" | |
end | |
it "should parse website feeds" do | |
RSSMessenger.new(sparkfun).feed.title.should eq "SparkFun Electronics News Posts" | |
end | |
end | |
describe "#create_message" do | |
before do | |
FileUtils.mkdir_p("lib/processed_feeds") | |
if File.exists?("lib/processed_feeds/#{old_rss.feed.title}.txt") | |
File.delete("lib/processed_feeds/#{old_rss.feed.title}.txt") | |
end | |
end | |
it "should write file for old_feed" do | |
new_rss.new_entries | |
File.exists?("lib/processed_feeds/#{new_rss.feed.title}.txt").should be true | |
end | |
it "should re-write file after asking for new feed" do | |
old_rss.new_entries | |
old_file = Marshal.load(File.read("lib/processed_feeds/#{old_rss.feed.title}.txt")) | |
new_rss.new_entries | |
new_file = Marshal.load(File.read("lib/processed_feeds/#{old_rss.feed.title}.txt")) | |
new_file.should_not eq old_file | |
end | |
it "should create 9 messages with old_feed " do | |
old_rss.new_entries.length.should eq 9 | |
end | |
it "should create 1 extra message with new_feed" do | |
old_rss.create_messages | |
File.exists?("lib/processed_feeds/#{old_rss.feed.title}.txt").should be true | |
new_rss.new_entries.length.should eq 1 | |
end | |
end | |
end |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment