Commit 32e3c06e8db35f5051f05951f56f96583247da02

Authored by Antonio Terceiro
1 parent 47bbb6bf

ActionItem936: enhancements done in pair

  * making the block available for environments
  * moving the status message to the block footer
  * renaming `clean` to `clear`
  * moving all feed processing logic to FeedHandler
  * copied style from recent documents block
  * using actual ActiveRecord object for testing
app/controllers/admin/environment_design_controller.rb
@@ -3,7 +3,7 @@ class EnvironmentDesignController < BoxOrganizerController @@ -3,7 +3,7 @@ class EnvironmentDesignController < BoxOrganizerController
3 protect 'edit_environment_design', :environment 3 protect 'edit_environment_design', :environment
4 4
5 def available_blocks 5 def available_blocks
6 - @available_blocks ||= [ LoginBlock, EnvironmentStatisticsBlock, RecentDocumentsBlock, EnterprisesBlock, CommunitiesBlock, PeopleBlock, SellersSearchBlock, LinkListBlock ] 6 + @available_blocks ||= [ LoginBlock, EnvironmentStatisticsBlock, RecentDocumentsBlock, EnterprisesBlock, CommunitiesBlock, PeopleBlock, SellersSearchBlock, LinkListBlock, FeedReaderBlock ]
7 end 7 end
8 8
9 end 9 end
app/models/feed_reader_block.rb
@@ -27,13 +27,16 @@ class FeedReaderBlock < Block @@ -27,13 +27,16 @@ class FeedReaderBlock < Block
27 end 27 end
28 28
29 def formatted_feed_content 29 def formatted_feed_content
  30 + return "<ul>\n" +
  31 + self.feed_items.map{ |item| "<li><a href='#{item[:link]}'>#{item[:title]}</a></li>" }.join("\n") +
  32 + "</ul>"
  33 + end
  34 +
  35 + def footer
30 if self.fetched_at.nil? or self.feed_items.empty? 36 if self.fetched_at.nil? or self.feed_items.empty?
31 - return ("<p class='feed-reader-block-error'>%s</p>" % _('Feed content was not loaded yet')) 37 + _('Feed content was not loaded yet')
32 else 38 else
33 - return "<ul class='feed-reader-block-list'>" +  
34 - self.feed_items.map{ |item| "<li><a href='#{item[:link]}' class='feed-reader-block-item'>#{item[:title]}</a></li>" }.join("\n") +  
35 - "</ul>" +  
36 - "<div class='feed-reader-block-fetched-at'>#{_("Updated: %s") % show_date(self.fetched_at)}</div>" 39 + _("Updated: %s") % show_date(self.fetched_at)
37 end 40 end
38 end 41 end
39 42
@@ -41,7 +44,7 @@ class FeedReaderBlock &lt; Block @@ -41,7 +44,7 @@ class FeedReaderBlock &lt; Block
41 self.feed_items << {:title => title, :link => link} 44 self.feed_items << {:title => title, :link => link}
42 end 45 end
43 46
44 - def clean 47 + def clear
45 self.feed_items = [] 48 self.feed_items = []
46 self.feed_title = nil 49 self.feed_title = nil
47 end 50 end
lib/feed_handler.rb
@@ -23,12 +23,16 @@ class FeedHandler @@ -23,12 +23,16 @@ class FeedHandler
23 end 23 end
24 24
25 def process(container) 25 def process(container)
26 - content = fetch(container.address)  
27 - container.fetched_at = Time.now  
28 - parse = parse(content)  
29 - container.feed_title = parse.title  
30 - parse.items[0..container.limit-1].each do |item|  
31 - container.add_item(item.title, item.link, item.date, item.content) 26 + container.class.transaction do
  27 + container.clear
  28 + content = fetch(container.address)
  29 + container.fetched_at = Time.now
  30 + parse = parse(content)
  31 + container.feed_title = parse.title
  32 + parse.items[0..container.limit-1].each do |item|
  33 + container.add_item(item.title, item.link, item.date, item.content)
  34 + end
  35 + container.save!
