refinerycms-news 2.0.1 → 2.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (52) hide show
  1. checksums.yaml +7 -0
  2. data/.gitignore +4 -0
  3. data/.rspec +1 -0
  4. data/.travis.yml +23 -10
  5. data/Gemfile +23 -54
  6. data/Rakefile +2 -0
  7. data/app/controllers/refinery/news/items_controller.rb +8 -11
  8. data/app/helpers/refinery/news/items_helper.rb +14 -17
  9. data/app/models/refinery/news/item.rb +9 -4
  10. data/app/views/refinery/news/admin/items/_form.html.erb +9 -16
  11. data/app/views/refinery/news/admin/items/_item.html.erb +6 -3
  12. data/app/views/refinery/news/admin/items/edit.html.erb +1 -1
  13. data/app/views/refinery/news/admin/items/index.html.erb +1 -1
  14. data/app/views/refinery/news/admin/items/new.html.erb +1 -1
  15. data/app/views/refinery/news/items/archive.html.erb +6 -6
  16. data/app/views/refinery/news/items/index.html.erb +3 -3
  17. data/app/views/refinery/news/items/show.html.erb +3 -3
  18. data/app/views/refinery/news/items/widgets/_news_archive.html.erb +1 -5
  19. data/app/views/refinery/news/shared/_body_content_right.html.erb +1 -1
  20. data/config/locales/bg.yml +18 -18
  21. data/config/locales/cs.yml +19 -19
  22. data/config/locales/da.yml +47 -0
  23. data/config/locales/de.yml +18 -18
  24. data/config/locales/en.yml +3 -2
  25. data/config/locales/es-MX.yml +18 -18
  26. data/config/locales/es.yml +19 -19
  27. data/config/locales/fr.yml +31 -19
  28. data/config/locales/it.yml +18 -18
  29. data/config/locales/ja.yml +48 -0
  30. data/config/locales/lv.yml +20 -18
  31. data/config/locales/nb.yml +18 -18
  32. data/config/locales/nl.yml +30 -18
  33. data/config/locales/pl.yml +29 -18
  34. data/config/locales/ru.yml +18 -18
  35. data/config/locales/sk.yml +31 -19
  36. data/config/locales/sl.yml +0 -2
  37. data/config/locales/zh-CN.yml +18 -18
  38. data/config/locales/zh-TW.yml +29 -29
  39. data/config/routes.rb +2 -2
  40. data/readme.md +51 -2
  41. data/refinerycms-news.gemspec +4 -5
  42. data/spec/controllers/refinery/news/items_controller_spec.rb +67 -0
  43. data/spec/{requests → features}/manage_news_items_spec.rb +6 -6
  44. data/spec/{requests → features}/news_archive.rb +0 -0
  45. data/spec/{requests → features}/visit_news_items_spec.rb +5 -7
  46. data/spec/helpers/refinery/news/items_helper_spec.rb +34 -0
  47. data/spec/models/refinery/news/item_spec.rb +38 -14
  48. data/spec/spec_helper.rb +20 -46
  49. metadata +26 -30
  50. data/Guardfile +0 -20
  51. data/app/views/refinery/news/admin/items/_locale_picker.html.erb +0 -11
  52. data/config/locales/jp.yml +0 -36
data/config/routes.rb CHANGED
@@ -1,12 +1,12 @@
1
1
  Refinery::Core::Engine.routes.draw do
2
2
  namespace :news do
3
3
  root :to => "items#index"
4
- get 'archive/:year(/:month)', :to => 'items#archive', :as => 'items_archive'
4
+ get 'archive/:year(/:month)', :to => 'items#archive', :as => 'items_archive', :constraints => { :year => /\d{4}/, :month => /\d{1,2}/ }
5
5
  resources :items, :only => [:show, :index], :path => ''
6
6
  end
7
7
 
8
8
  namespace :news, :path => '' do
9
- namespace :admin, :path => 'refinery' do
9
+ namespace :admin, :path => Refinery::Core.backend_route do
10
10
  scope :path => 'news' do
11
11
  root :to => "items#index"
12
12
  resources :items, :except => :show
data/readme.md CHANGED
@@ -19,7 +19,9 @@ Key features:
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", '~> 2.0.0'
22
+ ```ruby
23
+ gem "refinerycms-news", '~> 2.0.0'
24
+ ```
23
25
 
24
26
  Then type the following at command line inside your Refinery CMS application's root directory:
25
27
 
@@ -28,6 +30,45 @@ Then type the following at command line inside your Refinery CMS application's r
28
30
  rake db:migrate
