refinerycms-news 1.2.0 → 2.0.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (89) hide show
  1. data/.gitignore +3 -0
  2. data/.travis.yml +17 -0
  3. data/Gemfile +69 -0
  4. data/Guardfile +20 -0
  5. data/Rakefile +19 -0
  6. data/app/controllers/refinery/news/admin/items_controller.rb +11 -0
  7. data/app/controllers/refinery/news/items_controller.rb +50 -0
  8. data/app/helpers/refinery/news/items_helper.rb +51 -0
  9. data/app/models/refinery/news/item.rb +91 -0
  10. data/app/views/{admin/news_items → refinery/news/admin/items}/_form.html.erb +13 -8
  11. data/app/views/{admin/news_items/_news_item.html.erb → refinery/news/admin/items/_item.html.erb} +8 -8
  12. data/app/views/{admin/news_items → refinery/news/admin/items}/_locale_picker.html.erb +1 -1
  13. data/app/views/{admin/news_items → refinery/news/admin/items}/edit.html.erb +0 -0
  14. data/app/views/refinery/news/admin/items/index.html.erb +30 -0
  15. data/app/views/{admin/news_items → refinery/news/admin/items}/new.html.erb +0 -0
  16. data/app/views/{news_items → refinery/news/items}/_recent_posts.html.erb +2 -2
  17. data/app/views/refinery/news/items/archive.html.erb +17 -0
  18. data/app/views/refinery/news/items/index.html.erb +28 -0
  19. data/app/views/{news_items → refinery/news/items}/index.rss.builder +5 -5
  20. data/app/views/refinery/news/items/show.html.erb +20 -0
  21. data/app/views/refinery/news/items/widgets/_news_archive.html.erb +10 -0
  22. data/app/views/refinery/news/shared/_body_content_right.html.erb +5 -0
  23. data/app/views/refinery/news/shared/_item.html.erb +22 -0
  24. data/config/locales/bg.yml +37 -0
  25. data/config/locales/cs.yml +29 -28
  26. data/config/locales/de.yml +27 -27
  27. data/config/locales/en.yml +39 -29
  28. data/config/locales/es-MX.yml +26 -26
  29. data/config/locales/es.yml +29 -27
  30. data/config/locales/fr.yml +28 -28
  31. data/config/locales/it.yml +27 -27
  32. data/config/locales/jp.yml +36 -0
  33. data/config/locales/lv.yml +28 -26
  34. data/config/locales/nb.yml +27 -27
  35. data/config/locales/nl.yml +27 -27
  36. data/config/locales/pl.yml +37 -0
  37. data/config/locales/pt-BR.yml +28 -28
  38. data/config/locales/ru.yml +26 -26
  39. data/config/locales/sk.yml +28 -28
  40. data/config/locales/sl.yml +31 -29
  41. data/config/locales/zh-CN.yml +37 -0
  42. data/config/locales/zh-TW.yml +37 -0
  43. data/config/routes.rb +13 -5
  44. data/db/migrate/20110817203701_create_news_items.rb +23 -0
  45. data/db/migrate/20110817203702_add_external_url_to_news_items.rb +15 -0
  46. data/db/migrate/20110817203703_translate_news_items.rb +21 -0
  47. data/db/migrate/20110817203704_add_image_id_to_news_items.rb +13 -0
  48. data/db/migrate/20110817203705_add_expiration_date_to_news_items.rb +15 -0
  49. data/db/migrate/20110817203706_remove_image_id_and_external_url_from_news.rb +19 -0
  50. data/db/migrate/20120129230838_add_source_to_news_items.rb +16 -0
  51. data/db/migrate/20120129230839_translate_source.rb +16 -0
  52. data/db/migrate/20120228150250_add_slug_to_news_items.rb +5 -0
  53. data/db/seeds.rb +22 -0
  54. data/lib/generators/refinery/news_generator.rb +19 -0
  55. data/lib/refinery/news.rb +22 -0
  56. data/lib/refinery/news/engine.rb +23 -0
  57. data/lib/refinerycms-news.rb +1 -23
  58. data/readme.md +10 -8
  59. data/refinerycms-news.gemspec +20 -0
  60. data/spec/factories/news.rb +7 -0
  61. data/spec/models/refinery/news/item_spec.rb +91 -0
  62. data/spec/requests/manage_news_items_spec.rb +90 -0
  63. data/spec/requests/news_archive.rb +12 -0
  64. data/spec/requests/visit_news_items_spec.rb +37 -0
  65. data/spec/spec_helper.rb +56 -0
  66. data/tasks/rspec.rake +4 -0
  67. metadata +113 -40
  68. data/app/controllers/admin/news_items_controller.rb +0 -5
  69. data/app/controllers/news_items_controller.rb +0 -33
  70. data/app/models/news_item.rb +0 -46
  71. data/app/views/admin/news_items/index.html.erb +0 -30
  72. data/app/views/news_items/index.html.erb +0 -23
  73. data/app/views/news_items/show.html.erb +0 -15
  74. data/db/migrate/1_create_news_items.rb +0 -23
  75. data/db/migrate/2_add_external_url_to_news_items.rb +0 -15
  76. data/db/migrate/3_translate_news_items.rb +0 -24
  77. data/db/migrate/4_add_image_id_to_news_items.rb +0 -13
  78. data/db/migrate/5_add_expiration_date_to_news_items.rb +0 -15
  79. data/db/migrate/6_remove_image_id_and_external_url_from_news.rb +0 -19
  80. data/db/seeds/refinerycms_news.rb +0 -24
  81. data/features/manage_news_items.feature +0 -56
  82. data/features/step_definitions/news_steps.rb +0 -25
  83. data/features/support/factories.rb +0 -7
  84. data/features/support/paths.rb +0 -26
  85. data/features/visit_news_items.feature +0 -27
  86. data/lib/gemspec.rb +0 -29
  87. data/lib/generators/refinerycms_news_generator.rb +0 -8
  88. data/lib/news.rb +0 -9
  89. data/spec/models/news_item_spec.rb +0 -89
