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
@@ -0,0 +1,19 @@
|
|
1
|
+
class RemoveImageIdAndExternalUrlFromNews < ActiveRecord::Migration
|
2
|
+
def up
|
3
|
+
if ::Refinery::News::Item.column_names.map(&:to_sym).include?(:external_url)
|
4
|
+
remove_column ::Refinery::News::Item.table_name, :external_url
|
5
|
+
end
|
6
|
+
if ::Refinery::News::Item.column_names.map(&:to_sym).include?(:image_id)
|
7
|
+
remove_column ::Refinery::News::Item.table_name, :image_id
|
8
|
+
end
|
9
|
+
end
|
10
|
+
|
11
|
+
def down
|
12
|
+
unless ::Refinery::News::Item.column_names.map(&:to_sym).include?(:external_url)
|
13
|
+
add_column ::Refinery::News::Item.table_name, :external_url, :string
|
14
|
+
end
|
15
|
+
unless ::Refinery::News::Item.column_names.map(&:to_sym).include?(:image_id)
|
16
|
+
add_column ::Refinery::News::Item.table_name, :image_id, :integer
|
17
|
+
end
|
18
|
+
end
|
19
|
+
end
|
@@ -0,0 +1,16 @@
|
|
1
|
+
# This migration comes from refinery_news (originally 7)
|
2
|
+
class AddSourceToNewsItems < ActiveRecord::Migration
|
3
|
+
|
4
|
+
def up
|
5
|
+
unless Refinery::News::Item.column_names.map(&:to_sym).include?(:source)
|
6
|
+
add_column Refinery::News::Item.table_name, :source, :string
|
7
|
+
end
|
8
|
+
end
|
9
|
+
|
10
|
+
def down
|
11
|
+
if Refinery::News::Item.column_names.map(&:to_sym).include?(:source)
|
12
|
+
remove_column Refinery::News::Item.table_name, :source
|
13
|
+
end
|
14
|
+
end
|
15
|
+
|
16
|
+
end
|
@@ -0,0 +1,16 @@
|
|
1
|
+
# This migration comes from refinery_news (originally 8)
|
2
|
+
class TranslateSource < ActiveRecord::Migration
|
3
|
+
|
4
|
+
def up
|
5
|
+
unless Refinery::News::Item::Translation.column_names.map(&:to_sym).include?(:source)
|
6
|
+
add_column Refinery::News::Item::Translation.table_name, :source, :string
|
7
|
+
end
|
8
|
+
end
|
9
|
+
|
10
|
+
def down
|
11
|
+
if Refinery::News::Item::Translation.column_names.map(&:to_sym).include?(:source)
|
12
|
+
remove_column Refinery::News::Item::Translation.table_name, :source
|
13
|
+
end
|
14
|
+
end
|
15
|
+
|
16
|
+
end
|
data/db/seeds.rb
ADDED
@@ -0,0 +1,22 @@
|
|
1
|
+
if defined?(::Refinery::User)
|
2
|
+
::Refinery::User.all.each do |user|
|
3
|
+
if user.plugins.where(:name => 'refinerycms_news').blank?
|
4
|
+
user.plugins.create(:name => 'refinerycms_news')
|
5
|
+
end
|
6
|
+
end
|
7
|
+
end
|
8
|
+
|
9
|
+
if defined?(::Refinery::Page)
|
10
|
+
unless ::Refinery::Page.where(:menu_match => "^/news.*$").any?
|
11
|
+
page = ::Refinery::Page.create(
|
12
|
+
:title => "News",
|
13
|
+
:link_url => "/news",
|
14
|
+
:deletable => false,
|
15
|
+
:menu_match => "^/news.*$"
|
16
|
+
)
|
17
|
+
|
18
|
+
::Refinery::Pages.default_parts.each do |default_page_part|
|
19
|
+
page.parts.create(:title => default_page_part, :body => nil)
|
20
|
+
end
|
21
|
+
end
|
22
|
+
end
|
@@ -0,0 +1,19 @@
|
|
1
|
+
module Refinery
|
2
|
+
class NewsGenerator < Rails::Generators::Base
|
3
|
+
def rake_db
|
4
|
+
rake("refinery_news:install:migrations")
|
5
|
+
rake("refinery_settings:install:migrations")
|
6
|
+
end
|
7
|
+
|
8
|
+
def append_load_seed_data
|
9
|
+
create_file 'db/seeds.rb' unless File.exists?(File.join(destination_root, 'db', 'seeds.rb'))
|
10
|
+
append_file 'db/seeds.rb', :verbose => true do
|
11
|
+
<<-EOH
|
12
|
+
|
13
|
+
# Added by Refinery CMS News engine
|
14
|
+
Refinery::News::Engine.load_seed
|
15
|
+
EOH
|
16
|
+
end
|
17
|
+
end
|
18
|
+
end
|
19
|
+
end
|
@@ -0,0 +1,22 @@
|
|
1
|
+
require 'refinerycms-core'
|
2
|
+
require 'refinerycms-settings'
|
3
|
+
|
4
|
+
module Refinery
|
5
|
+
autoload :NewsGenerator, 'generators/refinery/news_generator'
|
6
|
+
|
7
|
+
module News
|
8
|
+
require 'refinery/news/engine'
|
9
|
+
|
10
|
+
class << self
|
11
|
+
attr_writer :root
|
12
|
+
|
13
|
+
def root
|
14
|
+
@root ||= Pathname.new(File.expand_path('../../../', __FILE__))
|
15
|
+
end
|
16
|
+
|
17
|
+
def factory_paths
|
18
|
+
@factory_paths ||= [ root.join("spec/factories").to_s ]
|
19
|
+
end
|
20
|
+
end
|
21
|
+
end
|
22
|
+
end
|
@@ -0,0 +1,23 @@
|
|
1
|
+
module Refinery
|
2
|
+
module News
|
3
|
+
class Engine < Rails::Engine
|
4
|
+
include Refinery::Engine
|
5
|
+
|
6
|
+
isolate_namespace Refinery::News
|
7
|
+
|
8
|
+
initializer "init plugin" do
|
9
|
+
Refinery::Plugin.register do |plugin|
|
10
|
+
plugin.pathname = root
|
11
|
+
plugin.name = "refinerycms_news"
|
12
|
+
plugin.menu_match = /refinery\/news(_items)?$/
|
13
|
+
plugin.url = {:controller => '/refinery/news/admin/items'}
|
14
|
+
plugin.activity = { :class_name => 'Refinery::News::Item' }
|
15
|
+
end
|
16
|
+
end
|
17
|
+
|
18
|
+
config.after_initialize do
|
19
|
+
Refinery.register_engine(Refinery::News)
|
20
|
+
end
|
21
|
+
end
|
22
|
+
end
|
23
|
+
end
|
data/lib/refinerycms-news.rb
CHANGED
@@ -1,23 +1 @@
|
|
1
|
-
require 'refinery'
|
2
|
-
require File.expand_path('../news', __FILE__)
|
3
|
-
|
4
|
-
module Refinery
|
5
|
-
module News
|
6
|
-
|
7
|
-
class Engine < Rails::Engine
|
8
|
-
config.after_initialize do
|
9
|
-
Refinery::Plugin.register do |plugin|
|
10
|
-
plugin.name = "refinerycms_news"
|
11
|
-
plugin.menu_match = /(admin|refinery)\/news(_items)?$/
|
12
|
-
plugin.url = {:controller => '/admin/news_items', :action => 'index'}
|
13
|
-
plugin.activity = {
|
14
|
-
:class => NewsItem,
|
15
|
-
:title => 'title',
|
16
|
-
:url_prefix => 'edit'
|
17
|
-
}
|
18
|
-
end
|
19
|
-
end
|
20
|
-
end
|
21
|
-
|
22
|
-
end
|
23
|
-
end
|
1
|
+
require 'refinery/news'
|
data/readme.md
CHANGED
@@ -13,31 +13,33 @@ Key features:
|
|
13
13
|
|
14
14
|
## Requirements
|
15
15
|
|
16
|
-
[
|
16
|
+
[Refinery CMS](http://refinerycms.com) "core" engine version 2.0.0 or later.
|
17
17
|
|
18
18
|
### Gem Installation using Bundler (The very best way)
|
19
19
|
|
20
20
|
Include the latest [gem](http://rubygems.org/gems/refinerycms-news) into your Refinery CMS application's Gemfile:
|
21
21
|
|
22
|
-
gem "refinerycms-news", '~>
|
22
|
+
gem "refinerycms-news", '~> 2.0.0'
|
23
23
|
|
24
24
|
Then type the following at command line inside your Refinery CMS application's root directory:
|
25
25
|
|
26
26
|
bundle install
|
27
|
-
rails generate
|
27
|
+
rails generate refinery:news
|
28
28
|
rake db:migrate
|
29
|
+
rake db:seed
|
29
30
|
|
30
31
|
## Customising the views
|
31
32
|
|
32
33
|
Type this command at your project root to override the default front end views:
|
33
34
|
|
34
|
-
$ rake refinery:override view=
|
35
|
-
Copied view template file to app/views/
|
36
|
-
Copied view template file to app/views/
|
37
|
-
Copied view template file to app/views/
|
35
|
+
$ rake refinery:override view=refinery/news/items/*
|
36
|
+
Copied view template file to app/views/refinery/news/items/_recent_posts.html.erb
|
37
|
+
Copied view template file to app/views/refinery/news/items/index.html.erb
|
38
|
+
Copied view template file to app/views/refinery/news/items/show.html.erb
|
39
|
+
etc.
|
38
40
|
|
39
41
|
## RSS (Really Simple Syndication)
|
40
42
|
|
41
43
|
To get RSS for your entire site, insert this into the head section of your layout after installing:
|
42
44
|
|
43
|
-
<%= auto_discovery_link_tag(:rss, news_items_url(:format => 'rss')) %>
|
45
|
+
<%= auto_discovery_link_tag(:rss, refinery.news_items_url(:format => 'rss')) %>
|
@@ -0,0 +1,20 @@
|
|
1
|
+
# Encoding: UTF-8
|
2
|
+
|
3
|
+
Gem::Specification.new do |s|
|
4
|
+
s.name = %q{refinerycms-news}
|
5
|
+
s.version = %q{2.0.0}
|
6
|
+
s.description = %q{A really straightforward open source Ruby on Rails news engine designed for integration with Refinery CMS.}
|
7
|
+
s.date = "#{Date.today.strftime("%Y-%m-%d")}"
|
8
|
+
s.summary = %q{Ruby on Rails news engine for Refinery CMS.}
|
9
|
+
s.email = %q{info@refinerycms.com}
|
10
|
+
s.homepage = %q{http://refinerycms.com}
|
11
|
+
s.authors = ["Philip Arndt", "Uģis Ozols"]
|
12
|
+
s.require_paths = %w(lib)
|
13
|
+
|
14
|
+
s.files = `git ls-files`.split("\n")
|
15
|
+
s.test_files = `git ls-files -- spec/*`.split("\n")
|
16
|
+
|
17
|
+
s.add_dependency 'refinerycms-core', '~> 2.0.1'
|
18
|
+
s.add_dependency 'refinerycms-settings', '~> 2.0.0'
|
19
|
+
s.add_dependency 'friendly_id', '~> 4.0.1'
|
20
|
+
end
|
@@ -0,0 +1,91 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
module Refinery
|
4
|
+
module News
|
5
|
+
describe Item 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 = Refinery::News::Item.create! :title => "Refinery CMS",
|
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 == "Refinery CMS" }
|
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 = Refinery::News::Item.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
|
+
Refinery::News::Item.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
|
+
Refinery::News::Item.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
|
+
Refinery::News::Item.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
|
+
Refinery::News::Item.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
|
+
Refinery::News::Item.latest.count.should == 5
|
73
|
+
7.times { Factory(:news_item) }
|
74
|
+
Refinery::News::Item.latest.length.should == 10
|
75
|
+
end
|
76
|
+
|
77
|
+
it "returns latest n news items" do
|
78
|
+
4.times { Factory(:news_item) }
|
79
|
+
Refinery::News::Item.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
|
90
|
+
end
|
91
|
+
end
|
@@ -0,0 +1,90 @@
|
|
1
|
+
require "spec_helper"
|
2
|
+
|
3
|
+
describe "manage news items" do
|
4
|
+
login_refinery_user
|
5
|
+
|
6
|
+
context "when no news items" do
|
7
|
+
it "invites to create one" do
|
8
|
+
visit refinery.news_admin_items_path
|
9
|
+
page.should have_content("There are no news items yet. Click \"Add News Item\" to add your first news item.")
|
10
|
+
end
|
11
|
+
end
|
12
|
+
|
13
|
+
describe "action links" do
|
14
|
+
it "shows add news item link" do
|
15
|
+
visit refinery.news_admin_items_path
|
16
|
+
|
17
|
+
within "#actions" do
|
18
|
+
page.should have_content("Add News Item")
|
19
|
+
page.should have_selector("a[href='/refinery/news/items/new']")
|
20
|
+
end
|
21
|
+
end
|
22
|
+
end
|
23
|
+
|
24
|
+
describe "new/create" do
|
25
|
+
it "allows to create news item" do
|
26
|
+
visit refinery.news_admin_items_path
|
27
|
+
|
28
|
+
click_link "Add News Item"
|
29
|
+
|
30
|
+
fill_in "Title", :with => "My first news item"
|
31
|
+
fill_in "Body", :with => "bla bla"
|
32
|
+
fill_in "Source", :with => "http://refinerycms.com"
|
33
|
+
click_button "Save"
|
34
|
+
|
35
|
+
page.should have_content("'My first news item' was successfully added.")
|
36
|
+
page.body.should =~ /Remove this news item forever/
|
37
|
+
page.body.should =~ /Edit this news item/
|
38
|
+
page.body.should =~ %r{/refinery/news/items/my-first-news-item/edit}
|
39
|
+
page.body.should =~ /View this news item live/
|
40
|
+
page.body.should =~ %r{/news/items/my-first-news-item}
|
41
|
+
|
42
|
+
Refinery::News::Item.count.should == 1
|
43
|
+
end
|
44
|
+
end
|
45
|
+
|
46
|
+
describe "edit/update" do
|
47
|
+
before(:each) { Factory(:news_item, :title => "Update me") }
|
48
|
+
|
49
|
+
it "updates news item" do
|
50
|
+
visit refinery.news_admin_items_path
|
51
|
+
|
52
|
+
page.should have_content("Update me")
|
53
|
+
|
54
|
+
click_link "Edit this news item"
|
55
|
+
|
56
|
+
fill_in "Title", :with => "Updated"
|
57
|
+
click_button "Save"
|
58
|
+
|
59
|
+
page.should have_content("'Updated' was successfully updated.")
|
60
|
+
end
|
61
|
+
end
|
62
|
+
|
63
|
+
describe "destroy" do
|
64
|
+
before(:each) { Factory(:news_item, :title => "Delete me") }
|
65
|
+
|
66
|
+
it "removes news item" do
|
67
|
+
visit refinery.news_admin_items_path
|
68
|
+
|
69
|
+
click_link "Remove this news item forever"
|
70
|
+
|
71
|
+
page.should have_content("'Delete me' was successfully removed.")
|
72
|
+
|
73
|
+
Refinery::News::Item.count.should == 0
|
74
|
+
end
|
75
|
+
end
|
76
|
+
|
77
|
+
context "duplicate news item titles" do
|
78
|
+
before(:each) { Factory(:news_item, :title => "I was here first") }
|
79
|
+
|
80
|
+
it "isn't a problem" do
|
81
|
+
visit refinery.new_news_admin_item_path
|
82
|
+
|
83
|
+
fill_in "Title", :with => "I was here first"
|
84
|
+
fill_in "Body", :with => "Doesn't matter"
|
85
|
+
click_button "Save"
|
86
|
+
|
87
|
+
Refinery::News::Item.count.should == 2
|
88
|
+
end
|
89
|
+
end
|
90
|
+
end
|