constructor-pages 0.5.7 → 0.5.8
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.
- checksums.yaml +4 -4
- data/app/controllers/constructor_pages/pages_controller.rb +1 -0
- data/app/helpers/constructor_pages/code_name_uniq.rb +1 -1
- data/app/models/constructor_pages/field.rb +24 -12
- data/app/models/constructor_pages/page.rb +8 -6
- data/app/models/constructor_pages/template.rb +9 -1
- data/constructor-pages.gemspec +0 -1
- data/spec/models/constructor_pages/field_model_spec.rb +114 -4
- data/spec/models/constructor_pages/page_model_spec.rb +6 -4
- data/spec/models/constructor_pages/template_model_spec.rb +19 -2
- data/spec/requests/constructor_pages/pages_controller_spec.rb +4 -5
- metadata +4 -5
- data/spec/features/constructor_pages/pages_controller_spec.rb +0 -13
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: e9b2d5a5066524d6c27449d84de87965553916c7
|
4
|
+
data.tar.gz: 88bdd55c263eaf36a80cf7e4638a840a98cc245a
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 06d3f0dace870f2325d88361ec28bea1c7829475db50e105b6d086bb91a91f555bbb8ae9b4599a8e2ac4f29bc4e213969324866603e3344ef36e6131e0ec25dd
|
7
|
+
data.tar.gz: 8ef00cb3d76539fc7923cacf066367b686d91aa11269325c9b0351a3430e859d6fcc5052cda0afe8d25f40fca51efc6977923aef9e92ef4aedf257be92101841
|
@@ -1,12 +1,18 @@
|
|
1
1
|
# encoding: utf-8
|
2
2
|
|
3
3
|
module ConstructorPages
|
4
|
+
# Field model. Fields allows to add custom fields for template.
|
5
|
+
#
|
6
|
+
# Each field has type of value such as float, integer, string...
|
4
7
|
class Field < ActiveRecord::Base
|
8
|
+
attr_accessible :name, :code_name, :type_value, :template_id, :template
|
9
|
+
|
10
|
+
# Adding code_name_uniqueness method
|
5
11
|
include CodeNameUniq
|
6
12
|
|
13
|
+
# Array of available field types
|
7
14
|
TYPES = %w{string integer float boolean text date html image}
|
8
15
|
|
9
|
-
attr_accessible :name, :code_name, :type_value, :template_id, :template
|
10
16
|
validates_presence_of :name
|
11
17
|
validates_uniqueness_of :code_name, :scope => :template_id
|
12
18
|
validate :code_name_uniqueness
|
@@ -16,6 +22,7 @@ module ConstructorPages
|
|
16
22
|
|
17
23
|
belongs_to :template
|
18
24
|
|
25
|
+
# Adding has_many for all field types
|
19
26
|
TYPES.each do |t|
|
20
27
|
class_eval %{
|
21
28
|
has_many :#{t}_types, class_name: 'Types::#{t.titleize}Type'
|
@@ -27,24 +34,25 @@ module ConstructorPages
|
|
27
34
|
acts_as_list scope: :template_id
|
28
35
|
default_scope order: :position
|
29
36
|
|
30
|
-
#
|
37
|
+
# Return constant of model type_value
|
31
38
|
def type_class; "constructor_pages/types/#{type_value}_type".classify.constantize end
|
32
39
|
|
33
|
-
#
|
40
|
+
# Return object of type_value by page
|
34
41
|
def find_type_object(page); type_class.find_by_field_id_and_page_id(id, page.id) end
|
35
42
|
|
36
|
-
#
|
43
|
+
# Create object of type_value by page
|
37
44
|
def create_type_object(page); type_class.create(field_id: id, page_id: page.id) end
|
38
45
|
|
39
|
-
|
46
|
+
# Remove all type_fields values for specified page
|
47
|
+
def remove_type_object(page); find_type_object(page).destroy end
|
40
48
|
|
41
|
-
#
|
49
|
+
# Get value from type_field for specified page
|
42
50
|
def get_value_for(page)
|
43
51
|
_type_object = find_type_object(page)
|
44
52
|
_type_object ? _type_object.value : nil
|
45
53
|
end
|
46
54
|
|
47
|
-
#
|
55
|
+
# Set value type_field for specified page
|
48
56
|
def set_value_for(page, value)
|
49
57
|
_type_object = find_type_object(page)
|
50
58
|
|
@@ -54,18 +62,22 @@ module ConstructorPages
|
|
54
62
|
end
|
55
63
|
end
|
56
64
|
|
57
|
-
# remove all type_fields values for specified page
|
58
|
-
def remove_values_for(page); type_class.destroy_all field_id: id, page_id: page.id end
|
59
|
-
|
60
65
|
private
|
61
66
|
|
67
|
+
# Check if there is code_name in template branch
|
62
68
|
def check_code_name(code_name)
|
63
69
|
[code_name.pluralize, code_name.singularize].each do |name|
|
64
|
-
|
65
|
-
|
70
|
+
%w{self_and_ancestors descendants}.each do |m|
|
71
|
+
if template.send(m).map{|t| t.code_name}.include?(name)
|
72
|
+
return false
|
73
|
+
end
|
74
|
+
end
|
66
75
|
end
|
76
|
+
|
77
|
+
true
|
67
78
|
end
|
68
79
|
|
80
|
+
# Create and destroy page fields
|
69
81
|
%w{create destroy_all}.each do |m|
|
70
82
|
class_eval %{
|
71
83
|
def #{m}_page_fields
|
@@ -1,12 +1,14 @@
|
|
1
1
|
# encoding: utf-8
|
2
2
|
|
3
3
|
module ConstructorPages
|
4
|
+
# Page model. Pages are core for company websites, blogs etc.
|
4
5
|
class Page < ActiveRecord::Base
|
5
6
|
attr_accessible :name, :title, :keywords, :description,
|
6
7
|
:url, :full_url, :active, :auto_url,
|
7
8
|
:parent, :parent_id, :link, :in_menu, :in_map,
|
8
9
|
:in_nav, :template_id, :template
|
9
10
|
|
11
|
+
# Adding has_many for all field types
|
10
12
|
Field::TYPES.each do |t|
|
11
13
|
class_eval %{
|
12
14
|
has_many :#{t}_types, dependent: :destroy, class_name: 'Types::#{t.titleize}Type'
|
@@ -23,7 +25,7 @@ module ConstructorPages
|
|
23
25
|
|
24
26
|
before_save :friendly_url, :template_assign, :full_url_update
|
25
27
|
after_update :descendants_update
|
26
|
-
after_create :
|
28
|
+
after_create :create_fields_values
|
27
29
|
|
28
30
|
acts_as_nested_set
|
29
31
|
|
@@ -77,7 +79,7 @@ module ConstructorPages
|
|
77
79
|
fields.each do |field|
|
78
80
|
value = params[field.code_name.to_sym]
|
79
81
|
|
80
|
-
_type_object = field.
|
82
|
+
_type_object = field.find_type_object(self)
|
81
83
|
_type_object.value = 0 if field.type_value == 'boolean' and reset_booleans
|
82
84
|
|
83
85
|
if value
|
@@ -88,9 +90,12 @@ module ConstructorPages
|
|
88
90
|
end
|
89
91
|
end
|
90
92
|
|
93
|
+
# Create fields values
|
94
|
+
def create_fields_values; fields.each {|field| field.create_type_object(self) } end
|
95
|
+
|
91
96
|
# Remove all fields values
|
92
97
|
def remove_fields_values
|
93
|
-
fields.each {|f| f.
|
98
|
+
fields.each {|f| f.remove_type_object self}
|
94
99
|
end
|
95
100
|
|
96
101
|
# Search page by template code_name in same branch of pages and templates.
|
@@ -181,8 +186,5 @@ module ConstructorPages
|
|
181
186
|
|
182
187
|
# Reload all descendants
|
183
188
|
def descendants_update; descendants.map(&:save) end
|
184
|
-
|
185
|
-
# Create fields values
|
186
|
-
def create_fields; fields.each {|field| field.create_type_object(self) } end
|
187
189
|
end
|
188
190
|
end
|
@@ -1,7 +1,14 @@
|
|
1
1
|
# encoding: utf-8
|
2
2
|
|
3
3
|
module ConstructorPages
|
4
|
+
# Template model. Template allows assing different design for pages.
|
5
|
+
#
|
6
|
+
# Templates has many fields.
|
7
|
+
# For example:
|
8
|
+
# template "Product" should has fields like "price", "description", "size" etc.
|
4
9
|
class Template < ActiveRecord::Base
|
10
|
+
|
11
|
+
# Adding code_name_uniqueness method
|
5
12
|
include CodeNameUniq
|
6
13
|
|
7
14
|
attr_accessible :name, :code_name, :child_id, :parent_id, :parent
|
@@ -17,7 +24,7 @@ module ConstructorPages
|
|
17
24
|
|
18
25
|
acts_as_nested_set
|
19
26
|
|
20
|
-
#
|
27
|
+
# Return child corresponding child_id or children first
|
21
28
|
def child
|
22
29
|
if child_id.nil? and !leaf?
|
23
30
|
children.first
|
@@ -28,6 +35,7 @@ module ConstructorPages
|
|
28
35
|
|
29
36
|
private
|
30
37
|
|
38
|
+
# Check if there is code_name in same branch
|
31
39
|
def check_code_name(code_name)
|
32
40
|
[code_name.pluralize, code_name.singularize].each do |name|
|
33
41
|
if root.descendants.map{|t| t.code_name unless t.code_name == code_name}.include?(name)
|
data/constructor-pages.gemspec
CHANGED
@@ -9,19 +9,129 @@ module ConstructorPages
|
|
9
9
|
@template = Template.create name: 'Page', code_name: 'page'
|
10
10
|
|
11
11
|
Field.delete_all
|
12
|
+
Field::TYPES.each do |t|
|
13
|
+
"constructor_pages/types/#{t}_type".classify.constantize.delete_all
|
14
|
+
end
|
12
15
|
end
|
13
16
|
|
14
17
|
describe '.create' do
|
15
18
|
it 'should be valid' do
|
16
19
|
_field = Field.create name: 'Content', code_name: 'content', template: @template, type_value: 'text'
|
17
|
-
_field.
|
20
|
+
_field.should be_valid
|
18
21
|
end
|
19
22
|
|
20
|
-
it 'should
|
21
|
-
|
23
|
+
it 'should create page fields' do
|
24
|
+
_page = Page.create name: 'Page', template: @template
|
25
|
+
_field = Field.create name: 'Content', code_name: 'content', template: @template, type_value: 'text'
|
26
|
+
|
27
|
+
_page.content.should == ''
|
28
|
+
end
|
29
|
+
end
|
30
|
+
|
31
|
+
describe '#destroy' do
|
32
|
+
it 'should destroy page fields' do
|
22
33
|
_field = Field.create name: 'Content', code_name: 'content', template: @template, type_value: 'text'
|
34
|
+
_page = Page.create name: 'Page', template: @template
|
35
|
+
|
36
|
+
_page.content.should == ''
|
37
|
+
_field.destroy
|
38
|
+
_page.content.should be_nil
|
39
|
+
end
|
40
|
+
end
|
41
|
+
|
42
|
+
describe '#type_class' do
|
43
|
+
it 'should return constant of type_value' do
|
44
|
+
field = Field.create name: 'Content', code_name: 'content', template: @template, type_value: 'html'
|
45
|
+
field.type_class.should == Types::HtmlType
|
46
|
+
|
47
|
+
field.type_value = 'text'
|
48
|
+
field.type_class.should == Types::TextType
|
49
|
+
end
|
50
|
+
end
|
51
|
+
|
52
|
+
describe '#find_type_object' do
|
53
|
+
it 'should find one object of type_value by page' do
|
54
|
+
field = Field.create name: 'Content', code_name: 'content', template: @template, type_value: 'text'
|
55
|
+
page = Page.create name: 'Page', template: @template
|
56
|
+
|
57
|
+
text_type = Types::TextType.find_by_field_id_and_page_id field.id, page.id
|
58
|
+
|
59
|
+
field.find_type_object(page).should == text_type
|
60
|
+
end
|
61
|
+
end
|
62
|
+
|
63
|
+
describe '#create_type_object' do
|
64
|
+
it 'should create object of type_value by page' do
|
65
|
+
field = Field.create name: 'Content', code_name: 'content', template: @template, type_value: 'text'
|
66
|
+
page = Page.create name: 'Page', template: @template
|
67
|
+
|
68
|
+
text_type = field.create_type_object(page)
|
69
|
+
text_type.should be_an_instance_of(Types::TextType)
|
70
|
+
text_type.page_id.should == page.id
|
71
|
+
text_type.field_id.should == field.id
|
72
|
+
end
|
73
|
+
end
|
74
|
+
|
75
|
+
describe '#remove_type_object' do
|
76
|
+
it 'should remote object of type_value by page' do
|
77
|
+
field = Field.create name: 'Content', code_name: 'content', template: @template, type_value: 'text'
|
78
|
+
page = Page.create name: 'Page', template: @template
|
79
|
+
|
80
|
+
field.find_type_object(page).should be_an_instance_of(Types::TextType)
|
81
|
+
|
82
|
+
field.remove_type_object(page)
|
83
|
+
field.find_type_object(page).should be_nil
|
84
|
+
end
|
85
|
+
end
|
86
|
+
|
87
|
+
describe '#get_value_for' do
|
88
|
+
it 'should get value of type field by page' do
|
89
|
+
field = Field.create name: 'Content', code_name: 'content', template: @template, type_value: 'text'
|
90
|
+
page = Page.create name: 'Page', template: @template
|
91
|
+
page.content = 'Hello world'
|
92
|
+
|
93
|
+
field.get_value_for(page).should == 'Hello world'
|
94
|
+
end
|
95
|
+
end
|
96
|
+
|
97
|
+
describe '#set_value_for' do
|
98
|
+
it 'should set value for type field by page' do
|
99
|
+
field = Field.create name: 'Content', code_name: 'content', template: @template, type_value: 'text'
|
100
|
+
page = Page.create name: 'Page', template: @template
|
101
|
+
|
102
|
+
field.set_value_for(page, 'Hello')
|
103
|
+
page.content.should == 'Hello'
|
104
|
+
end
|
105
|
+
end
|
106
|
+
|
107
|
+
describe '#code_name' do
|
108
|
+
it 'should be uniqueness in scope fields' do
|
109
|
+
Field.create name: 'Content', code_name: 'content', template: @template, type_value: 'text'
|
110
|
+
_field = Field.create name: 'Content 2', code_name: 'content', template: @template, type_value: 'html'
|
111
|
+
|
112
|
+
_field.should_not be_valid
|
113
|
+
end
|
114
|
+
|
115
|
+
it 'should be uniqueness in scope Page' do
|
116
|
+
Page.create name: 'Page', template: @template
|
117
|
+
_field = Field.create name: 'Content', code_name: 'get_field_value', template: @template, type_value: 'text'
|
118
|
+
_field.should_not be_valid
|
119
|
+
end
|
120
|
+
|
121
|
+
it 'should be uniqueness in scope Template branch' do
|
122
|
+
Page.create name: 'Page', template: @template
|
123
|
+
|
124
|
+
_template = Template.create name: 'Brand', code_name: 'brand', parent: @template
|
125
|
+
@template.reload
|
126
|
+
|
127
|
+
_field = Field.create name: 'Content', code_name: 'brand', template: @template, type_value: 'text'
|
128
|
+
_field.should_not be_valid
|
129
|
+
|
130
|
+
_field.code_name = 'brands'
|
131
|
+
_field.should_not be_valid
|
23
132
|
|
24
|
-
_field.
|
133
|
+
_field.code_name = 'price'
|
134
|
+
_field.should be_valid
|
25
135
|
end
|
26
136
|
end
|
27
137
|
end
|
@@ -83,15 +83,17 @@ module ConstructorPages
|
|
83
83
|
|
84
84
|
describe '#update_fields_values' do
|
85
85
|
it 'should update fields values with params' do
|
86
|
-
|
86
|
+
@template.reload
|
87
|
+
Field.create name: 'Count', code_name: 'amount', template: @template, type_value: 'integer'
|
88
|
+
|
87
89
|
@page.reload
|
88
90
|
|
89
|
-
@page.
|
91
|
+
@page.amount = 10
|
90
92
|
|
91
|
-
@page.update_fields_values({price: 1000,
|
93
|
+
@page.update_fields_values({price: 1000, amount: 20})
|
92
94
|
|
93
95
|
@page.price.should == 1000
|
94
|
-
@page.
|
96
|
+
@page.amount.should == 20
|
95
97
|
end
|
96
98
|
|
97
99
|
it 'should reset boolean fields' do
|
@@ -4,9 +4,26 @@ require 'spec_helper'
|
|
4
4
|
|
5
5
|
module ConstructorPages
|
6
6
|
describe Template do
|
7
|
+
before :each do
|
8
|
+
Template.delete_all
|
9
|
+
end
|
10
|
+
|
7
11
|
it 'should be valid' do
|
8
|
-
|
9
|
-
|
12
|
+
_template = Template.create name: 'Page template', code_name: 'page_template'
|
13
|
+
_template.valid?.should be_true
|
14
|
+
end
|
15
|
+
|
16
|
+
describe '#child' do
|
17
|
+
it 'should return child corresponding child_id or children first' do
|
18
|
+
_brand = Template.create name: 'Brand', code_name: 'brand'
|
19
|
+
_series = Template.create name: 'Series', code_name: 'series', parent: _brand
|
20
|
+
_brand.reload
|
21
|
+
|
22
|
+
_brand.child.should == _series
|
23
|
+
_brand.child_id = 1
|
24
|
+
|
25
|
+
_brand.child.should == _brand
|
26
|
+
end
|
10
27
|
end
|
11
28
|
end
|
12
29
|
end
|
@@ -1,13 +1,12 @@
|
|
1
1
|
# encoding: utf-8
|
2
2
|
|
3
3
|
require 'spec_helper'
|
4
|
-
require 'capybara/rspec'
|
5
4
|
|
6
5
|
module ConstructorPages
|
7
6
|
describe 'Page Controller', type: :feature do
|
8
|
-
it 'should be valid' do
|
9
|
-
Page.create name: 'Hello'
|
10
|
-
visit '/hello'
|
11
|
-
end
|
7
|
+
# it 'should be valid' do
|
8
|
+
# Page.create name: 'Hello'
|
9
|
+
# visit '/hello'
|
10
|
+
# end
|
12
11
|
end
|
13
12
|
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.5.
|
4
|
+
version: 0.5.8
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Ivan Zotov
|
@@ -16,14 +16,14 @@ dependencies:
|
|
16
16
|
requirements:
|
17
17
|
- - '='
|
18
18
|
- !ruby/object:Gem::Version
|
19
|
-
version: 0.5.
|
19
|
+
version: 0.5.8
|
20
20
|
type: :runtime
|
21
21
|
prerelease: false
|
22
22
|
version_requirements: !ruby/object:Gem::Requirement
|
23
23
|
requirements:
|
24
24
|
- - '='
|
25
25
|
- !ruby/object:Gem::Version
|
26
|
-
version: 0.5.
|
26
|
+
version: 0.5.8
|
27
27
|
- !ruby/object:Gem::Dependency
|
28
28
|
name: dragonfly
|
29
29
|
requirement: !ruby/object:Gem::Requirement
|
@@ -197,7 +197,6 @@ files:
|
|
197
197
|
- lib/constructor-pages.rb
|
198
198
|
- lib/constructor_pages/engine.rb
|
199
199
|
- public/hello.txt
|
200
|
-
- spec/features/constructor_pages/pages_controller_spec.rb
|
201
200
|
- spec/models/constructor_pages/field_model_spec.rb
|
202
201
|
- spec/models/constructor_pages/page_model_spec.rb
|
203
202
|
- spec/models/constructor_pages/template_model_spec.rb
|
@@ -226,8 +225,8 @@ signing_key:
|
|
226
225
|
specification_version: 4
|
227
226
|
summary: Pages for Constructor CMS
|
228
227
|
test_files:
|
229
|
-
- spec/features/constructor_pages/pages_controller_spec.rb
|
230
228
|
- spec/models/constructor_pages/field_model_spec.rb
|
231
229
|
- spec/models/constructor_pages/page_model_spec.rb
|
232
230
|
- spec/models/constructor_pages/template_model_spec.rb
|
233
231
|
- spec/requests/constructor_pages/pages_controller_spec.rb
|
232
|
+
has_rdoc:
|