Commit 32e3c06e8db35f5051f05951f56f96583247da02
1 parent
47bbb6bf
Exists in
master
and in
29 other branches
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
Showing
7 changed files
with
54 additions
and
40 deletions
Show diff stats
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 < Block | @@ -41,7 +44,7 @@ class FeedReaderBlock < 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__) + '/../config/environment' | @@ -4,10 +4,8 @@ require File.dirname(__FILE__) + '/../config/environment' | ||
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__) + '/../test_helper' | @@ -2,26 +2,9 @@ require File.dirname(__FILE__) + '/../test_helper' | ||
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 < Test::Unit::TestCase | @@ -43,7 +26,7 @@ class FeedHandlerTest < 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 < Test::Unit::TestCase | @@ -80,4 +63,14 @@ class FeedHandlerTest < 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 < ActiveSupport::TestCase | @@ -52,20 +52,18 @@ class FeedReaderBlockTest < 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 |