29
31
  rake db:seed
30
32
 
33
+ ## How to display a news feed on the homepage:
34
+
35
+ Assuming you've already overridden the homepage view:
36
+
37
+ $ rake refinery:override view=refinery/pages/home
38
+
39
+ You can render the `recent_posts` partial. However, you will need to set the recent News items manually, since this is normally handled in the News::Items controller:
40
+
41
+ ```erb
42
+ <% @items = Refinery::News::Item.latest(5) %>
43
+ <%= render :partial => '/refinery/news/items/recent_posts' %>
44
+ ```
45
+
46
+ ## Configuring the number of items per page
47
+
48
+ To modify the number of items per page for the news items index without
49
+ affecting the archive page you must override the method in the controller that
50
+ sets `@items` for the index: `find_published_news_items`.
51
+
52
+ Currently the method body is:
53
+ ```ruby
54
+ @items = Item.published.translated.page(params[:page])
55
+ ```
56
+
57
+ The `page` convenience method needs to be replaced with `paginate` and
58
+ `per_page` passed as an option. Add a decorator for the items controller with
59
+ the following contents:
60
+
61
+ ```ruby
62
+ module Refinery::News
63
+ ItemsController.class_eval do
64
+ def find_published_news_items
65
+ @items = Item.published.translated.paginate :page => params[:page],
66
+ :per_page => 8
67
+ end
68
+ end
69
+ end
70
+ ```
71
+
31
72
  ## Customising the views
32
73
 
33
74
  Type this command at your project root to override the default front end views:
@@ -42,4 +83,12 @@ Type this command at your project root to override the default front end views:
42
83
 
43
84
  To get RSS for your entire site, insert this into the head section of your layout after installing:
44
85
 
