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.
- data/.gitignore +3 -0
- data/.travis.yml +17 -0
- data/Gemfile +69 -0
- data/Guardfile +20 -0
- data/Rakefile +19 -0
- data/app/controllers/refinery/news/admin/items_controller.rb +11 -0
- data/app/controllers/refinery/news/items_controller.rb +50 -0
- data/app/helpers/refinery/news/items_helper.rb +51 -0
- data/app/models/refinery/news/item.rb +91 -0
- data/app/views/{admin/news_items → refinery/news/admin/items}/_form.html.erb +13 -8
- data/app/views/{admin/news_items/_news_item.html.erb → refinery/news/admin/items/_item.html.erb} +8 -8
- data/app/views/{admin/news_items → refinery/news/admin/items}/_locale_picker.html.erb +1 -1
- data/app/views/{admin/news_items → refinery/news/admin/items}/edit.html.erb +0 -0
- data/app/views/refinery/news/admin/items/index.html.erb +30 -0
- data/app/views/{admin/news_items → refinery/news/admin/items}/new.html.erb +0 -0
- data/app/views/{news_items → refinery/news/items}/_recent_posts.html.erb +2 -2
- data/app/views/refinery/news/items/archive.html.erb +17 -0
- data/app/views/refinery/news/items/index.html.erb +28 -0
- data/app/views/{news_items → refinery/news/items}/index.rss.builder +5 -5
- data/app/views/refinery/news/items/show.html.erb +20 -0
- data/app/views/refinery/news/items/widgets/_news_archive.html.erb +10 -0
- data/app/views/refinery/news/shared/_body_content_right.html.erb +5 -0
- data/app/views/refinery/news/shared/_item.html.erb +22 -0
- data/config/locales/bg.yml +37 -0
- data/config/locales/cs.yml +29 -28
- data/config/locales/de.yml +27 -27
- data/config/locales/en.yml +39 -29
- data/config/locales/es-MX.yml +26 -26
- data/config/locales/es.yml +29 -27
- data/config/locales/fr.yml +28 -28
- data/config/locales/it.yml +27 -27
- data/config/locales/jp.yml +36 -0
- data/config/locales/lv.yml +28 -26
- data/config/locales/nb.yml +27 -27
- data/config/locales/nl.yml +27 -27
- data/config/locales/pl.yml +37 -0
- data/config/locales/pt-BR.yml +28 -28
- data/config/locales/ru.yml +26 -26
- data/config/locales/sk.yml +28 -28
- data/config/locales/sl.yml +31 -29
- data/config/locales/zh-CN.yml +37 -0
- data/config/locales/zh-TW.yml +37 -0
- data/config/routes.rb +13 -5
- data/db/migrate/20110817203701_create_news_items.rb +23 -0
- data/db/migrate/20110817203702_add_external_url_to_news_items.rb +15 -0
- data/db/migrate/20110817203703_translate_news_items.rb +21 -0
- data/db/migrate/20110817203704_add_image_id_to_news_items.rb +13 -0
- data/db/migrate/20110817203705_add_expiration_date_to_news_items.rb +15 -0
- data/db/migrate/20110817203706_remove_image_id_and_external_url_from_news.rb +19 -0
- data/db/migrate/20120129230838_add_source_to_news_items.rb +16 -0
- data/db/migrate/20120129230839_translate_source.rb +16 -0
- data/db/migrate/20120228150250_add_slug_to_news_items.rb +5 -0
- data/db/seeds.rb +22 -0
- data/lib/generators/refinery/news_generator.rb +19 -0
- data/lib/refinery/news.rb +22 -0
- data/lib/refinery/news/engine.rb +23 -0
- data/lib/refinerycms-news.rb +1 -23
- data/readme.md +10 -8
- data/refinerycms-news.gemspec +20 -0
- data/spec/factories/news.rb +7 -0
- data/spec/models/refinery/news/item_spec.rb +91 -0
- data/spec/requests/manage_news_items_spec.rb +90 -0
- data/spec/requests/news_archive.rb +12 -0
- data/spec/requests/visit_news_items_spec.rb +37 -0
- data/spec/spec_helper.rb +56 -0
- data/tasks/rspec.rake +4 -0
- metadata +113 -40
- data/app/controllers/admin/news_items_controller.rb +0 -5
- data/app/controllers/news_items_controller.rb +0 -33
- data/app/models/news_item.rb +0 -46
- data/app/views/admin/news_items/index.html.erb +0 -30
- data/app/views/news_items/index.html.erb +0 -23
- data/app/views/news_items/show.html.erb +0 -15
- data/db/migrate/1_create_news_items.rb +0 -23
- data/db/migrate/2_add_external_url_to_news_items.rb +0 -15
- data/db/migrate/3_translate_news_items.rb +0 -24
- data/db/migrate/4_add_image_id_to_news_items.rb +0 -13
- data/db/migrate/5_add_expiration_date_to_news_items.rb +0 -15
- data/db/migrate/6_remove_image_id_and_external_url_from_news.rb +0 -19
- data/db/seeds/refinerycms_news.rb +0 -24
- data/features/manage_news_items.feature +0 -56
- data/features/step_definitions/news_steps.rb +0 -25
- data/features/support/factories.rb +0 -7
- data/features/support/paths.rb +0 -26
- data/features/visit_news_items.feature +0 -27
- data/lib/gemspec.rb +0 -29
- data/lib/generators/refinerycms_news_generator.rb +0 -8
- data/lib/news.rb +0 -9
- 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
|
data/features/support/paths.rb
DELETED
@@ -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)
|
data/lib/news.rb
DELETED
@@ -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
|