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 | 3 | protect 'edit_environment_design', :environment |
4 | 4 | |
5 | 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 | 7 | end |
8 | 8 | |
9 | 9 | end | ... | ... |
app/models/feed_reader_block.rb
... | ... | @@ -27,13 +27,16 @@ class FeedReaderBlock < Block |
27 | 27 | end |
28 | 28 | |
29 | 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 | 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 | 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 | 40 | end |
38 | 41 | end |
39 | 42 | |
... | ... | @@ -41,7 +44,7 @@ class FeedReaderBlock < Block |
41 | 44 | self.feed_items << {:title => title, :link => link} |
42 | 45 | end |
43 | 46 | |
44 | - def clean | |
47 | + def clear | |
45 | 48 | self.feed_items = [] |
46 | 49 | self.feed_title = nil |
47 | 50 | end | ... | ... |
lib/feed_handler.rb
... | ... | @@ -23,12 +23,16 @@ class FeedHandler |
23 | 23 | end |
24 | 24 | |
25 | 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 | 36 | end |
33 | 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 | 20 | color: #CCC; |
3 | 21 | font-size: 11px; |
4 | 22 | text-align: center; | ... | ... |
script/feed-updater
... | ... | @@ -4,10 +4,8 @@ require File.dirname(__FILE__) + '/../config/environment' |
4 | 4 | FeedReaderBlock.find(:all).each do |feed_block| |
5 | 5 | unless feed_block.address.nil? |
6 | 6 | begin |
7 | - feed_block.clean | |
8 | 7 | handler = FeedHandler.new |
9 | 8 | handler.process(feed_block) |
10 | - feed_block.save! | |
11 | 9 | RAILS_DEFAULT_LOGGER.info("%s ID %d fetched at %s" % [feed_block.class.name, feed_block.id, feed_block.fetched_at]) |
12 | 10 | rescue FeedHandler::ParseError => ex |
13 | 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 | 2 | |
3 | 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 | 5 | def setup |
23 | 6 | @handler = FeedHandler.new |
24 | - @container = FeedContainer.new | |
7 | + @container = FeedReaderBlock.create!(:box_id => 99999, :address => 'test/fixtures/files/feed.xml') | |
25 | 8 | end |
26 | 9 | attr_reader :handler, :container |
27 | 10 | |
... | ... | @@ -43,7 +26,7 @@ class FeedHandlerTest < Test::Unit::TestCase |
43 | 26 | should 'process feed and populate container' do |
44 | 27 | handler.process(container) |
45 | 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 | 30 | end |
48 | 31 | |
49 | 32 | should 'raise exception when parser nil' do |
... | ... | @@ -80,4 +63,14 @@ class FeedHandlerTest < Test::Unit::TestCase |
80 | 63 | assert_equal 1, container.feed_items.size |
81 | 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 | 76 | end | ... | ... |
test/unit/feed_reader_block_test.rb
... | ... | @@ -52,20 +52,18 @@ class FeedReaderBlockTest < ActiveSupport::TestCase |
52 | 52 | end |
53 | 53 | |
54 | 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 | 56 | end |
57 | 57 | |
58 | 58 | should 'display last fetched date' do |
59 | 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 | 61 | end |
64 | 62 | |
65 | 63 | should 'clear feed title and items' do |
66 | 64 | feed.feed_items = %w[ last-post second-post first-post ] |
67 | 65 | feed.feed_title = 'Feed Test' |
68 | - feed.clean | |
66 | + feed.clear | |
69 | 67 | assert_nil feed.feed_title |
70 | 68 | assert_equal [], feed.feed_items |
71 | 69 | end | ... | ... |