45
- <%= auto_discovery_link_tag(:rss, refinery.news_items_url(:format => 'rss')) %>
86
+ ```erb
87
+ <%= auto_discovery_link_tag(:rss, refinery.news_items_url(:format => 'rss')) %>
88
+ ```
89
+
90
+ ## More Information
91
+ * Check out our [Website](http://refinerycms.com/)
92
+ * Refinery Documentation is available in the [guides](http://refinerycms.com/guides)
93
+ * Questions can be asked on our [Google Group](http://group.refinerycms.org)
94
+ * Questions can also be asked in our IRC room, [#refinerycms on freenode](irc://irc.freenode.net/refinerycms)
@@ -2,9 +2,8 @@
2
2
 
3
3
  Gem::Specification.new do |s|
4
4
  s.name = %q{refinerycms-news}
5
- s.version = %q{2.0.1}
5
+ s.version = %q{2.1.0}
6
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
7
  s.summary = %q{Ruby on Rails news engine for Refinery CMS.}
9
8
  s.email = %q{info@refinerycms.com}
10
9
  s.homepage = %q{http://refinerycms.com}
@@ -14,7 +13,7 @@ Gem::Specification.new do |s|
14
13
  s.files = `git ls-files`.split("\n")
15
14
  s.test_files = `git ls-files -- spec/*`.split("\n")
16
15
 
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'
16
+ s.add_dependency 'refinerycms-core', '~> 2.1.0'
17
+ s.add_dependency 'refinerycms-settings', '~> 2.1.0'
18
+ s.add_dependency 'friendly_id', '~> 4.0.9'
20
19
  end
@@ -0,0 +1,67 @@
1
+ require "spec_helper"
2
+
3
+ module Refinery
4
+ module News
5
+ describe ItemsController do
6
+ let!(:item) { FactoryGirl.create(:news_item) }
7
+ let(:refinery_page) { Refinery::Page.where(:link_url => "/news").first }
8
+
9
+ describe "#index" do
10
+ it "assigns items and page" do
11
+ get :index
12
+ assigns(:items).first.should eq(item)
13
+ assigns(:page).should eq(refinery_page)
14
+ end
15
+
16
+ it "renders 'index' template" do
17
+ get :index
18
+ response.should render_template(:index)
19
+ end
20
+ end
21
+
22
+ describe "#show" do
23
+ it "assigns item and page" do
24
+ get :show, :id => item.id
25
+ assigns(:item).should eq(item)
26
+ assigns(:page).should eq(refinery_page)
27
+ end
28
+
29
+ it "renders 'show' template" do
30
+ get :show, :id => item.id
31
+ response.should render_template(:show)
32
+ end
33
+ end
34
+
35
+ describe "#archive" do
36
+ context "when month is present" do
37
+ it "assigns archive_date and items" do
38
+ Refinery::News::Item.stub_chain(:archived, :translated, :by_archive, :page).and_return(item)
39
+ get :archive, :month => 05, :year => 1999
40
+ assigns(:archive_date).should eq(Time.parse("05/1999"))
41
+ assigns(:items).should eq(item)
42
+ assigns(:archive_for_month).should be_true
43
+ end
44
+ end
45
+
46
+ context "when month isnt present" do
47
+ it "assigns archive_date and items" do
48
+ Refinery::News::Item.stub_chain(:archived, :translated, :by_year, :page).and_return(item)
49
+ get :archive, :year => 1999
50
+ assigns(:archive_date).should eq(Time.parse("01/1999"))
51
+ assigns(:items).should eq(item)
52
+ end
53
+ end
54
+
55
+ it "renders 'archive' template" do
56
+ get :archive, :year => 1999
57
+ response.should render_template(:archive)
58
+ end
59
+
60
+ it "assigns page" do
61
+ get :archive, :year => 1999
62
+ assigns(:page).should eq(refinery_page)
63
+ end
64
+ end
65
+ end
66
+ end
67
+ end
@@ -1,7 +1,7 @@
1
1
  require "spec_helper"
2
2
 
3
3
  describe "manage news items" do
4
- login_refinery_user
4
+ refinery_login_with :refinery_user
5
5
 
6
6
  context "when no news items" do
7
7
  it "invites to create one" do
@@ -16,7 +16,7 @@ describe "manage news items" do
16
16
 
17
17
  within "#actions" do
18
18
  page.should have_content("Add News Item")
19
- page.should have_selector("a[href='/refinery/news/items/new']")
19
+ page.should have_selector("a[href='/#{Refinery::Core.backend_route}/news/items/new']")
20
20
  end
21
21
  end
22
22
  end
@@ -35,7 +35,7 @@ describe "manage news items" do
35
35
  page.should have_content("'My first news item' was successfully added.")
36
36
  page.body.should =~ /Remove this news item forever/
37
37
  page.body.should =~ /Edit this news item/
38
- page.body.should =~ %r{/refinery/news/items/my-first-news-item/edit}
38
+ page.body.should =~ %r{/#{Refinery::Core.backend_route}/news/items/my-first-news-item/edit}
39
39
  page.body.should =~ /View this news item live/
40
40
  page.body.should =~ %r{/news/items/my-first-news-item}
41
41
 
@@ -44,7 +44,7 @@ describe "manage news items" do
44
44
  end
45
45
 
46
46
  describe "edit/update" do
47
- before(:each) { Factory(:news_item, :title => "Update me") }
47
+ before { FactoryGirl.create(:news_item, :title => "Update me") }
48
48
 
49
49
  it "updates news item" do
50
50
  visit refinery.news_admin_items_path
@@ -61,7 +61,7 @@ describe "manage news items" do
61
61
  end
62
62
 
63
63
  describe "destroy" do
64
- before(:each) { Factory(:news_item, :title => "Delete me") }
64
+ before { FactoryGirl.create(:news_item, :title => "Delete me") }
65
65
 
66
66
  it "removes news item" do
67
67
  visit refinery.news_admin_items_path
@@ -75,7 +75,7 @@ describe "manage news items" do
75
75
  end
76
76
 
77
77
  context "duplicate news item titles" do
78
- before(:each) { Factory(:news_item, :title => "I was here first") }
78
+ before { FactoryGirl.create(:news_item, :title => "I was here first") }
79
79
 
80
80
  it "isn't a problem" do
81
81
  visit refinery.new_news_admin_item_path
File without changes
@@ -1,13 +1,11 @@
1
1
  require "spec_helper"
2
2
 
3
3
  describe "visit news items" do
4
- login_refinery_user
5
-
6
- before(:each) do
7
- Factory.create(:page, :link_url => "/")
8
- Factory.create(:page, :link_url => "/news", :title => "News")
9
- @published_news_item = Factory.create(:news_item, :title => "published", :source => "http://refinerycms.com", :publish_date => 1.hour.ago)
10
- @unpublished_news_item = Factory.create(:news_item, :title => "unpublished", :publish_date => 1.day.from_now)
4
+ before do
5
+ FactoryGirl.create(:page, :link_url => "/")
6
+ FactoryGirl.create(:page, :link_url => "/news", :title => "News")
7
+ FactoryGirl.create(:news_item, :title => "unpublished", :publish_date => 1.day.from_now)
8
+ @published_news_item = FactoryGirl.create(:news_item, :title => "published", :source => "http://refinerycms.com", :publish_date => 1.hour.ago)
11
9
  end
12
10
 
13
11
  it "shows news link in menu" do
@@ -0,0 +1,34 @@
1
+ require 'spec_helper'
2
+
3
+ module Refinery
4
+ module News
5
+ describe ItemsHelper do
6
+ describe '#news_item_archive_links' do
7
+ before do
8
+ 2.times { FactoryGirl.create(:news_item, :publish_date => Time.utc(2012, 05)) }
9
+ 3.times { FactoryGirl.create(:news_item, :publish_date => Time.utc(2012, 04)) }
10
+ end
11
+
12
+ it 'returns list of links to archives' do
13
+ expected = '<ul><li><a href="/news/archive/2012/5">May 2012 (2)</a></li><li><a href="/news/archive/2012/4">April 2012 (3)</a></li></ul>'
14
+ helper.news_item_archive_links.should eq(expected)
15
+ end
16
+ end
17
+
18
+ describe "#archive_date_format" do
19
+ context "when date_for_month is true" do
20
+ it "returns month and year" do
21
+ expect(helper.archive_date_format(true)).to eq("%B %Y")
22
+ end
23
+ end
24
+
25
+ context "when date_for_month is nil" do
26
+ it "returns year" do
27
+ expect(helper.archive_date_format(nil)).to eq("%Y")
28
+ end
29
+ end
30
+ end
31
+ end
32
+ end
33
+ end
34
+
@@ -5,7 +5,20 @@ module Refinery
5
5
  describe Item do
6
6
 
7
7
  let(:time_now) { Time.now }
8
- let(:news_item) { Factory(:news_item) }
8
+ let(:news_item) { FactoryGirl.create(:news_item) }
9
+
10
+ describe "#archive" do
11
+ let(:publish_date) { Time.utc(2012,1,15) }
12
+ let(:future_date) { Time.utc(2012,2,15) }
13
+ let(:archive_range) { Time.parse("2012-01-17") }
14
+
15
+ it "should show 5 news items with publish dates in same month" do
16
+ 5.times { FactoryGirl.create(:news_item, :publish_date => publish_date) }
17
+ 2.times { FactoryGirl.create(:news_item, :publish_date => future_date) }
18
+
19
+ Refinery::News::Item.by_archive(archive_range).count.should == 5
20
+ end
21
+ end
9
22
 
10
23
  describe "validations" do
11
24
  subject do
@@ -29,8 +42,8 @@ module Refinery
29
42
 
30
43
  describe "default scope" do
31
44
  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)
45
+ news_item1 = FactoryGirl.create(:news_item, :publish_date => 1.hour.ago)
46
+ news_item2 = FactoryGirl.create(:news_item, :publish_date => 2.hours.ago)
34
47
  news_items = Refinery::News::Item.all
35
48
  news_items.first.should == news_item1
36
49
  news_items.second.should == news_item2
@@ -38,7 +51,7 @@ module Refinery
38
51
  end
39
52
 
40
53
  describe ".not_expired" do
41
- let!(:news_item) { Factory(:news_item) }
54
+ let!(:news_item) { FactoryGirl.create(:news_item) }
42
55
 
43
56
  specify "expiration date not set" do
44
57
  Refinery::News::Item.not_expired.count.should == 1
@@ -59,33 +72,44 @@ module Refinery
59
72
 
60
73
  describe ".published" do
61
74
  it "returns only published news items" do
62
- Factory(:news_item)
63
- Factory(:news_item, :publish_date => Time.now + 1.hour)
75
+ FactoryGirl.create(:news_item)
76
+ FactoryGirl.create(:news_item, :publish_date => Time.now + 1.hour)
64
77
  Refinery::News::Item.published.count.should == 1
65
78
  end
66
79
  end
67
80
 
68
81
  describe ".latest" do
69
82
  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) }
83
+ 5.times { FactoryGirl.create(:news_item) }
84
+ 5.times { FactoryGirl.create(:news_item, :publish_date => Time.now + 1.hour) }
72
85
  Refinery::News::Item.latest.count.should == 5
73
- 7.times { Factory(:news_item) }
74
- Refinery::News::Item.latest.length.should == 10
86
+ 7.times { FactoryGirl.create(:news_item) }
87
+ Refinery::News::Item.latest.count.should == 10
75
88
  end
76
89
 
77
90
  it "returns latest n news items" do
78
- 4.times { Factory(:news_item) }
79
- Refinery::News::Item.latest(3).length.should == 3
91
+ 4.times { FactoryGirl.create(:news_item) }
92
+ Refinery::News::Item.latest(3).count.should == 3
80
93
  end
81
94
  end
82
95
 
83
96
  describe ".not_published?" do
84
97
  it "returns not published news items" do
85
- news_item = Factory(:news_item, :publish_date => Time.now + 1.hour)
98
+ news_item = FactoryGirl.create(:news_item, :publish_date => Time.now + 1.hour)
86
99
  news_item.not_published?.should be_true
87
100
  end
88
101
  end
102
+
103
+ describe ".archived" do
104
+ it "returns all published/expired news items" do
105
+ expired = FactoryGirl.create(:news_item, :publish_date => Time.now - 2.months, :expiration_date => Time.now - 1.months)
106
+ published = FactoryGirl.create(:news_item, :publish_date => Time.now - 1.month)
107
+ not_published = FactoryGirl.create(:news_item, :publish_date => Time.now + 1.month)
108
+ expect(Refinery::News::Item.archived).to include(expired)
109
+ expect(Refinery::News::Item.archived).to include(published)
110
+ expect(Refinery::News::Item.archived).to_not include(not_published)
111
+ end
112
+ end
89
113
  end
90
114
  end
91
- end
115
+ end
data/spec/spec_helper.rb CHANGED
@@ -1,56 +1,30 @@
1
1
  require 'rubygems'
2
2
 
3
- def setup_environment
4
- # Configure Rails Environment
5
- ENV["RAILS_ENV"] ||= 'test'
3
+ # Configure Rails Environment
4
+ ENV["RAILS_ENV"] ||= 'test'
6
5
 
7
- require File.expand_path("../dummy/config/environment", __FILE__)
6
+ require File.expand_path("../dummy/config/environment", __FILE__)
8
7
 
9
- require 'rspec/rails'
10
- require 'capybara/rspec'
11
- require 'factory_girl_rails'
8
+ require 'rspec/rails'
9
+ require 'capybara/rspec'
10
+ require 'factory_girl_rails'
12
11
 
13
- Rails.backtrace_cleaner.remove_silencers!
12
+ Rails.backtrace_cleaner.remove_silencers!
14
13
 
15
- RSpec.configure do |config|
16
- config.mock_with :rspec
17
- config.treat_symbols_as_metadata_keys_with_true_values = true
18
- config.filter_run :focus => true
19
- config.run_all_when_everything_filtered = true
20
- end
21
-
22
- # set javascript driver for capybara
23
- Capybara.javascript_driver = :selenium
24
- end
25
-
26
- def each_run
27
- ActiveSupport::Dependencies.clear
28
-
29
- FactoryGirl.reload
30
-
31
- # Requires supporting files with custom matchers and macros, etc,
32
- # in ./support/ and its subdirectories including factories.
33
- ([Rails.root.to_s] | ::Refinery::Plugins.registered.pathnames).map{|p|
34
- Dir[File.join(p, 'spec', 'support', '**', '*.rb').to_s]
35
- }.flatten.sort.each do |support_file|
36
- require support_file
37
- end
14
+ RSpec.configure do |config|
15
+ config.mock_with :rspec
16
+ config.treat_symbols_as_metadata_keys_with_true_values = true
17
+ config.filter_run :focus => true
18
+ config.run_all_when_everything_filtered = true
38
19
  end
39
20
 
40
- # If spork is available in the Gemfile it'll be used but we don't force it.
41
- unless (begin; require 'spork'; rescue LoadError; nil end).nil?
42
- Spork.prefork do
43
- # Loading more in this block will cause your tests to run faster. However,
44
- # if you change any configuration or code from libraries loaded here, you'll
45
- # need to restart spork for it take effect.
46
- setup_environment
47
- end
21
+ # set javascript driver for capybara
22
+ Capybara.javascript_driver = :selenium
48
23
 
49
- Spork.each_run do
50
- # This code will be run each time you run your specs.
51
- each_run
52
- end
53
- else
54
- setup_environment
55
- each_run
24
+ # Requires supporting files with custom matchers and macros, etc,
25
+ # in ./support/ and its subdirectories including factories.
26
+ ([Rails.root.to_s] | ::Refinery::Plugins.registered.pathnames).map{|p|
27
+ Dir[File.join(p, 'spec', 'support', '**', '*.rb').to_s]
28
+ }.flatten.sort.each do |support_file|
29
+ require support_file
56
30
  end