radiant-archive-extension 1.0.3 → 1.0.4
Sign up to get free protection for your applications and to get access to all the features.
- data/.gitignore +2 -0
- data/app/models/archive_menu_renderer.rb +23 -0
- data/app/models/archive_page.rb +6 -6
- data/archive_extension.rb +3 -4
- data/lib/page_children_cache_updates.rb +41 -0
- data/lib/radiant-archive-extension/version.rb +1 -1
- data/radiant-archive-extension.gemspec +13 -8
- data/spec/models/archive_menu_renderer_spec.rb +39 -0
- data/spec/models/archive_page_spec.rb +1 -13
- data/spec/models/page_spec.rb +23 -2
- metadata +11 -8
data/.gitignore
ADDED
@@ -0,0 +1,23 @@
|
|
1
|
+
module ArchiveMenuRenderer
|
2
|
+
def excluded_class_names
|
3
|
+
Array(ArchiveMenuRenderer.instance_variable_get(:@excluded_class_names))
|
4
|
+
end
|
5
|
+
end
|
6
|
+
|
7
|
+
module ArchiveDayIndexMenuRenderer
|
8
|
+
def add_child_disabled?
|
9
|
+
true
|
10
|
+
end
|
11
|
+
end
|
12
|
+
|
13
|
+
module ArchiveMonthIndexMenuRenderer
|
14
|
+
def add_child_disabled?
|
15
|
+
true
|
16
|
+
end
|
17
|
+
end
|
18
|
+
|
19
|
+
module ArchiveYearIndexMenuRenderer
|
20
|
+
def add_child_disabled?
|
21
|
+
true
|
22
|
+
end
|
23
|
+
end
|
data/app/models/archive_page.rb
CHANGED
@@ -1,17 +1,17 @@
|
|
1
1
|
class ArchivePage < Page
|
2
|
-
cattr_accessor :allowed_children
|
3
2
|
cattr_accessor :single_use_children
|
4
3
|
@@single_use_children = [ArchiveDayIndexPage, ArchiveMonthIndexPage, ArchiveYearIndexPage, FileNotFoundPage]
|
5
|
-
@@allowed_children = [self.default_child, *@@single_use_children]
|
6
4
|
|
7
|
-
def
|
8
|
-
|
5
|
+
def set_allowed_children_cache
|
6
|
+
singles = self.class.single_use_children.map(&:name)
|
7
|
+
existing = existing_child_types.map(&:name)
|
8
|
+
all = allowed_children_lookup.map(&:name)
|
9
9
|
|
10
|
-
(
|
10
|
+
self.allowed_children_cache = (all - (singles & existing)).join(',')
|
11
11
|
end
|
12
12
|
|
13
13
|
def existing_child_types
|
14
|
-
children(:select => 'DISTINCT class_name, title, virtual', :order => nil).
|
14
|
+
children(:select => 'DISTINCT class_name, title, virtual', :order => nil).map(&:class_name).compact.map(&:constantize).uniq
|
15
15
|
end
|
16
16
|
|
17
17
|
description %{
|
data/archive_extension.rb
CHANGED
@@ -9,11 +9,10 @@ class ArchiveExtension < Radiant::Extension
|
|
9
9
|
def activate
|
10
10
|
# allow bootstrap
|
11
11
|
if Page.table_exists?
|
12
|
+
ArchiveMenuRenderer # Initialize the class because it is lazily loaded
|
13
|
+
MenuRenderer.exclude 'ArchiveDayIndexPage', 'ArchiveMonthIndexPage', 'ArchiveYearIndexPage'
|
12
14
|
Page.class_eval do
|
13
|
-
|
14
|
-
allowed_children_without_archive.reject { |p| p.name =~ /Archive(Day|Month|Year)IndexPage/ }
|
15
|
-
end
|
16
|
-
alias_method_chain :allowed_children, :archive
|
15
|
+
include PageChildrenCacheUpdates
|
17
16
|
end
|
18
17
|
end
|
19
18
|
end
|
@@ -0,0 +1,41 @@
|
|
1
|
+
module PageChildrenCacheUpdates
|
2
|
+
def self.included(base)
|
3
|
+
base.class_eval do
|
4
|
+
after_create :remove_from_parent_allowed_children_cache
|
5
|
+
after_destroy :add_to_parent_allowed_children_cache
|
6
|
+
end
|
7
|
+
end
|
8
|
+
|
9
|
+
private
|
10
|
+
|
11
|
+
def remove_from_parent_allowed_children_cache
|
12
|
+
if parent_allows_this_child_class? && class_is_single_use_for_parent?
|
13
|
+
parent.allowed_children_cache = parent_allowed_class_names.delete_if{|child| child == page_class_name }.join(',')
|
14
|
+
parent.save
|
15
|
+
end
|
16
|
+
end
|
17
|
+
|
18
|
+
def add_to_parent_allowed_children_cache
|
19
|
+
if class_is_single_use_for_parent? && !parent_allows_this_child_class?
|
20
|
+
parent.allowed_children_cache = (parent_allowed_class_names + [page_class_name]).uniq.join(',')
|
21
|
+
parent.save
|
22
|
+
true
|
23
|
+
end
|
24
|
+
end
|
25
|
+
|
26
|
+
def parent_allows_this_child_class?
|
27
|
+
parent? && parent.allowed_children_cache.to_s.split(',').include?(page_class_name)
|
28
|
+
end
|
29
|
+
|
30
|
+
def class_is_single_use_for_parent?
|
31
|
+
parent? && parent.class.respond_to?(:single_use_children) && parent.class.single_use_children.map(&:name).include?(page_class_name)
|
32
|
+
end
|
33
|
+
|
34
|
+
def parent_allowed_class_names
|
35
|
+
parent.allowed_children_cache.to_s.split(',')
|
36
|
+
end
|
37
|
+
|
38
|
+
def page_class_name
|
39
|
+
self.class_name.present? ? self.class_name : 'Page'
|
40
|
+
end
|
41
|
+
end
|
@@ -12,14 +12,19 @@ Gem::Specification.new do |s|
|
|
12
12
|
s.summary = %q{Archive for Radiant CMS}
|
13
13
|
s.description = %q{Provides page types for news or blog archives.}
|
14
14
|
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
|
15
|
+
ignoreable_commands = File.read('.gitignore').split("\n").delete_if{|line| line.match(/^##/) || line.empty? }
|
16
|
+
ignoreable_files = ignoreable_commands.collect{|line|
|
17
|
+
if File.directory?(line)
|
18
|
+
line + "/**/*"
|
19
|
+
elsif File.file?(line)
|
20
|
+
line
|
21
|
+
end
|
22
|
+
}.compact
|
23
|
+
|
24
|
+
s.files = Dir['**/*','.gitignore'] - Dir[*ignoreable_files]
|
25
|
+
|
26
|
+
s.test_files = Dir['test/**/*','spec/**/*','features/**/*'] - Dir[*ignoreable_files]
|
27
|
+
|
23
28
|
s.require_paths = ["lib"]
|
24
29
|
|
25
30
|
end
|
@@ -0,0 +1,39 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
describe ArchiveMenuRenderer do
|
4
|
+
context 'excluding classes from child list' do
|
5
|
+
it 'should be retrievable by the extended object' do
|
6
|
+
ArchiveMenuRenderer.instance_variable_set(:@excluded_class_names, ['SkippedPage'])
|
7
|
+
page = Object.new
|
8
|
+
page.extend ArchiveMenuRenderer
|
9
|
+
page.excluded_class_names.should include('SkippedPage')
|
10
|
+
end
|
11
|
+
end
|
12
|
+
end
|
13
|
+
|
14
|
+
describe ArchiveDayIndexMenuRenderer do
|
15
|
+
subject{
|
16
|
+
page = Object.new
|
17
|
+
page.extend ArchiveDayIndexMenuRenderer
|
18
|
+
page
|
19
|
+
}
|
20
|
+
its(:add_child_disabled?){ should be_true }
|
21
|
+
end
|
22
|
+
|
23
|
+
describe ArchiveMonthIndexMenuRenderer do
|
24
|
+
subject{
|
25
|
+
page = Object.new
|
26
|
+
page.extend ArchiveMonthIndexMenuRenderer
|
27
|
+
page
|
28
|
+
}
|
29
|
+
its(:add_child_disabled?){ should be_true }
|
30
|
+
end
|
31
|
+
|
32
|
+
describe ArchiveYearIndexMenuRenderer do
|
33
|
+
subject{
|
34
|
+
page = Object.new
|
35
|
+
page.extend ArchiveYearIndexMenuRenderer
|
36
|
+
page
|
37
|
+
}
|
38
|
+
its(:add_child_disabled?){ should be_true }
|
39
|
+
end
|
@@ -34,23 +34,11 @@ describe ArchivePage do
|
|
34
34
|
end
|
35
35
|
|
36
36
|
its(:single_use_children){ should == [ArchiveDayIndexPage, ArchiveMonthIndexPage, ArchiveYearIndexPage, FileNotFoundPage]}
|
37
|
-
its(:allowed_children){ should == [Page, *ArchivePage.single_use_children]}
|
38
37
|
|
39
38
|
describe '#existing_child_types' do
|
40
39
|
it 'should return a unique array of classes of the page children' do
|
41
|
-
archive.existing_child_types.should == archive.children
|
40
|
+
archive.existing_child_types.should == archive.children(:select => 'DISTINCT class_name, title, virtual', :order => nil).map(&:class_name).compact.map(&:constantize).uniq
|
42
41
|
end
|
43
42
|
end
|
44
43
|
|
45
|
-
describe '#allowed_children' do
|
46
|
-
context 'when no children exist' do
|
47
|
-
subject{ ArchivePage.new }
|
48
|
-
its(:allowed_children){ should == ArchivePage.allowed_children }
|
49
|
-
end
|
50
|
-
it 'should remove any existing single_use_children from the allowed_children' do
|
51
|
-
existing_except_default = archive.existing_child_types - [archive.default_child]
|
52
|
-
used_allowed_children = ArchivePage.allowed_children & existing_except_default
|
53
|
-
archive.allowed_children.should == (ArchivePage.allowed_children - used_allowed_children)
|
54
|
-
end
|
55
|
-
end
|
56
44
|
end
|
data/spec/models/page_spec.rb
CHANGED
@@ -1,6 +1,27 @@
|
|
1
1
|
require File.expand_path("../../spec_helper", __FILE__)
|
2
2
|
|
3
3
|
describe Page do
|
4
|
-
|
5
|
-
|
4
|
+
context 'when the parent page has single_use_children' do
|
5
|
+
it 'should remove its class from the parent page allowed_children_cache after create' do
|
6
|
+
ArchivePage.stub!(:single_use_children).and_return([ArchiveDayIndexPage])
|
7
|
+
parent = ArchivePage.create!(:slug => 'archive', :title => 'archive',
|
8
|
+
:breadcrumb => 'archive',
|
9
|
+
:allowed_children_cache => 'Page,ArchiveDayIndexPage')
|
10
|
+
page = ArchiveDayIndexPage.new(:slug => 'day', :title => 'day', :breadcrumb => 'day')
|
11
|
+
page.parent = parent
|
12
|
+
page.save!
|
13
|
+
parent.allowed_children_cache.should_not include('ArchiveDayIndexPage')
|
14
|
+
end
|
15
|
+
it 'should add its class to the parent page allowed_children_cache after destroy' do
|
16
|
+
ArchivePage.stub!(:single_use_children).and_return([ArchiveDayIndexPage])
|
17
|
+
parent = ArchivePage.create!(:slug => 'archive', :title => 'archive',
|
18
|
+
:breadcrumb => 'archive',
|
19
|
+
:allowed_children_cache => 'Page,ArchiveDayIndexPage')
|
20
|
+
page = ArchiveDayIndexPage.new(:slug => 'day', :title => 'day', :breadcrumb => 'day')
|
21
|
+
page.parent = parent
|
22
|
+
page.save!
|
23
|
+
page.destroy
|
24
|
+
parent.allowed_children_cache.should include('ArchiveDayIndexPage')
|
25
|
+
end
|
26
|
+
end
|
6
27
|
end
|
metadata
CHANGED
@@ -1,13 +1,13 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: radiant-archive-extension
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
hash:
|
4
|
+
hash: 31
|
5
5
|
prerelease:
|
6
6
|
segments:
|
7
7
|
- 1
|
8
8
|
- 0
|
9
|
-
-
|
10
|
-
version: 1.0.
|
9
|
+
- 4
|
10
|
+
version: 1.0.4
|
11
11
|
platform: ruby
|
12
12
|
authors:
|
13
13
|
- Radiant CMS Dev Team
|
@@ -15,8 +15,7 @@ autorequire:
|
|
15
15
|
bindir: bin
|
16
16
|
cert_chain: []
|
17
17
|
|
18
|
-
date: 2011-
|
19
|
-
default_executable:
|
18
|
+
date: 2011-11-05 00:00:00 Z
|
20
19
|
dependencies: []
|
21
20
|
|
22
21
|
description: Provides page types for news or blog archives.
|
@@ -31,6 +30,7 @@ extra_rdoc_files: []
|
|
31
30
|
files:
|
32
31
|
- app/models/archive_day_index_page.rb
|
33
32
|
- app/models/archive_finder.rb
|
33
|
+
- app/models/archive_menu_renderer.rb
|
34
34
|
- app/models/archive_month_index_page.rb
|
35
35
|
- app/models/archive_page.rb
|
36
36
|
- app/models/archive_year_index_page.rb
|
@@ -46,22 +46,24 @@ files:
|
|
46
46
|
- features/support/matchers.rb
|
47
47
|
- features/support/paths.rb
|
48
48
|
- lib/archive_index_tags_and_methods.rb
|
49
|
+
- lib/page_children_cache_updates.rb
|
49
50
|
- lib/radiant-archive-extension/version.rb
|
50
51
|
- lib/radiant-archive-extension.rb
|
51
52
|
- lib/tasks/archive_extension_tasks.rake
|
52
|
-
- radiant-archive-extension-1.0.
|
53
|
+
- radiant-archive-extension-1.0.4.gem
|
53
54
|
- radiant-archive-extension.gemspec
|
54
55
|
- Rakefile
|
55
56
|
- README
|
56
57
|
- spec/datasets/archive_dataset.rb
|
57
58
|
- spec/models/archive_day_index_page_spec.rb
|
59
|
+
- spec/models/archive_menu_renderer_spec.rb
|
58
60
|
- spec/models/archive_month_index_page_spec.rb
|
59
61
|
- spec/models/archive_page_spec.rb
|
60
62
|
- spec/models/archive_year_index_page_spec.rb
|
61
63
|
- spec/models/page_spec.rb
|
62
64
|
- spec/spec.opts
|
63
65
|
- spec/spec_helper.rb
|
64
|
-
|
66
|
+
- .gitignore
|
65
67
|
homepage: http://radiantcms.org
|
66
68
|
licenses: []
|
67
69
|
|
@@ -91,13 +93,14 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
91
93
|
requirements: []
|
92
94
|
|
93
95
|
rubyforge_project:
|
94
|
-
rubygems_version: 1.
|
96
|
+
rubygems_version: 1.8.10
|
95
97
|
signing_key:
|
96
98
|
specification_version: 3
|
97
99
|
summary: Archive for Radiant CMS
|
98
100
|
test_files:
|
99
101
|
- spec/datasets/archive_dataset.rb
|
100
102
|
- spec/models/archive_day_index_page_spec.rb
|
103
|
+
- spec/models/archive_menu_renderer_spec.rb
|
101
104
|
- spec/models/archive_month_index_page_spec.rb
|
102
105
|
- spec/models/archive_page_spec.rb
|
103
106
|
- spec/models/archive_year_index_page_spec.rb
|