Skip to content

Instantly share code, notes, and snippets.

@shicholas
Last active December 23, 2015 23:19
Show Gist options
  • Save shicholas/6709232 to your computer and use it in GitHub Desktop.
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!
# -*- 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
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