@@ -1,15 +0,0 @@
1
- <% content_for :body_content_title, @news_item.title %>
2
- <% content_for :body_content_left do %>
3
- <article class="news_item">
4
- <p>
5
- <small><%= t('.published') %> <%= l(@news_item.publish_date, :format => :long) %></small>
6
- </p>
7
- <%= @news_item.body.html_safe %>
8
- <p>
9
- <%= link_to t('.back_to_index'), news_items_url %>
10
- </p>
11
- </article>
12
- <% end %>
13
- <% content_for :body_content_right, render(:partial => 'recent_posts') %>
14
-
15
- <%= render :partial => "/shared/content_page" %>
@@ -1,23 +0,0 @@
1
- class CreateNewsItems < ActiveRecord::Migration
2
-
3
- def self.up
4
- create_table ::NewsItem.table_name, :id => true do |t|
5
- t.string :title
6
- t.text :body
7
- t.datetime :publish_date
8
-
9
- t.timestamps
10
- end
11
-
12
- add_index ::NewsItem.table_name, :id
13
- end
14
-
15
- def self.down
16
- ::UserPlugin.destroy_all :name => "refinerycms_news"
17
-
18
- ::Page.delete_all :link_url => "/news"
19
-
20
- drop_table ::NewsItem.table_name
21
- end
22
-
23
- end
@@ -1,15 +0,0 @@
1
- class AddExternalUrlToNewsItems < ActiveRecord::Migration
2
-
3
- def self.up
4
- unless ::NewsItem.column_names.map(&:to_sym).include?(:external_url)
5
- add_column ::NewsItem.table_name, :external_url, :string
6
- end
7
- end
8
-
9
- def self.down
10
- if ::NewsItem.column_names.map(&:to_sym).include?(:external_url)
11
- remove_column ::NewsItem.table_name, :external_url
12
- end
13
- end
14
-
15
- end
@@ -1,24 +0,0 @@
1
- class TranslateNewsItems < ActiveRecord::Migration
2
-
3
- def self.up
4
- ::NewsItem.reset_column_information
5
- unless defined?(::NewsItem::Translation) && ::NewsItem::Translation.table_exists?
6
- ::NewsItem.create_translation_table!({
7
- :title => :string,
8
- :body => :text,
9
- :external_url => :string
10
- }, {
11
- :migrate_data => true
12
- })
13
- end
14
-
15
- load(Rails.root.join('db', 'seeds', 'refinerycms_news.rb').to_s)
16
- end
17
-
18
- def self.down
19
- ::NewsItem.reset_column_information
20
-
21
- ::NewsItem.drop_translation_table!
22
- end
23
-
24
- end
@@ -1,13 +0,0 @@
1
- class AddImageIdToNewsItems < ActiveRecord::Migration
2
-
3
- def self.up
4
- unless ::NewsItem.column_names.map(&:to_sym).include?(:image_id)
5
- add_column ::NewsItem.table_name, :image_id, :integer
6
- end
7
- end
8
-
9
- def self.down
10
- remove_column ::NewsItem.table_name, :image_id
11
- end
12
-
13
- end
@@ -1,15 +0,0 @@
1
- class AddExpirationDateToNewsItems < ActiveRecord::Migration
2
-
3
- def self.up
4
- unless ::NewsItem.column_names.map(&:to_sym).include?(:expiration_date)
5
- add_column ::NewsItem.table_name, :expiration_date, :datetime
6
- end
7
- end
8
-
9
- def self.down
10
- if ::NewsItem.column_names.map(&:to_sym).include?(:expiration_date)
11
- remove_column ::NewsItem.table_name, :expiration_date
12
- end
13
- end
14
-
15
- end
@@ -1,19 +0,0 @@
1
- class RemoveImageIdAndExternalUrlFromNews < ActiveRecord::Migration
2
- def self.up
3
- if ::NewsItem.column_names.map(&:to_sym).include?(:external_url)
4
- remove_column ::NewsItem.table_name, :external_url
5
- end
6
- if ::NewsItem.column_names.map(&:to_sym).include?(:image_id)
7
- remove_column ::NewsItem.table_name, :image_id
8
- end
9
- end
10
-
11
- def self.down
12
- unless ::NewsItem.column_names.map(&:to_sym).include?(:external_url)
13
- add_column ::NewsItem.table_name, :external_url, :string
14
- end
15
- unless ::NewsItem.column_names.map(&:to_sym).include?(:image_id)
16
- add_column ::NewsItem.table_name, :image_id, :integer
17
- end
18
- end
19
- end
@@ -1,24 +0,0 @@
1
- if defined?(::User)
2
- User.all.each do |user|
3
- if user.plugins.where(:name => 'refinerycms_news').blank?
4
- user.plugins.create(:name => 'refinerycms_news',
5
- :position => (user.plugins.maximum(:position) || -1) +1)
6
- end
7
- end
8
- end
9
-
10
- if defined?(::Page)
11
- unless Page.where(:menu_match => "^/news.*$").any?
12
- page = Page.create(
13
- :title => "News",
14
- :link_url => "/news",
15
- :deletable => false,
16
- :position => ((Page.maximum(:position, :conditions => {:parent_id => nil}) || -1)+1),
17
- :menu_match => "^/news.*$"
18
- )
19
-
20
- Page.default_parts.each do |default_page_part|
21
- page.parts.create(:title => default_page_part, :body => nil)
22
- end
23
- end
24
- end
@@ -1,56 +0,0 @@
1
- @refinerycms @news-items @news-items-manage
2
- Feature: Manage News Items
3
- In order to have news bulletins on my website
4
- As an administrator
5
- I want to create and manage news items
6
-
7
- Background:
8
- Given I am a logged in refinery user
9
- And I have no news items
10
-
11
- Scenario: News Items List
12
- Given I have news items titled Home, About
13
- When I go to the list of news items
14
- Then I should see "Home"
15
- And I should see "About"
16
-
17
- Scenario: Create Valid News Item
18
- When I go to the list of news items
19
- And I follow "Add News Item"
20
- And I fill in "Title" with "News Items are a fun way to share what's going on"
21
- And I fill in "Content" with "It really is the most exciting thing you could hear about today."
22
- And I press "Save"
23
- Then I should see "'News Items are a fun way to share what's going on' was successfully added."
24
- And I should have 1 news item
25
-
26
- Scenario: Create Invalid News Item (without title)
27
- When I go to the list of news items
28
- And I follow "Add News Item"
29
- And I fill in "Content" with "But you won't ever see this published"
30
- And I press "Save"
31
- Then I should see "Title can't be blank"
32
- And I should have 0 news items
33
-
34
- Scenario: Create Invalid News Item (without content)
35
- When I go to the list of news items
36
- And I follow "Add News Item"
37
- And I fill in "Title" with "Good luck ever seeing this title"
38
- And I press "Save"
39
- Then I should see "Content can't be blank"
40
- And I should have 0 news items
41
-
42
-
43
- Scenario: Create Duplicate News Item
44
- Given I only have news items titled Home, About
45
- When I go to the list of news items
46
- And I follow "Add News Item"
47
- And I fill in "Title" with "About"
48
- And I press "Save"
49
- Then I should have 2 news items
50
-
51
- Scenario: Delete News Item
52
- Given I only have a news item titled "test"
53
- When I go to the list of news items
54
- And I follow "Remove this news item forever"
55
- Then I should see "'test' was successfully removed."
56
- And I should have 0 news items
@@ -1,25 +0,0 @@
1
- Given /^I (only )?have a news item titled "?([^\"]*)"?$/ do |only, title|
2
- NewsItem.delete_all if only
3
-
4
- Factory(:news_item, :title => title)
5
- end
6
-
7
- Given /^I (only )?have news items titled "?([^\"]*)"?$/ do |only, titles|
8
- NewsItem.delete_all if only
9
-
10
- titles.split(', ').each do |title|
11
- Factory(:news_item, :title => title)
12
- end
13
- end
14
-
15
- Given /^I have no news items$/ do
16
- NewsItem.delete_all
17
- end
18
-
19
- Given /^the news item titled "?([^\"]*)"? is not published$/ do |title|
20
- NewsItem.where(:title => title).first.update_attribute(:publish_date, Time.now + 1.day)
21
- end
22
-
23
- Then /^I should have ([0-9]+) news items?$/ do |count|
24
- NewsItem.count.should == count.to_i
25
- end
@@ -1,7 +0,0 @@
1
- require 'factory_girl'
2
-
3
- Factory.define :news_item do |ni|
4
- ni.title "RefineryCMS News Item"
5
- ni.content "Some random text ..."
6
- ni.publish_date Time.now - 5.minutes
7
- end
@@ -1,26 +0,0 @@
1
- module NavigationHelpers
2
- module Refinery
3
- module News
4
- def path_to(page_name)
5
- case page_name
6
- when /the home\s?page/
7
- root_path
8
- when /the list of news items/
9
- admin_news_items_path
10
- when /the new news item form/
11
- new_admin_news_item_path
12
- else
13
- begin
14
- if page_name =~ /the news item titled "?([^\"]*)"?/ and (news_item = NewsItem.where(:title => $1).first).present?
15
- self.url_for(news_item)
16
- else
17
- nil
18
- end
19
- rescue
20
- nil
21
- end
22
- end
23
- end
24
- end
25
- end
26
- end
@@ -1,27 +0,0 @@
1
- @refinerycms @news-items @news-items-visit @visit-news-items
2
- Feature: Visit News Items
3
- In order to view the content on this website
4
- As a visitor
5
- I want to view news items
6
-
7
- Background:
8
- Given A Refinery user exists
9
- And I have a page titled "Home" with a custom url "/"
10
- And I have a page titled "News" with a custom url "/news"
11
- Given I only have a news item titled "Extra - Read all about it"
12
- And I have a news item titled "Unpublished News Item"
13
- And the news item titled "Unpublished News Item" is not published
14
-
15
- @menu
16
- Scenario: News appears in menu
17
- When I go to the home page
18
- Then I should see "Home"
19
- And I should see "News"
20
-
21
- @show
22
- Scenario: Show News Item
23
- When I go to the news item titled "Extra - Read all about it"
24
- Then I should see "Home"
25
- And I should see "Extra - Read all about it"
26
- And I should see "News" within ".selected"
27
- And I should not see "Unpublished News Item"
data/lib/gemspec.rb DELETED
@@ -1,29 +0,0 @@
1
- #!/usr/bin/env ruby
2
- require File.expand_path('../news.rb', __FILE__)
3
- version = ::Refinery::News.version
4
- raise "Could not get version so gemspec can not be built" if version.nil?
5
- files = Dir.glob("**/*").flatten.reject do |file|
6
- file =~ /\.gem(spec)?$/
7
- end
8
-
9
- gemspec = <<EOF
10
- Gem::Specification.new do |s|
11
- s.name = %q{refinerycms-news}
12
- s.version = %q{#{version}}
13
- s.description = %q{A really straightforward open source Ruby on Rails news engine designed for integration with RefineryCMS.}
14
- s.date = %q{#{Time.now.strftime('%Y-%m-%d')}}
15
- s.summary = %q{Ruby on Rails news engine for RefineryCMS.}
16
- s.email = %q{info@refinerycms.com}
17
- s.homepage = %q{http://refinerycms.com}
18
- s.authors = %w(Resolve\\ Digital)
19
- s.require_paths = %w(lib)
20
-
21
- s.add_dependency 'refinerycms-core', '~> 1.0.0'
22
-
23
- s.files = [
24
- '#{files.join("',\n '")}'
25
- ]
26
- end
27
- EOF
28
-
29
- File.open(File.expand_path("../../refinerycms-news.gemspec", __FILE__), 'w').puts(gemspec)
@@ -1,8 +0,0 @@
1
- require 'refinery/generators'
2
-
3
- class RefinerycmsNewsGenerator < ::Refinery::Generators::EngineInstaller
4
-
5
- source_root File.expand_path('../../../', __FILE__)
6
- engine_name "news"
7
-
8
- end
data/lib/news.rb DELETED
@@ -1,9 +0,0 @@
1
- module Refinery
2
- module News
3
- class << self
4
- def version
5
- %q{1.2.0}
6
- end
7
- end
8
- end
9
- end
@@ -1,89 +0,0 @@
1
- require 'spec_helper'
2
-
3
- Dir[File.expand_path('../../../features/support/factories.rb', __FILE__)].each {|f| require f}
4
-
5
- describe NewsItem do
6
-
7
- let(:time_now) { Time.now }
8
- let(:news_item) { Factory(:news_item) }
9
-
10
- describe "validations" do
11
- subject do
12
- news_item = NewsItem.create! :title => "RefinyerCMS",
13
- :content => "Some random text ...",
14
- :publish_date => time_now
15
- news_item
16
- end
17
-
18
- it { should be_valid }
19
- its(:errors) { should be_empty }
20
- its(:title) { should == "RefinyerCMS" }
21
- its(:content) { should == "Some random text ..." }
22
- its(:publish_date) { should == time_now }
23
- end
24
-
25
- describe "attribute aliasing" do
26
- subject { news_item }
27
- its(:content) { should == news_item.body }
28
- end
29
-
30
- describe "default scope" do
31
- it "orders by publish date in DESC order" do
32
- news_item1 = Factory(:news_item, :publish_date => 1.hour.ago)
33
- news_item2 = Factory(:news_item, :publish_date => 2.hours.ago)
34
- news_items = NewsItem.all
35
- news_items.first.should == news_item1
36
- news_items.second.should == news_item2
37
- end
38
- end
39
-
40
- describe ".not_expired" do
41
- let!(:news_item) { Factory(:news_item) }
42
-
43
- specify "expiration date not set" do
44
- NewsItem.not_expired.count.should == 1
45
- end
46
-
47
- specify "expiration date set in future" do
48
- news_item.expiration_date = Time.now + 1.hour
49
- news_item.save!
50
- NewsItem.not_expired.count.should == 1
51
- end
52
-
53
- specify "expiration date in past" do
54
- news_item.expiration_date = Time.now - 1.hour
55
- news_item.save!
56
- NewsItem.not_expired.count.should == 0
57
- end
58
- end
59
-
60
- describe ".published" do
61
- it "returns only published news items" do
62
- Factory(:news_item)
63
- Factory(:news_item, :publish_date => Time.now + 1.hour)
64
- NewsItem.published.count.should == 1
65
- end
66
- end
67
-
68
- describe ".latest" do
69
- it "returns 10 latest news items by default" do
70
- 5.times { Factory(:news_item) }
71
- 5.times { Factory(:news_item, :publish_date => Time.now + 1.hour) }
72
- NewsItem.latest.count.should == 5
73
- 7.times { Factory(:news_item) }
74
- NewsItem.latest.length.should == 10
75
- end
76
-
77
- it "returns latest n news items" do
78
- 4.times { Factory(:news_item) }
79
- NewsItem.latest(3).length.should == 3
80
- end
81
- end
82
-
83
- describe ".not_published?" do
84
- it "returns not published news items" do
85
- news_item = Factory(:news_item, :publish_date => Time.now + 1.hour)
86
- news_item.not_published?.should be_true
87
- end
88
- end
89
- end