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
@@ -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
@@ -0,0 +1,5 @@
1
+ class AddSlugToNewsItems < ActiveRecord::Migration
2
+ def change
3
+ add_column Refinery::News::Item.table_name, :slug, :string
4
+ end
5
+ 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
@@ -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
- [RefineryCMS](http://refinerycms.com) "core" engine version 0.9.9.15 or later.
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", '~> 1.1'
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 refinerycms_news
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=news_items/*
35
- Copied view template file to app/views/news_items/_recent_posts.html.erb
36
- Copied view template file to app/views/news_items/index.html.erb
37
- Copied view template file to app/views/news_items/show.html.erb
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,7 @@
1
+ FactoryGirl.define do
2
+ factory :news_item, :class => Refinery::News::Item do
3
+ title "Refinery CMS News Item"
4
+ content "Some random text ..."
5
+ publish_date Time.now - 5.minutes
6
+ end
7
+ 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
@@ -0,0 +1,12 @@
1
+ require "spec_helper"
2
+
3
+ describe "manage news items" do
4
+ before do
5
+ date = "dec/2011"
6
+ @time = Time.parse(date)
7
+ end
8
+
9
+ it "should display proper date" do
10
+ @time.should == "dec/2011"
11
+ end
12
+ end