kuhsaft 0.0.6 → 0.0.7
Sign up to get free protection for your applications and to get access to all the features.
- data/README +9 -0
- data/app/controllers/kuhsaft/admin/admin_controller.rb +18 -0
- data/app/controllers/kuhsaft/admin/assets_controller.rb +1 -4
- data/app/controllers/kuhsaft/admin/pages_controller.rb +17 -17
- data/app/models/kuhsaft/localized_page.rb +22 -3
- data/app/models/kuhsaft/page.rb +22 -18
- data/app/models/kuhsaft/page_part.rb +1 -1
- data/app/models/kuhsaft/page_part/content.rb +55 -0
- data/app/models/kuhsaft/page_part/markdown.rb +8 -0
- data/app/models/kuhsaft/publish_state.rb +29 -0
- data/app/stylesheets/kuhsaft/admin/partials/_generic.sass +29 -10
- data/app/stylesheets/kuhsaft/admin/partials/_pages.sass +6 -2
- data/app/views/kuhsaft/admin/kuhsaft/page_part/markdowns/_markdown.html.haml +1 -0
- data/app/views/kuhsaft/admin/pages/_form.html.haml +22 -11
- data/app/views/kuhsaft/admin/pages/edit.html.haml +7 -1
- data/app/views/kuhsaft/admin/pages/index.html.haml +0 -13
- data/app/views/kuhsaft/admin/pages/new.html.haml +3 -1
- data/app/views/layouts/kuhsaft/admin.html.haml +3 -1
- data/config/initializers/page_parts.rb +16 -0
- data/config/locales/kuhsaft.en.yml +2 -0
- data/config/routes.rb +6 -1
- data/kuhsaft.gemspec +4 -4
- data/lib/generators/kuhsaft/install/migrations_generator.rb +5 -1
- data/lib/kuhsaft/version.rb +1 -1
- data/lib/templates/kuhsaft/install/add_fulltext_to_localized_page.rb +9 -0
- data/lib/templates/kuhsaft/install/add_page_type_to_localized_pages.rb +9 -0
- data/lib/templates/kuhsaft/install/add_published_at_to_localized_pages.rb +9 -0
- data/lib/templates/kuhsaft/install/add_type_to_page_part_contents.rb +9 -0
- data/public/javascripts/kuhsaft/admin/application.js +17 -0
- data/public/javascripts/kuhsaft/admin/jquery-ui-1.8.12.custom.min.js +192 -0
- data/spec/controllers/admin_pages_controller_spec.rb +33 -6
- data/spec/dummy/config/database.yml +2 -2
- data/spec/dummy/config/locales/en.yml +3 -1
- data/spec/factories.rb +0 -9
- data/spec/models/localized_page_spec.rb +103 -15
- data/spec/models/page_part_content_spec.rb +59 -17
- data/spec/models/page_part_spec.rb +1 -1
- data/spec/models/page_spec.rb +34 -29
- data/spec/models/publish_state_spec.rb +45 -0
- data/spec/routing/pages_routing_spec.rb +28 -21
- metadata +38 -21
- data/app/models/kuhsaft/page_parts/base.rb +0 -26
- data/app/models/kuhsaft/page_parts/content.rb +0 -8
- data/app/models/kuhsaft/page_parts/markdown.rb +0 -7
- data/public/javascripts/kuhsaft/admin/jquery-ui-1.8.10.custom.min.js +0 -110
data/spec/factories.rb
CHANGED
@@ -1,9 +1,3 @@
|
|
1
|
-
Factory.define :page_part, :class => Kuhsaft::PagePart::Content do |p|
|
2
|
-
p.position 1
|
3
|
-
p.content Kuhsaft::PagePart::Markdown.new(:text => 'h1. Hello world!')
|
4
|
-
p.association :localized_page
|
5
|
-
end
|
6
|
-
|
7
1
|
Factory.define :localized_page, :class => Kuhsaft::LocalizedPage do |p|
|
8
2
|
p.locale 'en'
|
9
3
|
p.title 'English title'
|
@@ -11,9 +5,6 @@ Factory.define :localized_page, :class => Kuhsaft::LocalizedPage do |p|
|
|
11
5
|
p.body 'hi'
|
12
6
|
p.url ''
|
13
7
|
p.association :page
|
14
|
-
p.after_create do |page|
|
15
|
-
page.page_parts << Factory.build(:page_part, :localized_page => page)
|
16
|
-
end
|
17
8
|
end
|
18
9
|
|
19
10
|
Factory.define :page, :class => Kuhsaft::Page do |p|
|
@@ -1,9 +1,8 @@
|
|
1
1
|
require 'spec_helper'
|
2
2
|
|
3
3
|
describe Kuhsaft::LocalizedPage do
|
4
|
-
|
5
4
|
before :each do
|
6
|
-
@localized_page = Factory.
|
5
|
+
@localized_page = Factory.create(:localized_page)
|
7
6
|
end
|
8
7
|
|
9
8
|
it 'should have a symbolized locale' do
|
@@ -11,7 +10,11 @@ describe Kuhsaft::LocalizedPage do
|
|
11
10
|
end
|
12
11
|
|
13
12
|
it 'should be published' do
|
14
|
-
|
13
|
+
@localized_page.published?.should be_true
|
14
|
+
end
|
15
|
+
|
16
|
+
it 'should have a fulltext field' do
|
17
|
+
@localized_page.should respond_to(:fulltext)
|
15
18
|
end
|
16
19
|
|
17
20
|
it 'should not be published when set to false' do
|
@@ -34,35 +37,120 @@ describe Kuhsaft::LocalizedPage do
|
|
34
37
|
end
|
35
38
|
|
36
39
|
it 'should generate the slug from the title' do
|
37
|
-
|
40
|
+
@localized_page.slug.should eq(@localized_page.title.parameterize)
|
41
|
+
end
|
42
|
+
|
43
|
+
it 'should have page_parts' do
|
44
|
+
@localized_page.should respond_to(:page_parts)
|
38
45
|
end
|
39
46
|
|
40
47
|
it 'should not generate the slug if the user has set it' do
|
41
48
|
Factory.create(:localized_page, :slug => 'my-slug').slug.should == 'my-slug'
|
42
49
|
end
|
43
50
|
|
44
|
-
|
45
|
-
|
51
|
+
after :each do
|
52
|
+
@localized_page.destroy
|
46
53
|
end
|
47
54
|
|
48
|
-
|
49
|
-
|
55
|
+
describe 'page_type' do
|
56
|
+
it 'should have a page_type' do
|
57
|
+
@localized_page.should respond_to(:page_type)
|
58
|
+
end
|
59
|
+
|
60
|
+
it 'should generate the url with an empty page_type' do
|
61
|
+
page = Factory.create :page
|
62
|
+
page.translation.url.should eq('en/english-title')
|
63
|
+
end
|
64
|
+
|
65
|
+
it 'should take the users url with a "redirect" page_type' do
|
66
|
+
page = Factory.create :page
|
67
|
+
page.translation.page_type = 'redirect'
|
68
|
+
page.translation.url = '/en/news'
|
69
|
+
page.save
|
70
|
+
page.translation.url.should eq('/en/news')
|
71
|
+
end
|
50
72
|
end
|
51
73
|
|
52
74
|
describe 'validations' do
|
53
|
-
|
54
|
-
|
55
|
-
@
|
56
|
-
@
|
57
|
-
@page.slug = nil
|
75
|
+
before do
|
76
|
+
@localized_page = Factory.create :localized_page
|
77
|
+
@localized_page.title = nil
|
78
|
+
@localized_page.slug = nil
|
58
79
|
end
|
59
80
|
|
60
81
|
it 'should have a title' do
|
61
|
-
@
|
82
|
+
@localized_page.should have(1).error_on(:title)
|
62
83
|
end
|
63
84
|
|
64
85
|
it 'should have a slug' do
|
65
|
-
@
|
86
|
+
@localized_page.should have(1).error_on(:slug)
|
87
|
+
end
|
88
|
+
|
89
|
+
after do
|
90
|
+
@localized_page.destroy
|
91
|
+
end
|
92
|
+
end
|
93
|
+
|
94
|
+
describe 'fulltext' do
|
95
|
+
before do
|
96
|
+
@page = Factory.create :page
|
97
|
+
@page.translation.keywords = 'key words'
|
98
|
+
@page.translation.description = 'descrip tion'
|
99
|
+
@page.translation.title = 'my title'
|
100
|
+
@page.translation.page_parts << Kuhsaft::PagePart::Markdown.new(:text => 'oh la la1')
|
101
|
+
@page.translation.page_parts << Kuhsaft::PagePart::Markdown.new(:text => 'oh la la2')
|
102
|
+
@page.translation.page_parts << Kuhsaft::PagePart::Markdown.new(:text => 'oh la la3')
|
103
|
+
@page.translation.page_parts << Kuhsaft::PagePart::Markdown.new(:text => nil)
|
104
|
+
@page.save
|
105
|
+
end
|
106
|
+
|
107
|
+
it 'should collect the fulltext when saved' do
|
108
|
+
@page.translation.should_receive(:collect_fulltext)
|
109
|
+
@page.save
|
110
|
+
end
|
111
|
+
|
112
|
+
it 'should contain the title' do
|
113
|
+
@page.fulltext.should include('my title')
|
114
|
+
end
|
115
|
+
|
116
|
+
it 'should contain the keywords' do
|
117
|
+
@page.fulltext.should include('key words')
|
118
|
+
end
|
119
|
+
|
120
|
+
it 'should contain the description' do
|
121
|
+
@page.fulltext.should include('descrip tion')
|
122
|
+
end
|
123
|
+
|
124
|
+
it 'should contain the page part content' do
|
125
|
+
@page.fulltext.should include('oh la la')
|
126
|
+
end
|
127
|
+
|
128
|
+
it 'should convert all data to strings' do
|
129
|
+
expect { @page.translation.collect_fulltext }.to_not raise_error
|
130
|
+
end
|
131
|
+
end
|
132
|
+
|
133
|
+
describe 'search' do
|
134
|
+
before do
|
135
|
+
Factory.create :page
|
136
|
+
Factory.create :page
|
137
|
+
Factory.create :page
|
138
|
+
end
|
139
|
+
|
140
|
+
it 'should find any containing the search term' do
|
141
|
+
Kuhsaft::LocalizedPage.search('hi').should have_at_least(0).items
|
142
|
+
end
|
143
|
+
|
144
|
+
it 'should find with "English Title"' do
|
145
|
+
Kuhsaft::LocalizedPage.search('English Title').should have_at_least(1).item
|
146
|
+
end
|
147
|
+
|
148
|
+
it 'should only find results with the current locale' do
|
149
|
+
Kuhsaft::LocalizedPage.search('English Title').should be_all { |p| p.locale == Kuhsaft::Page.current_translation_locale }
|
150
|
+
end
|
151
|
+
|
152
|
+
it 'should only find published results' do
|
153
|
+
Kuhsaft::LocalizedPage.search('English Title').should be_all { |p| p.published? == true }
|
66
154
|
end
|
67
155
|
end
|
68
156
|
end
|
@@ -1,22 +1,64 @@
|
|
1
1
|
require 'spec_helper'
|
2
2
|
|
3
|
-
describe
|
4
|
-
|
5
|
-
|
6
|
-
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
|
3
|
+
describe 'PagePart' do
|
4
|
+
describe 'Content' do
|
5
|
+
before do
|
6
|
+
@content = Kuhsaft::PagePart::Content.new
|
7
|
+
end
|
8
|
+
|
9
|
+
it 'should belong to a LocalizedPage' do
|
10
|
+
@content.should respond_to(:localized_page)
|
11
|
+
end
|
12
|
+
|
13
|
+
it 'should have a content to store serialized data' do
|
14
|
+
@content.should respond_to(:content)
|
15
|
+
end
|
16
|
+
|
17
|
+
context 'class' do
|
18
|
+
it 'should keep a list of the serializeable attributes' do
|
19
|
+
Kuhsaft::PagePart::Content.serializeable_attributes.should be_a(Array)
|
20
|
+
end
|
21
|
+
|
22
|
+
it 'should keep a list of searchable attributes' do
|
23
|
+
Kuhsaft::PagePart::Content.searchable_attributes.should be_a(Array)
|
24
|
+
end
|
25
|
+
|
26
|
+
it 'should have a list of page_part_types' do
|
27
|
+
Kuhsaft::PagePart::Content.page_part_types.should be_all { |p| p.superclass.should eq Kuhsaft::PagePart::Content }
|
28
|
+
end
|
29
|
+
|
30
|
+
it 'should have the Markdown PagePart by default' do
|
31
|
+
Kuhsaft::PagePart::Content.descendants.should include(Kuhsaft::PagePart::Markdown)
|
32
|
+
end
|
33
|
+
|
34
|
+
it 'should convert to_name' do
|
35
|
+
Kuhsaft::PagePart::Markdown.to_name.should eq('Markdown')
|
36
|
+
end
|
37
|
+
end
|
17
38
|
end
|
18
39
|
|
19
|
-
|
20
|
-
|
40
|
+
describe 'Markdown' do
|
41
|
+
before do
|
42
|
+
@m = Kuhsaft::PagePart::Markdown.new
|
43
|
+
end
|
44
|
+
|
45
|
+
it 'should have text' do
|
46
|
+
@m.should respond_to(:text)
|
47
|
+
end
|
48
|
+
|
49
|
+
it 'should have searchable text' do
|
50
|
+
Kuhsaft::PagePart::Markdown.searchable_attributes.should include(:text)
|
51
|
+
end
|
52
|
+
|
53
|
+
it 'should store text' do
|
54
|
+
@m.text = 'hi'
|
55
|
+
@m.text.should eq('hi')
|
56
|
+
end
|
57
|
+
|
58
|
+
it 'should restore the serialized attributes when loaded' do
|
59
|
+
m = Kuhsaft::PagePart::Markdown.create(:text => 'hi')
|
60
|
+
m2 = Kuhsaft::PagePart::Markdown.find(m.id)
|
61
|
+
m2.text.should eq('hi')
|
62
|
+
end
|
21
63
|
end
|
22
|
-
end
|
64
|
+
end
|
data/spec/models/page_spec.rb
CHANGED
@@ -2,6 +2,14 @@ require 'spec_helper'
|
|
2
2
|
|
3
3
|
describe Kuhsaft::Page do
|
4
4
|
|
5
|
+
before do
|
6
|
+
set_lang :en
|
7
|
+
end
|
8
|
+
|
9
|
+
after do
|
10
|
+
reset_lang
|
11
|
+
end
|
12
|
+
|
5
13
|
before :each do
|
6
14
|
destroy_all_pages
|
7
15
|
@page = Factory.create :page
|
@@ -111,11 +119,19 @@ describe Kuhsaft::Page do
|
|
111
119
|
page = Factory.create :page
|
112
120
|
child = Factory.create :page
|
113
121
|
page.childs << child
|
114
|
-
page.body = nil
|
122
|
+
page.translation.body = nil
|
115
123
|
page.save
|
116
124
|
page.link.should == child.link
|
117
125
|
end
|
118
126
|
|
127
|
+
it 'should not modify the url when it\'s a redirect' do
|
128
|
+
page = Factory.create :page
|
129
|
+
page.translation.page_type = 'redirect'
|
130
|
+
page.translation.url = '/en/news'
|
131
|
+
page.save
|
132
|
+
page.link.should eq('/en/news')
|
133
|
+
end
|
134
|
+
|
119
135
|
it 'should find its translated content by url' do
|
120
136
|
destroy_all_pages
|
121
137
|
page = Factory.create(:page)
|
@@ -140,38 +156,27 @@ describe Kuhsaft::Page do
|
|
140
156
|
Kuhsaft::Page.translation_locales.first.should be(:de)
|
141
157
|
end
|
142
158
|
|
143
|
-
|
144
|
-
|
145
|
-
|
146
|
-
|
147
|
-
|
148
|
-
|
149
|
-
|
150
|
-
|
151
|
-
|
152
|
-
|
153
|
-
|
154
|
-
|
155
|
-
|
156
|
-
end
|
157
|
-
|
158
|
-
it 'should delegate the url to the translation' do
|
159
|
-
@page.url.should == @page.translation.url
|
160
|
-
end
|
161
|
-
|
162
|
-
it 'should delegate the keywords to the translation' do
|
163
|
-
@page.keywords = 'my keywords are superb'
|
164
|
-
@page.translation.keywords.should == 'my keywords are superb'
|
159
|
+
it 'should have a translation' do
|
160
|
+
@page.translation.should be_a(Kuhsaft::LocalizedPage)
|
161
|
+
end
|
162
|
+
|
163
|
+
it 'accepts a page_part_type to determine which page_part needs to be added' do
|
164
|
+
@page.should respond_to(:page_part_type)
|
165
|
+
end
|
166
|
+
|
167
|
+
describe 'should delegate' do
|
168
|
+
it 'slug, title, keywords and description to the translation' do
|
169
|
+
[:slug, :title, :keywords, :description].each do |attr|
|
170
|
+
@page.send(attr).should eq(@page.translation.send(attr))
|
171
|
+
end
|
165
172
|
end
|
166
173
|
|
167
|
-
it '
|
168
|
-
@page.
|
169
|
-
@page.translation.description.should == 'my description'
|
174
|
+
it 'url to the translation' do
|
175
|
+
@page.url.should eq(@page.translation.url)
|
170
176
|
end
|
171
177
|
|
172
|
-
it '
|
173
|
-
@page.locale
|
174
|
-
@page.translation.locale.should == :de
|
178
|
+
it 'locale to the translation' do
|
179
|
+
@page.locale.should be(@page.translation.locale)
|
175
180
|
end
|
176
181
|
end
|
177
182
|
end
|
@@ -0,0 +1,45 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
describe Kuhsaft::PublishState do
|
4
|
+
context 'unpublished' do
|
5
|
+
before do
|
6
|
+
@publish_state = Kuhsaft::PublishState.new(:name => 'unpublished', :value => Kuhsaft::PublishState::UNPUBLISHED)
|
7
|
+
end
|
8
|
+
|
9
|
+
it 'should be UNPUBLISHED' do
|
10
|
+
@publish_state.value.should be(Kuhsaft::PublishState::UNPUBLISHED)
|
11
|
+
end
|
12
|
+
|
13
|
+
it 'should have a translated name' do
|
14
|
+
@publish_state.human_name.should eq(I18n.translate('unpublished'))
|
15
|
+
end
|
16
|
+
end
|
17
|
+
|
18
|
+
context 'published' do
|
19
|
+
before do
|
20
|
+
@publish_state = Kuhsaft::PublishState.new(:name => 'published', :value => Kuhsaft::PublishState::PUBLISHED)
|
21
|
+
end
|
22
|
+
|
23
|
+
it 'should be PUBLISHED' do
|
24
|
+
@publish_state.value.should be(Kuhsaft::PublishState::PUBLISHED)
|
25
|
+
end
|
26
|
+
|
27
|
+
it 'should have a translated name' do
|
28
|
+
@publish_state.human_name.should eq(I18n.translate('published'))
|
29
|
+
end
|
30
|
+
end
|
31
|
+
|
32
|
+
context 'published_at' do
|
33
|
+
before do
|
34
|
+
@publish_state = Kuhsaft::PublishState.new(:name => 'published_at', :value => Kuhsaft::PublishState::PUBLISHED_AT)
|
35
|
+
end
|
36
|
+
|
37
|
+
it 'should be PUBLISHED_AT' do
|
38
|
+
@publish_state.value.should be(Kuhsaft::PublishState::PUBLISHED_AT)
|
39
|
+
end
|
40
|
+
|
41
|
+
it 'should have a translated name' do
|
42
|
+
@publish_state.human_name.should eq(I18n.translate('published_at'))
|
43
|
+
end
|
44
|
+
end
|
45
|
+
end
|
@@ -11,56 +11,63 @@ describe 'routing to Kuhsaft::PagesController' do
|
|
11
11
|
end
|
12
12
|
|
13
13
|
describe 'routing to Kuhsaft::Admin::PagesController' do
|
14
|
-
it 'routes /admin/pages to admin/pages#index' do
|
15
|
-
{ :get => '/admin/pages' }.should route_to(
|
14
|
+
it 'routes /en/admin/pages to admin/pages#index' do
|
15
|
+
{ :get => '/en/admin/pages' }.should route_to(
|
16
16
|
:controller => 'kuhsaft/admin/pages',
|
17
|
-
:action => 'index'
|
17
|
+
:action => 'index',
|
18
|
+
:locale => 'en'
|
18
19
|
)
|
19
20
|
end
|
20
21
|
|
21
|
-
it 'routes POST /admin/pages to admin/pages#create' do
|
22
|
-
{ :post => '/admin/pages' }.should route_to(
|
22
|
+
it 'routes POST /en/admin/pages to admin/pages#create' do
|
23
|
+
{ :post => '/en/admin/pages' }.should route_to(
|
23
24
|
:controller => 'kuhsaft/admin/pages',
|
24
|
-
:action => 'create'
|
25
|
+
:action => 'create',
|
26
|
+
:locale => 'en'
|
25
27
|
)
|
26
28
|
end
|
27
29
|
|
28
|
-
it 'routes PUT /admin/pages/:id to admin/pages#update' do
|
29
|
-
{ :put => '/admin/pages/1' }.should route_to(
|
30
|
+
it 'routes PUT /en/admin/pages/:id to admin/pages#update' do
|
31
|
+
{ :put => '/en/admin/pages/1' }.should route_to(
|
30
32
|
:controller => 'kuhsaft/admin/pages',
|
31
33
|
:action => 'update',
|
32
|
-
:id => '1'
|
34
|
+
:id => '1',
|
35
|
+
:locale => 'en'
|
33
36
|
)
|
34
37
|
end
|
35
38
|
|
36
|
-
it 'routes DELETE /admin/pages/:id to admin/pages#destroy' do
|
37
|
-
{ :delete => '/admin/pages/1' }.should route_to(
|
39
|
+
it 'routes DELETE /en/admin/pages/:id to admin/pages#destroy' do
|
40
|
+
{ :delete => '/en/admin/pages/1' }.should route_to(
|
38
41
|
:controller => 'kuhsaft/admin/pages',
|
39
42
|
:action => 'destroy',
|
40
|
-
:id => '1'
|
43
|
+
:id => '1',
|
44
|
+
:locale => 'en'
|
41
45
|
)
|
42
46
|
end
|
43
47
|
|
44
|
-
it 'routes /admin/pages/:id to admin/pages#show' do
|
45
|
-
{ :get => '/admin/pages/1' }.should route_to(
|
48
|
+
it 'routes /en/admin/pages/:id to admin/pages#show' do
|
49
|
+
{ :get => '/en/admin/pages/1' }.should route_to(
|
46
50
|
:controller => 'kuhsaft/admin/pages',
|
47
51
|
:action => 'show',
|
48
|
-
:id => '1'
|
52
|
+
:id => '1',
|
53
|
+
:locale => 'en'
|
49
54
|
)
|
50
55
|
end
|
51
56
|
|
52
|
-
it 'routes /admin/pages/new to admin/pages#new' do
|
53
|
-
{ :get => '/admin/pages/new' }.should route_to(
|
57
|
+
it 'routes /en/admin/pages/new to admin/pages#new' do
|
58
|
+
{ :get => '/en/admin/pages/new' }.should route_to(
|
54
59
|
:controller => 'kuhsaft/admin/pages',
|
55
|
-
:action => 'new'
|
60
|
+
:action => 'new',
|
61
|
+
:locale => 'en'
|
56
62
|
)
|
57
63
|
end
|
58
64
|
|
59
|
-
it 'routes /admin/pages/:id/edit to admin/pages#edit' do
|
60
|
-
{ :get => '/admin/pages/1/edit' }.should route_to(
|
65
|
+
it 'routes /en/admin/pages/:id/edit to admin/pages#edit' do
|
66
|
+
{ :get => '/en/admin/pages/1/edit' }.should route_to(
|
61
67
|
:controller => 'kuhsaft/admin/pages',
|
62
68
|
:action => 'edit',
|
63
|
-
:id => '1'
|
69
|
+
:id => '1',
|
70
|
+
:locale => 'en'
|
64
71
|
)
|
65
72
|
end
|
66
73
|
end
|