constructor-pages 0.3.2 → 0.3.3
Sign up to get free protection for your applications and to get access to all the features.
- data/app/controllers/constructor_pages/pages_controller.rb +4 -4
- data/app/models/constructor_pages/field.rb +18 -26
- data/app/models/constructor_pages/page.rb +52 -62
- data/app/models/constructor_pages/template.rb +2 -1
- data/app/models/constructor_pages/types/boolean_type.rb +1 -1
- data/app/models/constructor_pages/types/date_type.rb +1 -1
- data/app/models/constructor_pages/types/float_type.rb +1 -1
- data/app/models/constructor_pages/types/html_type.rb +1 -1
- data/app/models/constructor_pages/types/image_type.rb +1 -1
- data/app/models/constructor_pages/types/integer_type.rb +1 -1
- data/app/models/constructor_pages/types/string_type.rb +1 -1
- data/app/models/constructor_pages/types/text_type.rb +1 -1
- data/constructor-pages.gemspec +14 -4
- data/spec/models/constructor_pages/field_model_spec.rb +6 -0
- data/spec/models/constructor_pages/page_model_spec.rb +148 -0
- data/spec/models/constructor_pages/template_model_spec.rb +18 -0
- metadata +60 -10
- data/spec/factories.rb +0 -7
- data/spec/models/page_model_spec.rb +0 -113
@@ -53,8 +53,8 @@ module ConstructorPages
|
|
53
53
|
|
54
54
|
instance_variable_set('@'+@page.template.code_name.to_s, @page)
|
55
55
|
|
56
|
-
@children_of_current_root =
|
57
|
-
@children_of_current_page =
|
56
|
+
@children_of_current_root = @page.root.children
|
57
|
+
@children_of_current_page = @page.children
|
58
58
|
|
59
59
|
respond_to do |format|
|
60
60
|
format.html { render :template => "html_templates/#{@page.template.code_name}" }
|
@@ -107,8 +107,8 @@ module ConstructorPages
|
|
107
107
|
|
108
108
|
instance_variable_set('@'+template.code_name.pluralize, @pages)
|
109
109
|
|
110
|
-
@children_of_current_root =
|
111
|
-
@children_of_current_page =
|
110
|
+
@children_of_current_root = @page.root.children
|
111
|
+
@children_of_current_page = @page.children
|
112
112
|
|
113
113
|
render :template => "templates/#{template.code_name}_search"
|
114
114
|
end
|
@@ -2,29 +2,27 @@
|
|
2
2
|
|
3
3
|
module ConstructorPages
|
4
4
|
class Field < ActiveRecord::Base
|
5
|
-
attr_accessible :name, :code_name, :type_value, :template_id
|
5
|
+
attr_accessible :name, :code_name, :type_value, :template_id, :template
|
6
6
|
validates_presence_of :name
|
7
|
-
|
8
|
-
validate :method_uniqueness
|
9
|
-
|
10
7
|
validates_uniqueness_of :code_name, :scope => :template_id
|
8
|
+
validate :method_uniqueness
|
11
9
|
|
12
10
|
after_create :create_page_fields
|
13
11
|
after_destroy :destroy_page_fields
|
14
12
|
|
15
13
|
belongs_to :template
|
16
14
|
|
17
|
-
has_one :string_type,
|
18
|
-
has_one :integer_type,
|
19
|
-
has_one :float_type,
|
20
|
-
has_one :boolean_type,
|
21
|
-
has_one :text_type,
|
22
|
-
has_one :date_type,
|
23
|
-
has_one :html_type,
|
24
|
-
has_one :image_type,
|
15
|
+
has_one :string_type, class_name: 'Types::StringType'
|
16
|
+
has_one :integer_type, class_name: 'Types::IntegerType'
|
17
|
+
has_one :float_type, class_name: 'Types::FloatType'
|
18
|
+
has_one :boolean_type, class_name: 'Types::BooleanType'
|
19
|
+
has_one :text_type, class_name: 'Types::TextType'
|
20
|
+
has_one :date_type, class_name: 'Types::DateType'
|
21
|
+
has_one :html_type, class_name: 'Types::HtmlType'
|
22
|
+
has_one :image_type, class_name: 'Types::ImageType'
|
25
23
|
|
26
|
-
acts_as_list
|
27
|
-
default_scope :
|
24
|
+
acts_as_list scope: :template_id
|
25
|
+
default_scope order: :position
|
28
26
|
|
29
27
|
private
|
30
28
|
|
@@ -33,28 +31,22 @@ module ConstructorPages
|
|
33
31
|
or Page.first.respond_to?(code_name.pluralize) \
|
34
32
|
or Page.first.respond_to?(code_name.singularize) \
|
35
33
|
or template.self_and_ancestors.map{|t| t.code_name unless t.code_name == code_name}.include?(code_name.pluralize) \
|
36
|
-
or template.self_and_ancestors.map{|t| t.code_name t.code_name == code_name}.include?(code_name.singularize) \
|
37
|
-
or template.descendants.map{|t| t.code_name t.code_name == code_name}.include?(code_name.pluralize) \
|
38
|
-
or template.descendants.map{|t| t.code_name t.code_name == code_name}.include?(code_name.singularize)
|
39
|
-
errors.add(:base,
|
34
|
+
or template.self_and_ancestors.map{|t| t.code_name unless t.code_name == code_name}.include?(code_name.singularize) \
|
35
|
+
or template.descendants.map{|t| t.code_name unless t.code_name == code_name}.include?(code_name.pluralize) \
|
36
|
+
or template.descendants.map{|t| t.code_name unless t.code_name == code_name}.include?(code_name.singularize)
|
37
|
+
errors.add(:base, 'Такой метод уже используется')
|
40
38
|
end
|
41
39
|
end
|
42
40
|
|
43
41
|
def create_page_fields
|
44
42
|
self.template.pages.each do |page|
|
45
|
-
"constructor_pages/types/#{type_value}_type".classify.constantize.create
|
46
|
-
:page_id => page.id,
|
47
|
-
:field_id => id
|
48
|
-
)
|
43
|
+
"constructor_pages/types/#{type_value}_type".classify.constantize.create page_id: page.id, field_id: id
|
49
44
|
end
|
50
45
|
end
|
51
46
|
|
52
47
|
def destroy_page_fields
|
53
48
|
self.template.pages.each do |page|
|
54
|
-
"constructor_pages/types/#{type_value}_type".classify.constantize.destroy_all
|
55
|
-
:page_id => page.id,
|
56
|
-
:field_id => id
|
57
|
-
)
|
49
|
+
"constructor_pages/types/#{type_value}_type".classify.constantize.destroy_all page_id: page.id, field_id: id
|
58
50
|
end
|
59
51
|
end
|
60
52
|
end
|
@@ -4,45 +4,59 @@ module ConstructorPages
|
|
4
4
|
class Page < ActiveRecord::Base
|
5
5
|
attr_accessible :name, :title, :keywords, :description,
|
6
6
|
:url, :full_url, :active, :auto_url,
|
7
|
-
:parent_id, :link, :in_menu, :in_map,
|
8
|
-
:in_nav, :template_id
|
9
|
-
|
10
|
-
has_many :string_types
|
11
|
-
has_many :float_types,
|
12
|
-
has_many :boolean_types,
|
13
|
-
has_many :integer_types,
|
14
|
-
has_many :text_types,
|
15
|
-
has_many :date_types,
|
16
|
-
has_many :html_types,
|
17
|
-
has_many :image_types,
|
7
|
+
:parent, :parent_id, :link, :in_menu, :in_map,
|
8
|
+
:in_nav, :template_id, :template
|
9
|
+
|
10
|
+
has_many :string_types, dependent: :destroy, class_name: 'Types::StringType'
|
11
|
+
has_many :float_types, dependent: :destroy, class_name: 'Types::FloatType'
|
12
|
+
has_many :boolean_types, dependent: :destroy, class_name: 'Types::BooleanType'
|
13
|
+
has_many :integer_types, dependent: :destroy, class_name: 'Types::IntegerType'
|
14
|
+
has_many :text_types, dependent: :destroy, class_name: 'Types::TextType'
|
15
|
+
has_many :date_types, dependent: :destroy, class_name: 'Types::DateType'
|
16
|
+
has_many :html_types, dependent: :destroy, class_name: 'Types::HtmlType'
|
17
|
+
has_many :image_types, dependent: :destroy, class_name: 'Types::ImageType'
|
18
18
|
|
19
19
|
belongs_to :template
|
20
20
|
|
21
|
-
default_scope order
|
21
|
+
default_scope order :lft
|
22
22
|
|
23
|
-
|
24
|
-
after_update :full_url_descendants_change
|
25
|
-
|
26
|
-
before_update :full_url_change
|
27
|
-
before_create :full_url_create
|
23
|
+
validate :template_check
|
28
24
|
|
25
|
+
before_save :friendly_url, :template_assign, :full_url_update
|
26
|
+
after_update :descendants_update
|
29
27
|
after_create :create_fields
|
30
|
-
|
28
|
+
|
31
29
|
acts_as_nested_set
|
32
|
-
|
33
|
-
|
34
|
-
|
30
|
+
|
31
|
+
# generate full_url from parent page and url
|
32
|
+
def self.full_url_generate(parent_id, url = '')
|
33
|
+
Page.find(parent_id).self_and_ancestors.map {|c| c.url}.append(url).join('/')
|
35
34
|
end
|
36
35
|
|
37
|
-
def field(code_name, meth =
|
38
|
-
field =
|
36
|
+
def field(code_name, meth = 'value')
|
37
|
+
field = Field.where(code_name: code_name, template_id: self.template_id).first
|
39
38
|
|
40
39
|
if field
|
41
|
-
f = "constructor_pages/types/#{field.type_value}_type".classify.constantize.where(:
|
40
|
+
f = "constructor_pages/types/#{field.type_value}_type".classify.constantize.where(field_id: field.id, page_id: self.id).first
|
42
41
|
f.send(meth) if f
|
43
42
|
end
|
44
43
|
end
|
45
44
|
|
45
|
+
def as_json(options = {})
|
46
|
+
options = {
|
47
|
+
:name => self.name,
|
48
|
+
:title => self.title
|
49
|
+
}.merge options
|
50
|
+
|
51
|
+
self.template.fields.each do |field|
|
52
|
+
unless self.send(field.code_name)
|
53
|
+
options = {field.code_name => self.send(field.code_name)}.merge options
|
54
|
+
end
|
55
|
+
end
|
56
|
+
|
57
|
+
options
|
58
|
+
end
|
59
|
+
|
46
60
|
def method_missing(name, *args, &block)
|
47
61
|
name = name.to_s
|
48
62
|
|
@@ -61,56 +75,32 @@ module ConstructorPages
|
|
61
75
|
end
|
62
76
|
end
|
63
77
|
|
64
|
-
def as_json(options = {})
|
65
|
-
options = {
|
66
|
-
:name => self.name,
|
67
|
-
:title => self.title
|
68
|
-
}.merge options
|
69
|
-
|
70
|
-
self.template.fields.each do |field|
|
71
|
-
unless self.send(field.code_name)
|
72
|
-
options = {field.code_name => self.send(field.code_name)}.merge options
|
73
|
-
end
|
74
|
-
end
|
75
|
-
|
76
|
-
options
|
77
|
-
end
|
78
|
-
|
79
78
|
private
|
80
79
|
|
81
|
-
|
82
|
-
|
83
|
-
|
84
|
-
else
|
85
|
-
self.full_url = '/' + self.url
|
86
|
-
end
|
80
|
+
# if url has been changed by manually or url is empty
|
81
|
+
def friendly_url
|
82
|
+
self.url = ((auto_url || url.empty?) ? name : url).parameterize
|
87
83
|
end
|
88
84
|
|
89
|
-
|
90
|
-
|
91
|
-
|
92
|
-
else
|
93
|
-
self.full_url = self.parent.full_url + '/' + self.url
|
94
|
-
end
|
85
|
+
# page is not valid if there is no template
|
86
|
+
def template_check
|
87
|
+
errors.add_on_empty(:template_id) if Template.count == 0
|
95
88
|
end
|
96
89
|
|
97
|
-
|
98
|
-
|
90
|
+
# if template_id is nil then get first template
|
91
|
+
def template_assign
|
92
|
+
self.template_id = Template.first.id unless template_id
|
99
93
|
end
|
100
94
|
|
101
|
-
def
|
102
|
-
|
103
|
-
self.url = self.name.parameterize
|
104
|
-
else
|
105
|
-
self.url = self.url.parameterize
|
106
|
-
end
|
95
|
+
def full_url_update
|
96
|
+
self.full_url = '/' + (parent_id ? Page.full_url_generate(parent_id, url) : url)
|
107
97
|
end
|
108
98
|
|
99
|
+
def descendants_update; descendants.map(&:save) end
|
100
|
+
|
109
101
|
def create_fields
|
110
102
|
template.fields.each do |field|
|
111
|
-
"constructor_pages/types/#{field.type_value}_type".classify.constantize.create
|
112
|
-
:page_id => id,
|
113
|
-
:field_id => field.id)
|
103
|
+
"constructor_pages/types/#{field.type_value}_type".classify.constantize.create page_id: id, field: field
|
114
104
|
end
|
115
105
|
end
|
116
106
|
end
|
@@ -3,7 +3,8 @@
|
|
3
3
|
module ConstructorPages
|
4
4
|
class Template < ActiveRecord::Base
|
5
5
|
attr_accessible :name, :code_name, :child_id, :parent_id
|
6
|
-
|
6
|
+
|
7
|
+
validates_presence_of :name, :code_name
|
7
8
|
validates_uniqueness_of :code_name
|
8
9
|
|
9
10
|
validate :method_uniqueness
|
data/constructor-pages.gemspec
CHANGED
@@ -1,22 +1,32 @@
|
|
1
1
|
# encoding: utf-8
|
2
2
|
|
3
|
+
require File.expand_path('../../core/lib/constructor_core/version', __FILE__)
|
4
|
+
|
3
5
|
Gem::Specification.new do |s|
|
4
6
|
s.platform = Gem::Platform::RUBY
|
5
7
|
s.name = %q{constructor-pages}
|
6
|
-
s.version =
|
7
|
-
s.summary = %q{Pages for
|
8
|
+
s.version = ConstructorCore::VERSION
|
9
|
+
s.summary = %q{Pages for Constructor CMS}
|
8
10
|
s.authors = ['Ivan Zotov']
|
9
11
|
s.require_paths = %w(lib)
|
12
|
+
s.homepage = 'http://ivanzotov.github.com/constructor'
|
13
|
+
s.description = 'Pages for Constructor CMS'
|
14
|
+
s.email = 'ivanzotov@gmail.com'
|
10
15
|
|
11
16
|
s.files = `git ls-files`.split("\n")
|
12
17
|
s.test_files = `git ls-files -- spec/*`.split("\n")
|
13
18
|
s.executables = `git ls-files -- bin/*`.split("\n").map { |f| File.basename(f) }
|
14
|
-
|
19
|
+
|
20
|
+
s.add_dependency 'constructor-core', ConstructorCore::VERSION
|
21
|
+
|
15
22
|
s.add_dependency 'dragonfly'
|
16
23
|
s.add_dependency 'rack-cache'
|
17
24
|
s.add_dependency 'awesome_nested_set', '~> 2.0'
|
18
25
|
s.add_dependency 'haml-rails'
|
19
26
|
s.add_dependency 'aws-s3'
|
20
27
|
s.add_dependency 'russian', '~> 0.6.0'
|
21
|
-
s.add_dependency 'RedCloth'
|
28
|
+
s.add_dependency 'RedCloth'
|
29
|
+
s.add_dependency 'acts_as_list'
|
30
|
+
|
31
|
+
s.add_development_dependency 'rspec-rails'
|
22
32
|
end
|
@@ -0,0 +1,148 @@
|
|
1
|
+
# encoding: utf-8
|
2
|
+
|
3
|
+
require 'spec_helper'
|
4
|
+
|
5
|
+
module ConstructorPages
|
6
|
+
describe Page do
|
7
|
+
before :all do
|
8
|
+
Template.delete_all
|
9
|
+
Template.create name: 'Page', code_name: 'page'
|
10
|
+
|
11
|
+
|
12
|
+
Field.delete_all
|
13
|
+
Types::TextType.delete_all
|
14
|
+
end
|
15
|
+
|
16
|
+
it 'should be valid' do
|
17
|
+
page = Page.create
|
18
|
+
page.valid?.should be_true
|
19
|
+
end
|
20
|
+
|
21
|
+
describe '.field' do
|
22
|
+
it 'should get value from type_field' do
|
23
|
+
template = Template.create name: 'Page template', code_name: 'page_template'
|
24
|
+
page = Page.create name: 'Home page', template: template
|
25
|
+
field = Field.create name: 'Content', code_name: 'desc', template: template, type_value: 'text'
|
26
|
+
page.field('desc').should == field.text_type.value
|
27
|
+
end
|
28
|
+
end
|
29
|
+
|
30
|
+
describe '.full_url_generate' do
|
31
|
+
it 'should generate full_url from parent_id and url' do
|
32
|
+
end
|
33
|
+
end
|
34
|
+
|
35
|
+
describe '#as_json' do
|
36
|
+
it 'should return page as json format with fields'
|
37
|
+
end
|
38
|
+
|
39
|
+
describe '#auto_url' do
|
40
|
+
it 'should be true by default' do
|
41
|
+
page = Page.create
|
42
|
+
page.auto_url.should be_true
|
43
|
+
end
|
44
|
+
end
|
45
|
+
|
46
|
+
describe '#template' do
|
47
|
+
context 'if there is no template' do
|
48
|
+
it 'should not be valid' do
|
49
|
+
Template.delete_all
|
50
|
+
page = Page.create
|
51
|
+
page.valid?.should_not be_true
|
52
|
+
Template.create name: 'Page', code_name: 'page'
|
53
|
+
end
|
54
|
+
end
|
55
|
+
|
56
|
+
context 'if template_id is nil' do
|
57
|
+
it 'should be first template' do
|
58
|
+
page = Page.create
|
59
|
+
page.template.should == Template.first
|
60
|
+
end
|
61
|
+
end
|
62
|
+
end
|
63
|
+
|
64
|
+
describe '#url' do
|
65
|
+
context 'if url is empty or if auto_url is true' do
|
66
|
+
it 'should be generated from name' do
|
67
|
+
page = Page.create name: 'Hello world'
|
68
|
+
page.url.should == 'hello-world'
|
69
|
+
end
|
70
|
+
end
|
71
|
+
|
72
|
+
context 'else' do
|
73
|
+
it 'should get url field value' do
|
74
|
+
page = Page.create name: 'Hello', auto_url: true
|
75
|
+
page.url.should == 'hello'
|
76
|
+
|
77
|
+
page.auto_url = false
|
78
|
+
page.url = 'world'
|
79
|
+
page.save
|
80
|
+
page.url.should == 'world'
|
81
|
+
|
82
|
+
page.auto_url = true
|
83
|
+
page.name = 'Another world'
|
84
|
+
page.url = 'world-two'
|
85
|
+
page.save
|
86
|
+
page.url.should == 'another-world'
|
87
|
+
end
|
88
|
+
end
|
89
|
+
end
|
90
|
+
|
91
|
+
describe '#full_url' do
|
92
|
+
it 'should be generated from url and ancestors' do
|
93
|
+
page = Page.create name: 'Hello'
|
94
|
+
page.full_url.should == '/hello'
|
95
|
+
|
96
|
+
page_two = Page.create name: 'World', parent: page
|
97
|
+
page_two.full_url.should == '/hello/world'
|
98
|
+
end
|
99
|
+
|
100
|
+
context 'if parent or url has been changed' do
|
101
|
+
it 'should update full_url' do
|
102
|
+
page = Page.create name: 'Change url', url: 'change-url', auto_url: false
|
103
|
+
page.full_url.should == '/change-url'
|
104
|
+
|
105
|
+
page.url = 'another-change-url'
|
106
|
+
page.save
|
107
|
+
page.full_url.should == '/another-change-url'
|
108
|
+
end
|
109
|
+
end
|
110
|
+
|
111
|
+
context 'if parent is root or nil' do
|
112
|
+
it 'should be as /self.url' do
|
113
|
+
page = Page.create name: 'Page', url: 'page', auto_url: false, parent_id: nil
|
114
|
+
page.full_url.should == '/page'
|
115
|
+
|
116
|
+
parent = Page.create name: 'Parent'
|
117
|
+
page.parent = parent
|
118
|
+
page.save
|
119
|
+
|
120
|
+
page.full_url.should == '/parent/page'
|
121
|
+
|
122
|
+
page.parent = nil
|
123
|
+
page.save
|
124
|
+
page.full_url.should == '/page'
|
125
|
+
end
|
126
|
+
end
|
127
|
+
end
|
128
|
+
|
129
|
+
describe 'descendants_update' do
|
130
|
+
it 'should update descendants full_url' do
|
131
|
+
page = Page.create name: 'Update descendants', url: 'update-descendants', auto_url: false
|
132
|
+
page_two = Page.create name: 'Child', url: 'child', parent: page
|
133
|
+
page_two.full_url.should == '/update-descendants/child'
|
134
|
+
|
135
|
+
page = Page.find(page.id)
|
136
|
+
page.url = 'another-update-descendants'
|
137
|
+
page.save
|
138
|
+
|
139
|
+
page_two = Page.find(page_two.id)
|
140
|
+
page_two.full_url.should == '/another-update-descendants/child'
|
141
|
+
end
|
142
|
+
end
|
143
|
+
|
144
|
+
describe 'create_fields' do
|
145
|
+
it 'should create type_fields after update page'
|
146
|
+
end
|
147
|
+
end
|
148
|
+
end
|
@@ -0,0 +1,18 @@
|
|
1
|
+
# encoding: utf-8
|
2
|
+
|
3
|
+
require 'spec_helper'
|
4
|
+
|
5
|
+
module ConstructorPages
|
6
|
+
describe Template do
|
7
|
+
it 'should be valid' do
|
8
|
+
template = Template.create name: 'Page template', code_name: 'page_template'
|
9
|
+
template.valid?.should be_true
|
10
|
+
end
|
11
|
+
|
12
|
+
describe '#code_name' do
|
13
|
+
context 'validation' do
|
14
|
+
it 'should be uniqueness'
|
15
|
+
end
|
16
|
+
end
|
17
|
+
end
|
18
|
+
end
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: constructor-pages
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.3.
|
4
|
+
version: 0.3.3
|
5
5
|
prerelease:
|
6
6
|
platform: ruby
|
7
7
|
authors:
|
@@ -9,8 +9,24 @@ authors:
|
|
9
9
|
autorequire:
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
|
-
date: 2013-06-
|
12
|
+
date: 2013-06-11 00:00:00.000000000 Z
|
13
13
|
dependencies:
|
14
|
+
- !ruby/object:Gem::Dependency
|
15
|
+
name: constructor-core
|
16
|
+
requirement: !ruby/object:Gem::Requirement
|
17
|
+
none: false
|
18
|
+
requirements:
|
19
|
+
- - '='
|
20
|
+
- !ruby/object:Gem::Version
|
21
|
+
version: 0.3.3
|
22
|
+
type: :runtime
|
23
|
+
prerelease: false
|
24
|
+
version_requirements: !ruby/object:Gem::Requirement
|
25
|
+
none: false
|
26
|
+
requirements:
|
27
|
+
- - '='
|
28
|
+
- !ruby/object:Gem::Version
|
29
|
+
version: 0.3.3
|
14
30
|
- !ruby/object:Gem::Dependency
|
15
31
|
name: dragonfly
|
16
32
|
requirement: !ruby/object:Gem::Requirement
|
@@ -123,8 +139,40 @@ dependencies:
|
|
123
139
|
- - ! '>='
|
124
140
|
- !ruby/object:Gem::Version
|
125
141
|
version: '0'
|
126
|
-
|
127
|
-
|
142
|
+
- !ruby/object:Gem::Dependency
|
143
|
+
name: acts_as_list
|
144
|
+
requirement: !ruby/object:Gem::Requirement
|
145
|
+
none: false
|
146
|
+
requirements:
|
147
|
+
- - ! '>='
|
148
|
+
- !ruby/object:Gem::Version
|
149
|
+
version: '0'
|
150
|
+
type: :runtime
|
151
|
+
prerelease: false
|
152
|
+
version_requirements: !ruby/object:Gem::Requirement
|
153
|
+
none: false
|
154
|
+
requirements:
|
155
|
+
- - ! '>='
|
156
|
+
- !ruby/object:Gem::Version
|
157
|
+
version: '0'
|
158
|
+
- !ruby/object:Gem::Dependency
|
159
|
+
name: rspec-rails
|
160
|
+
requirement: !ruby/object:Gem::Requirement
|
161
|
+
none: false
|
162
|
+
requirements:
|
163
|
+
- - ! '>='
|
164
|
+
- !ruby/object:Gem::Version
|
165
|
+
version: '0'
|
166
|
+
type: :development
|
167
|
+
prerelease: false
|
168
|
+
version_requirements: !ruby/object:Gem::Requirement
|
169
|
+
none: false
|
170
|
+
requirements:
|
171
|
+
- - ! '>='
|
172
|
+
- !ruby/object:Gem::Version
|
173
|
+
version: '0'
|
174
|
+
description: Pages for Constructor CMS
|
175
|
+
email: ivanzotov@gmail.com
|
128
176
|
executables: []
|
129
177
|
extensions: []
|
130
178
|
extra_rdoc_files: []
|
@@ -196,9 +244,10 @@ files:
|
|
196
244
|
- lib/constructor-pages.rb
|
197
245
|
- lib/constructor_pages/engine.rb
|
198
246
|
- public/hello.txt
|
199
|
-
- spec/
|
200
|
-
- spec/models/page_model_spec.rb
|
201
|
-
|
247
|
+
- spec/models/constructor_pages/field_model_spec.rb
|
248
|
+
- spec/models/constructor_pages/page_model_spec.rb
|
249
|
+
- spec/models/constructor_pages/template_model_spec.rb
|
250
|
+
homepage: http://ivanzotov.github.com/constructor
|
202
251
|
licenses: []
|
203
252
|
post_install_message:
|
204
253
|
rdoc_options: []
|
@@ -221,7 +270,8 @@ rubyforge_project:
|
|
221
270
|
rubygems_version: 1.8.25
|
222
271
|
signing_key:
|
223
272
|
specification_version: 3
|
224
|
-
summary: Pages for
|
273
|
+
summary: Pages for Constructor CMS
|
225
274
|
test_files:
|
226
|
-
- spec/
|
227
|
-
- spec/models/page_model_spec.rb
|
275
|
+
- spec/models/constructor_pages/field_model_spec.rb
|
276
|
+
- spec/models/constructor_pages/page_model_spec.rb
|
277
|
+
- spec/models/constructor_pages/template_model_spec.rb
|
data/spec/factories.rb
DELETED
@@ -1,113 +0,0 @@
|
|
1
|
-
# encoding: utf-8
|
2
|
-
|
3
|
-
require './../spec/spec_helper'
|
4
|
-
|
5
|
-
describe Page do
|
6
|
-
describe "Title and Url" do
|
7
|
-
before :each do
|
8
|
-
Factory(:page, :title => "Hello", :url => '/hello')
|
9
|
-
end
|
10
|
-
|
11
|
-
it "should be unique" do
|
12
|
-
page = Factory.build(:page, :title => "Hello", :url => '/hello')
|
13
|
-
page.should_not be_valid
|
14
|
-
page.url = '/hello@#$%^&'
|
15
|
-
page.should_not be_valid
|
16
|
-
page.should have(1).error_on(:base)
|
17
|
-
|
18
|
-
page.url = "/world"
|
19
|
-
page.should be_valid
|
20
|
-
end
|
21
|
-
|
22
|
-
it "should be unique even before save" do
|
23
|
-
page = Factory.build(:page, :title => "Hello", :url => "")
|
24
|
-
|
25
|
-
page.should_not be_valid
|
26
|
-
page.should have(1).error_on(:base)
|
27
|
-
end
|
28
|
-
end
|
29
|
-
|
30
|
-
describe "Title" do
|
31
|
-
it "should not be empty" do
|
32
|
-
page = Factory.build(:page, :title => ' ')
|
33
|
-
page.should_not be_valid
|
34
|
-
page.should have(1).error_on(:title)
|
35
|
-
page.errors[:title].should == ['не может быть пустым']
|
36
|
-
|
37
|
-
page.title = "Title"
|
38
|
-
page.should be_valid
|
39
|
-
end
|
40
|
-
end
|
41
|
-
|
42
|
-
describe "In nav, in menu, in map" do
|
43
|
-
it "should be true by default" do
|
44
|
-
page = Page.new
|
45
|
-
page.in_nav.should be_true
|
46
|
-
page.in_menu.should be_true
|
47
|
-
page.in_map.should be_true
|
48
|
-
end
|
49
|
-
|
50
|
-
it "should change when given in new method" do
|
51
|
-
page = Page.new(:in_nav => false, :in_menu => false, :in_map => false)
|
52
|
-
page.in_nav.should be_false
|
53
|
-
page.in_menu.should be_false
|
54
|
-
page.in_map.should be_false
|
55
|
-
end
|
56
|
-
end
|
57
|
-
|
58
|
-
describe "Parent" do
|
59
|
-
it "should not be same as self" do
|
60
|
-
page = Factory(:page)
|
61
|
-
page.parent_id = page.id
|
62
|
-
|
63
|
-
page.save
|
64
|
-
page.should have(1).errors
|
65
|
-
end
|
66
|
-
end
|
67
|
-
|
68
|
-
describe "Url" do
|
69
|
-
context "Fix mistakes if remote" do
|
70
|
-
it "should fix http// and http:/" do
|
71
|
-
page = Factory(:page, :url => 'http:/myurl.com/')
|
72
|
-
page.url.should == 'http://myurl.com/'
|
73
|
-
|
74
|
-
page = Factory(:page, :url => 'http//myurl.com/')
|
75
|
-
page.url.should == 'http://myurl.com/'
|
76
|
-
end
|
77
|
-
end
|
78
|
-
|
79
|
-
context "If empty or nil" do
|
80
|
-
it "should be generated from title" do
|
81
|
-
page = Factory(:page, :title => " //Hello!@#$\%^&*() my WORLD /// привет// ", :url => ' ')
|
82
|
-
page.url.should == "\/hello-my-world\/privet"
|
83
|
-
end
|
84
|
-
|
85
|
-
it "should add parent url before if parent selected" do
|
86
|
-
page_parent = Factory(:page, :id => 1, :url => '/hello')
|
87
|
-
page = Factory(:page, :parent_id => page_parent, :title => 'World', :url => ' ')
|
88
|
-
page.url.should == '/hello/world'
|
89
|
-
|
90
|
-
# if parent not selected
|
91
|
-
page.parent_id = nil
|
92
|
-
page.url = ' '
|
93
|
-
page.save
|
94
|
-
page.url.should == '/world'
|
95
|
-
end
|
96
|
-
|
97
|
-
it "should be empty when page not valid" do
|
98
|
-
Factory(:page, :title => "Hello", :url => "/hello")
|
99
|
-
page = Factory.build(:page, :title => "Hello", :url => "")
|
100
|
-
|
101
|
-
page.should_not be_valid
|
102
|
-
page.url.should == ""
|
103
|
-
end
|
104
|
-
end
|
105
|
-
|
106
|
-
context "Finish cleanup" do
|
107
|
-
it "should cleanup url: remove spaces, fix backslashes, unknown chars etc." do
|
108
|
-
page = Factory(:page, :url => " //Hello!@#$\%^&*() my WORLD /// привет// ")
|
109
|
-
page.url.should == "\/hello-my-world\/privet"
|
110
|
-
end
|
111
|
-
end
|
112
|
-
end
|
113
|
-
end
|