32 end 36 end
33 end 37 end
34 38
public/stylesheets/blocks/feed-reader-block.css
1 -.feed-reader-block-fetched-at { 1 +#content .feed-reader-block {
  2 + padding: 10px 0px 10px 10px;
  3 + overflow: hidden;
  4 +}
  5 +
  6 +.feed-reader-block ul {
  7 + margin: 0px;
  8 + padding: 0px 0px 0px 20px;
  9 +}
  10 +.feed-reader-block li {
  11 + margin: 0px;
  12 + padding: 0px;
  13 +}
  14 +
  15 +.feed-reader-block a {
  16 + text-decoration: none;
  17 +}
  18 +
  19 +.feed-reader-block .block-footer-content {
2 color: #CCC; 20 color: #CCC;
3 font-size: 11px; 21 font-size: 11px;
4 text-align: center; 22 text-align: center;
script/feed-updater
@@ -4,10 +4,8 @@ require File.dirname(__FILE__) + &#39;/../config/environment&#39; @@ -4,10 +4,8 @@ require File.dirname(__FILE__) + &#39;/../config/environment&#39;
4 FeedReaderBlock.find(:all).each do |feed_block| 4 FeedReaderBlock.find(:all).each do |feed_block|
5 unless feed_block.address.nil? 5 unless feed_block.address.nil?
6 begin 6 begin
7 - feed_block.clean  
8 handler = FeedHandler.new 7 handler = FeedHandler.new
9 handler.process(feed_block) 8 handler.process(feed_block)
10 - feed_block.save!  
11 RAILS_DEFAULT_LOGGER.info("%s ID %d fetched at %s" % [feed_block.class.name, feed_block.id, feed_block.fetched_at]) 9 RAILS_DEFAULT_LOGGER.info("%s ID %d fetched at %s" % [feed_block.class.name, feed_block.id, feed_block.fetched_at])
12 rescue FeedHandler::ParseError => ex 10 rescue FeedHandler::ParseError => ex
13 RAILS_DEFAULT_LOGGER.warn("Error parsing content from %s ID %d\n%s" % [feed_block.class.name, feed_block.id, ex.to_s]) 11 RAILS_DEFAULT_LOGGER.warn("Error parsing content from %s ID %d\n%s" % [feed_block.class.name, feed_block.id, ex.to_s])
test/unit/feed_handler_test.rb
@@ -2,26 +2,9 @@ require File.dirname(__FILE__) + &#39;/../test_helper&#39; @@ -2,26 +2,9 @@ require File.dirname(__FILE__) + &#39;/../test_helper&#39;
2 2
3 class FeedHandlerTest < Test::Unit::TestCase 3 class FeedHandlerTest < Test::Unit::TestCase
4 4
5 - class FeedContainer  
6 - attr_accessor :limit  
7 - attr_accessor :fetched_at  
8 - attr_accessor :feed_title  
9 - attr_accessor :feed_items  
10 - attr_accessor :address  
11 - def initialize  
12 - self.limit = 5  
13 - self.feed_title = "Feed Container Mocked"  
14 - self.feed_items = []  
15 - self.address = 'test/fixtures/files/feed.xml'  
16 - end  
17 - def add_item(title, link, date, content)  
18 - self.feed_items << title  
19 - end  
20 - end  
21 -  
22 def setup 5 def setup
23 @handler = FeedHandler.new 6 @handler = FeedHandler.new
24 - @container = FeedContainer.new 7 + @container = FeedReaderBlock.create!(:box_id => 99999, :address => 'test/fixtures/files/feed.xml')
25 end 8 end
26 attr_reader :handler, :container 9 attr_reader :handler, :container
27 10
@@ -43,7 +26,7 @@ class FeedHandlerTest &lt; Test::Unit::TestCase @@ -43,7 +26,7 @@ class FeedHandlerTest &lt; Test::Unit::TestCase
43 should 'process feed and populate container' do 26 should 'process feed and populate container' do
44 handler.process(container) 27 handler.process(container)
45 assert_equal 'Feed for unit tests', container.feed_title 28 assert_equal 'Feed for unit tests', container.feed_title
46 - assert_equal ["Last POST", "Second POST", "First POST"], container.feed_items 29 + assert_equal ["Last POST", "Second POST", "First POST"], container.feed_items.map {|item| item[:title]}
47 end 30 end
48 31
49 should 'raise exception when parser nil' do 32 should 'raise exception when parser nil' do
@@ -80,4 +63,14 @@ class FeedHandlerTest &lt; Test::Unit::TestCase @@ -80,4 +63,14 @@ class FeedHandlerTest &lt; Test::Unit::TestCase
80 assert_equal 1, container.feed_items.size 63 assert_equal 1, container.feed_items.size
81 end 64 end
82 65
  66 + should 'clear the container before processing' do
  67 + container.expects(:clear)
  68 + handler.process(container)
  69 + end
  70 +
  71 + should 'save after processing' do
  72 + container.expects(:save!)
  73 + handler.process(container)
  74 + end
  75 +
83 end 76 end
test/unit/feed_reader_block_test.rb
@@ -52,20 +52,18 @@ class FeedReaderBlockTest &lt; ActiveSupport::TestCase @@ -52,20 +52,18 @@ class FeedReaderBlockTest &lt; ActiveSupport::TestCase
52 end 52 end
53 53
54 should 'notice when content not fetched yet' do 54 should 'notice when content not fetched yet' do
55 - assert_tag_in_string feed.content, :tag => 'p', :content => 'Feed content was not loaded yet' 55 + assert_equal'Feed content was not loaded yet', feed.footer
56 end 56 end
57 57
58 should 'display last fetched date' do 58 should 'display last fetched date' do
59 feed.feed_items = ['one', 'two'] 59 feed.feed_items = ['one', 'two']
60 - assert_tag_in_string feed.content, :tag => 'div',  
61 - :content => "Updated: #{show_date(@fetched_at)}",  
62 - :attributes => {:class => 'feed-reader-block-fetched-at'} 60 + assert_equal "Updated: #{show_date(@fetched_at)}", feed.footer
63 end 61 end
64 62
65 should 'clear feed title and items' do 63 should 'clear feed title and items' do
66 feed.feed_items = %w[ last-post second-post first-post ] 64 feed.feed_items = %w[ last-post second-post first-post ]
67 feed.feed_title = 'Feed Test' 65 feed.feed_title = 'Feed Test'
68 - feed.clean 66 + feed.clear
69 assert_nil feed.feed_title 67 assert_nil feed.feed_title
70 assert_equal [], feed.feed_items 68 assert_equal [], feed.feed_items
71 end 69 end