constructor-pages 0.5.6 → 0.5.7

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 ADDED
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA1:
3
+ metadata.gz: 2baa47a4688a68e29dcf737f3b12bb3f1eb7b758
4
+ data.tar.gz: 0e041e904853abf666db195b27a49b97c80ab332
5
+ SHA512:
6
+ metadata.gz: 18a6b01b23863c4b7f98db5613de1afab43cb9b71184bb3f789c8b9f5384da01deb50ad3dd6b07d06c87eb66e9c06856d9788ce5b34818eb336b43f4a54a9744
7
+ data.tar.gz: 550592c690084f29051ff33e4e2b07fe61f47b80dbd4feccb5db53c235805fafdfcebf3ae7e103537a6f608ab9ca4ce2d25e5bb605a715db61306d13829e8bc6
@@ -17,7 +17,7 @@ module ConstructorPages
17
17
  end
18
18
 
19
19
  def show
20
- @page = Page.find_by_request_or_first params[:all]
20
+ @page = Page.find_by_request_or_first('/' + params[:all])
21
21
 
22
22
  error_404 and return if @page.nil? or !@page.active?
23
23
 
@@ -0,0 +1,9 @@
1
+ module ConstructorPages
2
+ module CodeNameUniq
3
+ def code_name_uniqueness
4
+ unless Page.check_code_name(code_name) and check_code_name(code_name)
5
+ errors.add(:base, t(:code_name_already_in_use))
6
+ end
7
+ end
8
+ end
9
+ end
@@ -2,12 +2,14 @@
2
2
 
3
3
  module ConstructorPages
4
4
  class Field < ActiveRecord::Base
5
+ include CodeNameUniq
6
+
5
7
  TYPES = %w{string integer float boolean text date html image}
6
8
 
7
9
  attr_accessible :name, :code_name, :type_value, :template_id, :template
8
10
  validates_presence_of :name
9
11
  validates_uniqueness_of :code_name, :scope => :template_id
10
- validate :method_uniqueness
12
+ validate :code_name_uniqueness
11
13
 
12
14
  after_create :create_page_fields
13
15
  after_destroy :destroy_all_page_fields
@@ -57,15 +59,10 @@ module ConstructorPages
57
59
 
58
60
  private
59
61
 
60
- def method_uniqueness
61
- if Page.first.respond_to?(code_name) \
62
- or Page.first.respond_to?(code_name.pluralize) \
63
- or Page.first.respond_to?(code_name.singularize) \
64
- or template.self_and_ancestors.map{|t| t.code_name unless t.code_name == code_name}.include?(code_name.pluralize) \
65
- or template.self_and_ancestors.map{|t| t.code_name unless t.code_name == code_name}.include?(code_name.singularize) \
66
- or template.descendants.map{|t| t.code_name unless t.code_name == code_name}.include?(code_name.pluralize) \
67
- or template.descendants.map{|t| t.code_name unless t.code_name == code_name}.include?(code_name.singularize)
68
- errors.add(:base, 'Такой метод уже используется')
62
+ def check_code_name(code_name)
63
+ [code_name.pluralize, code_name.singularize].each do |name|
64
+ template.self_and_ancestors.map{|t| t.code_name unless t.code_name == code_name}.include?(name)
65
+ template.descendants.map{|t| t.code_name unless t.code_name == code_name}.include?(name)
69
66
  end
70
67
  end
71
68
 
@@ -28,25 +28,80 @@ module ConstructorPages
28
28
  acts_as_nested_set
29
29
 
30
30
  # Used for find page by request. It return first page if no request given
31
+ # @param request for example <tt>'/conditioners/split-systems/zanussi'</tt>
31
32
  def self.find_by_request_or_first(request = nil)
32
- request.nil? ? Page.first : Page.find_by_full_url('/' + request)
33
+ request.nil? ? Page.first : Page.find_by_full_url(request)
33
34
  end
34
35
 
35
- # Generate full_url from parent page and url
36
+ # Generate full_url from parent id and url
37
+ # @param parent_id integer
38
+ # @param url should looks like <tt>'hello-world-page'</tt> without leading slash
36
39
  def self.full_url_generate(parent_id, url = '')
37
- Page.find(parent_id).self_and_ancestors.map {|c| c.url}.append(url).join('/')
40
+ '/' + Page.find(parent_id).self_and_ancestors.map {|c| c.url}.append(url).join('/')
38
41
  end
39
42
 
43
+ # Check code_name for field and template.
44
+ # When missing method Page find field or page in branch with plural and singular code_name so
45
+ # field and template code_name should be uniqueness for page methods
46
+ def self.check_code_name(code_name)
47
+ [code_name, code_name.pluralize, code_name.singularize].each do |name|
48
+ if Page.first.respond_to?(name)
49
+ return false
50
+ end
51
+ end
52
+
53
+ true
54
+ end
55
+
56
+ # Get field by code_name
40
57
  def field(code_name)
41
58
  Field.find_by_code_name_and_template_id code_name, template_id
42
59
  end
43
60
 
61
+ # Get value of field by code_name
44
62
  def get_field_value(code_name)
45
63
  field = field(code_name)
46
64
  field.get_value_for(self) if field
47
65
  end
48
66
 
49
- def find_page_in_branch_template(code_name)
67
+ # Set value of field by code_name and value
68
+ def set_field_value(code_name, value)
69
+ field = field(code_name)
70
+ field.set_value_for(self, value) if field
71
+ end
72
+
73
+ # Update all fields values with given params.
74
+ # @param params should looks like <tt>{price: 500, content: 'Hello'}</tt>
75
+ # @param reset_booleans reset all boolean fields to false before assign params
76
+ def update_fields_values(params, reset_booleans = true)
77
+ fields.each do |field|
78
+ value = params[field.code_name.to_sym]
79
+
80
+ _type_object = field.find_or_create_type_object(self)
81
+ _type_object.value = 0 if field.type_value == 'boolean' and reset_booleans
82
+
83
+ if value
84
+ _type_object.value = field.type_value == 'date' ? parse_date(value).to_s : value
85
+ end
86
+
87
+ _type_object.save
88
+ end
89
+ end
90
+
91
+ # Remove all fields values
92
+ def remove_fields_values
93
+ fields.each {|f| f.remove_values_for self}
94
+ end
95
+
96
+ # Search page by template code_name in same branch of pages and templates.
97
+ # It allows to call page.category.brand.series.model etc.
98
+ #
99
+ # Return one page if founded in ancestors,
100
+ # and return array of pages if founded in descendants
101
+ #
102
+ # It determines if code_name is singular or nor
103
+ # @param code_name template code name
104
+ def find_page_in_branch(code_name)
50
105
  _template = Template.find_by_code_name code_name.singularize
51
106
 
52
107
  if _template
@@ -57,54 +112,40 @@ module ConstructorPages
57
112
  end
58
113
  end
59
114
 
60
- alias_method :find_pages_in_branch_template, :find_page_in_branch_template
115
+ alias_method :find_pages_in_branch, :find_page_in_branch
61
116
 
62
- def set_field_value(code_name, value)
63
- field = field(code_name)
64
- field.set_value_for(self, value) if field
65
- end
117
+ def published?; active end
66
118
 
67
- def active?; active end
119
+ alias_method :active?, :published?
68
120
 
121
+ # Returns page hash attributes with fields.
122
+ #
123
+ # Default attributes are name and title. Options param allows to add more.
124
+ # @param options default merge name and title page attributes
69
125
  def as_json(options = {})
70
126
  options = {name: self.name, title: self.title}.merge options
71
127
 
72
- template.fields.each do |field|
73
- options = {field.code_name.to_sym => field.get_value_for(self)}.merge options
128
+ fields.each do |field|
129
+ options.merge!({field.code_name.to_sym => field.get_value_for(self)})
74
130
  end
75
131
 
76
132
  options
77
133
  end
78
134
 
79
- # remove all type fields
80
- def remove_fields_values
81
- fields.each {|f| f.remove_values_for self}
82
- end
83
-
84
- # update all type fields
85
- def update_fields_values(params, reset_booleans = true)
86
- fields.each do |field|
87
- value = params[field.code_name.to_sym]
88
-
89
- _type_object = field.find_or_create_type_object(self)
90
- _type_object.value = 0 if field.type_value == 'boolean' and reset_booleans
91
-
92
- if value
93
- _type_object.value = field.type_value == 'date' ? parse_date(value).to_s : value
94
- end
95
-
96
- _type_object.save
97
- end
98
- end
135
+ # Check if link specified
136
+ def redirect?; url != link && !link.empty? end
99
137
 
138
+ # When method missing it get/set field value or get page in branch
139
+ #
140
+ # Examples:
141
+ # page.content = 'Hello world'
142
+ # puts page.price
143
+ # page.brand.models.each do...
100
144
  def method_missing(name, *args, &block)
101
145
  name = name.to_s
102
- name[-1] == '=' ? set_field_value(name[0..-2], args[0]) : get_field_value(name) || find_pages_in_branch_template(name)
146
+ name[-1] == '=' ? set_field_value(name[0..-2], args[0]) : get_field_value(name) || find_pages_in_branch(name)
103
147
  end
104
148
 
105
- # check if link specified
106
- def redirect?; url != link && !link.empty? end
107
-
108
149
  private
109
150
 
110
151
  # if url has been changed by manually or url is empty
@@ -112,34 +153,36 @@ module ConstructorPages
112
153
  self.url = ((auto_url || url.empty?) ? translit(name) : url).parameterize
113
154
  end
114
155
 
156
+ # TODO: move out
115
157
  def parse_date(value)
116
158
  Date.new(value['date(1i)'].to_i, value['date(2i)'].to_i, value['date(3i)'].to_i)
117
159
  end
118
160
 
119
161
  # TODO: add more languages
120
- # translit to english
162
+ # Translit to english
121
163
  def translit(str)
122
164
  Russian.translit(str)
123
165
  end
124
166
 
125
- # page is not valid if there is no template
167
+ # Page is not valid if there is no template
126
168
  def template_check
127
169
  errors.add_on_empty(:template_id) if Template.count == 0
128
170
  end
129
171
 
130
- # if template_id is nil then get first template
172
+ # If template_id is nil then get first template
131
173
  def template_assign
132
174
  self.template_id = Template.first.id unless template_id
133
175
  end
134
176
 
177
+ # Update full_url
135
178
  def full_url_update
136
- self.full_url = '/' + (parent_id ? Page.full_url_generate(parent_id, url) : url)
179
+ self.full_url = (parent_id ? Page.full_url_generate(parent_id, url) : '/' + url)
137
180
  end
138
181
 
182
+ # Reload all descendants
139
183
  def descendants_update; descendants.map(&:save) end
140
184
 
141
- def create_fields
142
- fields.each {|field| field.type_class.create page_id: id, field_id: field.id}
143
- end
185
+ # Create fields values
186
+ def create_fields; fields.each {|field| field.create_type_object(self) } end
144
187
  end
145
188
  end
@@ -2,12 +2,13 @@
2
2
 
3
3
  module ConstructorPages
4
4
  class Template < ActiveRecord::Base
5
+ include CodeNameUniq
6
+
5
7
  attr_accessible :name, :code_name, :child_id, :parent_id, :parent
6
8
 
7
9
  validates_presence_of :name, :code_name
8
10
  validates_uniqueness_of :code_name
9
-
10
- validate :method_uniqueness
11
+ validate :code_name_uniqueness
11
12
 
12
13
  default_scope order(:lft)
13
14
 
@@ -27,15 +28,14 @@ module ConstructorPages
27
28
 
28
29
  private
29
30
 
30
- def method_uniqueness
31
- if Page.first.respond_to?(code_name) \
32
- or Page.first.respond_to?(code_name.pluralize) \
33
- or Page.first.respond_to?(code_name.singularize) \
34
- or root.descendants.map{|t| t.code_name unless t.code_name == code_name}.include?(code_name.pluralize) \
35
- or root.descendants.map{|t| t.code_name unless t.code_name == code_name}.include?(code_name.singularize) \
36
-
37
- errors.add(:base, "Такой метод уже используется")
31
+ def check_code_name(code_name)
32
+ [code_name.pluralize, code_name.singularize].each do |name|
33
+ if root.descendants.map{|t| t.code_name unless t.code_name == code_name}.include?(name)
34
+ return false
35
+ end
38
36
  end
37
+
38
+ true
39
39
  end
40
40
  end
41
41
  end
@@ -11,6 +11,7 @@ en:
11
11
 
12
12
  new_field: 'New field'
13
13
 
14
+ code_name_already_in_use: 'This code name is already in use.'
14
15
  field_success_added: 'Field «%{name}» added successfully.'
15
16
  field_success_updated: 'Field «%{name}» updated successfully.'
16
17
  field_success_removed: 'Field «%{name}» removed successfully.'
@@ -18,7 +18,7 @@ ru:
18
18
  delete_template: 'Удалить шаблон'
19
19
 
20
20
  new_field: 'Добавить поле'
21
-
21
+ code_name_already_in_use: 'Такое имя уже используется.'
22
22
  field_success_added: 'Поле «%{name}» успешно добавлено.'
23
23
  field_success_updated: 'Поле «%{name}» успешно обновлено.'
24
24
  field_success_removed: 'Поле «%{name}» успешно удалено.'
@@ -3,4 +3,26 @@
3
3
  require 'spec_helper'
4
4
 
5
5
  module ConstructorPages
6
+ describe Field do
7
+ before :each do
8
+ Template.delete_all
9
+ @template = Template.create name: 'Page', code_name: 'page'
10
+
11
+ Field.delete_all
12
+ end
13
+
14
+ describe '.create' do
15
+ it 'should be valid' do
16
+ _field = Field.create name: 'Content', code_name: 'content', template: @template, type_value: 'text'
17
+ _field.valid?.should be_true
18
+ end
19
+
20
+ it 'should validate uniqueness' do
21
+ Field.create name: 'Content', code_name: 'content', template: @template, type_value: 'text'
22
+ _field = Field.create name: 'Content', code_name: 'content', template: @template, type_value: 'text'
23
+
24
+ _field.valid?.should_not be_true
25
+ end
26
+ end
27
+ end
6
28
  end
@@ -6,277 +6,305 @@ module ConstructorPages
6
6
  describe Page do
7
7
  before :each do
8
8
  Template.delete_all
9
- Template.create name: 'Page', code_name: 'page'
9
+ @template = Template.create name: 'Page', code_name: 'page'
10
10
 
11
11
  Page.delete_all
12
12
  Field.delete_all
13
13
  Types::TextType.delete_all
14
14
  end
15
15
 
16
- it 'should be valid' do
17
- Page.create.valid?.should be_true
18
- end
16
+ context 'CLASS METHODS' do
17
+ describe '.create' do
18
+ it 'should be valid' do
19
+ Page.create.valid?.should be_true
20
+ end
19
21
 
20
- describe '.find_by_request_or_first' do
21
- before :each do
22
- @page = Page.create name: 'New page', url: 'new-page'
23
- end
22
+ it 'should create type_fields after' do
23
+ field = Field.create name: 'Content', code_name: 'content', template: @template, type_value: 'text'
24
+ page = Page.create name: 'New page', template: @template
24
25
 
25
- it 'should return page by given request path' do
26
- Page.find_by_request_or_first('new-page').should == @page
26
+ field.get_value_for(page).should == ''
27
+ end
27
28
  end
28
29
 
29
- it 'should return first page if no given request' do
30
- Page.find_by_request_or_first.should == @page
30
+ describe '.find_by_request_or_first' do
31
+ before :each do
32
+ @page = Page.create name: 'New page', url: 'new-page'
33
+ end
34
+
35
+ it 'should return page by given request path' do
36
+ Page.find_by_request_or_first('/new-page').should == @page
37
+ end
38
+
39
+ it 'should return first page if no given request' do
40
+ Page.find_by_request_or_first.should == @page
41
+ end
31
42
  end
32
- end
33
43
 
34
- describe '.full_url_generate' do
35
- it 'should generate full_url from parent_id and url' do
44
+ describe '.full_url_generate' do
45
+ it 'should generate full_url from parent_id and url' do
46
+ first_page = Page.create name: 'First page', url: 'first-page'
47
+ second_page = Page.create name: 'Second page', url: 'second-page', parent: first_page
48
+ Page.full_url_generate(second_page.id, 'third-page').should == '/first-page/second-page/third-page'
49
+ end
36
50
  end
37
51
  end
38
52
 
39
- describe '#set_field' do
40
- it 'should set value for type_field' do
41
- template = Template.create name: 'Page template', code_name: 'page_template'
42
- page = Page.create name: 'Home page', template: template
43
- field = Field.create name: 'Content', code_name: 'desc', template: template, type_value: 'text'
53
+ context 'INSTANCE METHODS' do
54
+ context 'Getting and setting field value' do
55
+ before :each do
56
+ @template = Template.create name: 'Page template', code_name: 'page_template'
57
+ @page = Page.create name: 'Home page', template: @template
58
+ @field = Field.create name: 'Desc', code_name: 'desc', template: @template, type_value: 'text'
59
+ end
44
60
 
45
- page.set_field_value('desc', 'my world')
61
+ describe '#get_field' do
62
+ it 'should get value from type_field' do
63
+ @field.set_value_for(@page, 'Hello world')
64
+ @page.get_field_value('desc').should == 'Hello world'
65
+ end
66
+ end
46
67
 
47
- field.get_value_for(page).should == 'my world'
68
+ describe '#set_field' do
69
+ it 'should set value for type_field' do
70
+ @page.set_field_value('desc', 'my world')
71
+ @field.get_value_for(@page).should == 'my world'
72
+ end
73
+ end
48
74
  end
49
- end
50
75
 
51
- describe '#get_field' do
52
- it 'should get value from type_field' do
53
- template = Template.create name: 'Page template', code_name: 'page_template'
54
- page = Page.create name: 'Home page', template: template
55
- Field.create name: 'Content', code_name: 'desc', template: template, type_value: 'text'
76
+ context 'Updating and removing fields values' do
77
+ before :each do
78
+ @template = Template.create name: 'New template', code_name: 'brand'
79
+ @field = Field.create name: 'Price', code_name: 'price', template: @template, type_value: 'float'
80
+ @page = Page.create name: 'New page', template: @template
81
+ @page.price = 500
82
+ end
56
83
 
57
- page.set_field_value('desc', 'Hello world')
58
- page.get_field_value('desc').should == 'Hello world'
59
- end
60
- end
84
+ describe '#update_fields_values' do
85
+ it 'should update fields values with params' do
86
+ Field.create name: 'Count', code_name: 'count', template: @template, type_value: 'integer'
87
+ @page.reload
61
88
 
62
- describe '#find_page_in_branch_template' do
63
- it 'should find page in one branch template by code_name' do
64
- brand_template = Template.create name: 'Brand', code_name: 'brand'
65
- series_template = Template.create name: 'Series', code_name: 'series', parent: brand_template
89
+ @page.count = 10
66
90
 
67
- brand_page = Page.create name: 'Zanussi', template: brand_template
68
- series_page = Page.create name: 'Fresco', template: series_template, parent: brand_page
91
+ @page.update_fields_values({price: 1000, count: 20})
69
92
 
70
- series_page.find_page_in_branch_template('brand').should == brand_page
71
- end
72
- end
93
+ @page.price.should == 1000
94
+ @page.count.should == 20
95
+ end
73
96
 
74
- describe '#as_json' do
75
- it 'should return page as json format with fields' do
76
- template = Template.create name: 'JSON', code_name: 'json_template'
77
- page = Page.create name: 'Hi json', template: template
78
- Field.create name: 'Content', code_name: 'content', template: template, type_value: 'text'
79
- page.content = 'Hello world'
80
- page.as_json.should == {content: 'Hello world', name: page.name, title: page.title}
81
- end
82
- end
97
+ it 'should reset boolean fields' do
98
+ Field.create name: 'Check', code_name: 'check', template: @template, type_value: 'boolean'
83
99
 
84
- describe '#redirect?' do
85
- it 'should check if link specified or not' do
86
- page = Page.create name: 'Test redirection'
87
- page.redirect?.should be_false
100
+ @page.check = true
88
101
 
89
- page.link = ''
90
- page.save
102
+ @page.update_fields_values({price: 1000})
91
103
 
92
- page.redirect?.should be_false
104
+ @page.price.should == 1000
105
+ @page.check.should be_false
106
+ end
107
+ end
93
108
 
94
- page.link = '/hello-redirect'
95
- page.save
109
+ describe '#remove_fields_values' do
110
+ it 'should destroy all type_values fields' do
111
+ @field.find_type_object(@page).value.should == 500
96
112
 
97
- page.redirect?.should be_true
113
+ @page.remove_fields_values
114
+ @field.find_type_object(@page).should be_nil
115
+ end
116
+ end
98
117
  end
99
- end
100
118
 
101
- describe '#auto_url' do
102
- it 'should be true by default' do
103
- page = Page.create
104
- page.auto_url.should be_true
105
- end
106
- end
119
+ describe '#find_page_in_branch' do
120
+ it 'should find page(s) in same branch pages and templates by template_code_name' do
121
+ brand_template = Template.create name: 'Brand', code_name: 'brand'
122
+ series_template = Template.create name: 'Series', code_name: 'series', parent: brand_template
107
123
 
108
- describe '#template' do
109
- context 'if there is no template' do
110
- it 'should not be valid' do
111
- Template.delete_all
112
- page = Page.create
113
- page.valid?.should_not be_true
114
- Template.create name: 'Page', code_name: 'page'
115
- end
116
- end
124
+ brand_page = Page.create name: 'Zanussi', template: brand_template
125
+ series_page = Page.create name: 'Fresco', template: series_template, parent: brand_page
126
+ brand_page.reload
117
127
 
118
- context 'if template_id is nil' do
119
- it 'should be first template' do
120
- page = Page.create
121
- page.template.should == Template.first
128
+ series_page.find_page_in_branch('brand').should == brand_page
129
+ brand_page.find_pages_in_branch('series').should == [series_page]
122
130
  end
123
131
  end
124
- end
125
132
 
126
- describe '#url' do
127
- context 'if url is empty or if auto_url is true' do
128
- it 'should be generated from name' do
129
- page = Page.create name: 'Hello world'
130
- page.url.should == 'hello-world'
131
- end
132
- end
133
+ describe '#as_json' do
134
+ context 'should return page hash attributes with fields' do
135
+ before :each do
136
+ @template = Template.create name: 'Json', code_name: 'json_template'
137
+ @page = Page.create name: 'Test json', template: @template
138
+ end
133
139
 
134
- context 'else' do
135
- it 'should get url field value' do
136
- page = Page.create name: 'Hello', auto_url: true
137
- page.url.should == 'hello'
140
+ it 'should return defaults name and title attrs' do
141
+ @page.as_json.should == {name: @page.name, title: @page.title}
142
+ end
138
143
 
139
- page.auto_url = false
140
- page.url = 'world'
141
- page.save
142
- page.url.should == 'world'
144
+ it 'should add fields to hash' do
145
+ Field.create name: 'Content', code_name: 'content', template: @template, type_value: 'text'
146
+ @page.content = 'Hello world'
147
+ @page.reload
143
148
 
144
- page.auto_url = true
145
- page.name = 'Another world'
146
- page.url = 'world-two'
147
- page.save
148
- page.url.should == 'another-world'
149
+ @page.as_json.should == {name: @page.name, title: @page.title, content: 'Hello world'}
150
+ end
149
151
  end
150
152
  end
151
- end
152
153
 
153
- describe '#update_fields_values' do
154
- it 'should update fields values with params' do
155
- template = Template.create name: 'New template', code_name: 'brand'
156
- Field.create name: 'Price', code_name: 'price', template: template, type_value: 'float'
157
- Field.create name: 'Check', code_name: 'check', template: template, type_value: 'boolean'
154
+ describe '#redirect?' do
155
+ it 'should check if link specified or not' do
156
+ page = Page.create name: 'Test redirection'
157
+ page.redirect?.should be_false
158
158
 
159
- page = Page.create name: 'New page', template: template
159
+ page.link = ''
160
+ page.save
160
161
 
161
- page.check = true
162
- page.check.should be_true
162
+ page.redirect?.should be_false
163
163
 
164
- page.update_fields_values({price: 1000})
164
+ page.link = '/hello-redirect'
165
+ page.save
165
166
 
166
- page.price.should == 1000
167
- page.check.should be_false
167
+ page.redirect?.should be_true
168
+ end
168
169
  end
169
170
  end
170
171
 
171
- describe '#remove_fields_values' do
172
- it 'should destroy all type_values fields' do
173
- template = Template.create name: 'New template', code_name: 'template'
174
- field = Field.create name: 'Price', code_name: 'price', template: template, type_value: 'float'
175
- page = Page.create name: 'New page', template: template
176
-
177
- page.price = 500
178
- field.find_type_object(page).value.should == 500
179
-
180
- page.remove_fields_values
181
- field.find_type_object(page).should be_nil
172
+ context 'ATTRIBUTES' do
173
+ describe '#auto_url' do
174
+ it 'should be true by default' do
175
+ page = Page.create
176
+ page.auto_url.should be_true
177
+ end
182
178
  end
183
- end
184
179
 
185
- describe '#full_url' do
186
- it 'should be generated from url and ancestors' do
187
- page = Page.create name: 'Hello'
188
- page.full_url.should == '/hello'
180
+ describe '#template' do
181
+ context 'if there is no template' do
182
+ it 'should not be valid' do
183
+ Template.delete_all
189
184
 
190
- page_two = Page.create name: 'World', parent: page
191
- page_two.full_url.should == '/hello/world'
192
- end
193
-
194
- context 'if parent or url has been changed' do
195
- it 'should update full_url' do
196
- page = Page.create name: 'Change url', url: 'change-url', auto_url: false
197
- page.full_url.should == '/change-url'
185
+ page = Page.create
186
+ page.valid?.should_not be_true
187
+ end
188
+ end
198
189
 
199
- page.url = 'another-change-url'
200
- page.save
201
- page.full_url.should == '/another-change-url'
190
+ context 'if template_id is nil' do
191
+ it 'should be first template' do
192
+ page = Page.create
193
+ page.template.should == Template.first
194
+ end
202
195
  end
203
196
  end
204
197
 
205
- context 'if parent is root or nil' do
206
- it 'should be as /self.url' do
207
- page = Page.create name: 'Page', url: 'page', auto_url: false, parent_id: nil
208
- page.full_url.should == '/page'
198
+ describe '#url' do
199
+ context 'if url is empty or if auto_url is true' do
200
+ it 'should be generated from name' do
201
+ page = Page.create name: 'Hello world'
202
+ page.url.should == 'hello-world'
203
+ end
209
204
 
210
- parent = Page.create name: 'Parent'
211
- page.parent = parent
212
- page.save
205
+ it 'should translit utf-8' do
206
+ page = Page.create name: 'Проверка'
207
+ page.full_url.should == '/proverka'
213
208
 
214
- page.full_url.should == '/parent/page'
209
+ page_two = Page.create name: 'Тест', parent: page
210
+ page_two.full_url.should == '/proverka/test'
211
+ end
212
+ end
215
213
 
216
- page.parent = nil
217
- page.save
218
- page.full_url.should == '/page'
214
+ context 'else' do
215
+ it 'should get url field value' do
216
+ page = Page.create name: 'Hello', auto_url: true
217
+ page.url.should == 'hello'
218
+
219
+ page.auto_url = false
220
+ page.url = 'world'
221
+ page.save
222
+ page.url.should == 'world'
223
+
224
+ page.auto_url = true
225
+ page.name = 'Another world'
226
+ page.url = 'world-two'
227
+ page.save
228
+ page.url.should == 'another-world'
229
+ end
219
230
  end
220
231
  end
221
- end
222
232
 
223
- describe 'translit' do
224
- it 'should translit utf-8' do
225
- page = Page.create name: 'Проверка'
226
- page.full_url.should == '/proverka'
233
+ describe '#full_url' do
234
+ it 'should be generated from url and ancestors' do
235
+ page = Page.create name: 'Hello'
236
+ page.full_url.should == '/hello'
227
237
 
228
- page_two = Page.create name: 'Тест', parent: page
229
- page_two.full_url.should == '/proverka/test'
230
- end
231
- end
238
+ page_two = Page.create name: 'World', parent: page
239
+ page_two.full_url.should == '/hello/world'
240
+ end
232
241
 
233
- describe 'descendants_update' do
234
- it 'should update descendants full_url' do
235
- page = Page.create name: 'Update descendants', url: 'update-descendants', auto_url: false
236
- page_two = Page.create name: 'Child', url: 'child', parent: page
237
- page_two.full_url.should == '/update-descendants/child'
242
+ context 'if parent or url has been changed' do
243
+ it 'should update full_url' do
244
+ page = Page.create name: 'Change url', url: 'change-url', auto_url: false
245
+ child_page = Page.create name: 'Child page', url: 'child', auto_url: false, parent: page
246
+ page.reload
238
247
 
239
- page = Page.find(page.id)
240
- page.url = 'another-update-descendants'
241
- page.save
248
+ page.full_url.should == '/change-url'
249
+ child_page.full_url.should == '/change-url/child'
242
250
 
243
- page_two = Page.find(page_two.id)
244
- page_two.full_url.should == '/another-update-descendants/child'
245
- end
246
- end
251
+ page.url = 'another-change-url'
252
+ page.save
253
+ page.full_url.should == '/another-change-url'
247
254
 
248
- describe 'create_fields' do
249
- it 'should create type_fields after update page'
250
- end
255
+ child_page.reload
256
+ child_page.full_url.should == '/another-change-url/child'
257
+ end
258
+ end
251
259
 
252
- describe 'method_missing' do
253
- it 'should return value of type_value for missing method' do
254
- template = Template.create name: 'Page', code_name: 'page_template'
255
- page = Page.create name: 'No method', template: template
256
- field = Field.create name: 'Content', code_name: 'desc', template: template, type_value: 'text'
257
- field.set_value_for(page, 'my world')
260
+ context 'if parent is root or nil' do
261
+ it 'should be as /self.url' do
262
+ page = Page.create name: 'Page', url: 'page', auto_url: false, parent_id: nil
263
+ page.full_url.should == '/page'
258
264
 
259
- page.desc.should == 'my world'
260
- end
265
+ parent = Page.create name: 'Parent'
266
+ page.parent = parent
267
+ page.save
261
268
 
262
- it 'should set value for type_value for missing method' do
263
- template = Template.create name: 'Page', code_name: 'page_templ'
264
- page = Page.create name: 'No method', template: template
265
- field = Field.create name: 'Content', code_name: 'desc', template: template, type_value: 'text'
269
+ page.full_url.should == '/parent/page'
266
270
 
267
- page.desc = 'my world 2'
268
- field.get_value_for(page).should == 'my world 2'
271
+ page.parent = nil
272
+ page.save
273
+ page.full_url.should == '/page'
274
+ end
275
+ end
269
276
  end
270
277
 
271
- it 'should find page in branch template if no field found' do
272
- Template.delete_all
273
- brand_template = Template.create name: 'Brand', code_name: 'brand'
274
- series_template = Template.create name: 'Series', code_name: 'series', parent: brand_template
278
+ describe 'method_missing' do
279
+ context 'Getting and setting field value' do
280
+ before :each do
281
+ @template = Template.create name: 'Page', code_name: 'page_template'
282
+ @page = Page.create name: 'No method', template: @template
283
+ @field = Field.create name: 'Content', code_name: 'desc', template: @template, type_value: 'text'
284
+ end
285
+
286
+ it 'should return value of type_value for missing method' do
287
+ @field.set_value_for(@page, 'my world')
288
+ @page.desc.should == 'my world'
289
+ end
290
+
291
+ it 'should set value for type_value for missing method' do
292
+ @page.desc = 'my world 2'
293
+ @field.get_value_for(@page).should == 'my world 2'
294
+ end
295
+ end
296
+
297
+ it 'should find page in branch template if no field found' do
298
+ brand_template = Template.create name: 'Brand', code_name: 'brand'
299
+ series_template = Template.create name: 'Series', code_name: 'series', parent: brand_template
275
300
 
276
- brand_page = Page.create name: 'Zanussi', template: brand_template
277
- series_page = Page.create name: 'Fresco', template: series_template, parent: brand_page
301
+ brand_page = Page.create name: 'Zanussi', template: brand_template
302
+ series_page = Page.create name: 'Fresco', template: series_template, parent: brand_page
303
+ brand_page.reload
278
304
 
279
- series_page.brand.should == brand_page
305
+ series_page.brand.should == brand_page
306
+ brand_page.series.should == [series_page]
307
+ end
280
308
  end
281
309
  end
282
310
  end
@@ -8,15 +8,5 @@ module ConstructorPages
8
8
  template = Template.create name: 'Page template', code_name: 'page_template'
9
9
  template.valid?.should be_true
10
10
  end
11
-
12
- describe '#name' do
13
- it 'should convert russian suffix'
14
- end
15
-
16
- describe '#code_name' do
17
- context 'validation' do
18
- it 'should be uniqueness'
19
- end
20
- end
21
11
  end
22
12
  end
@@ -0,0 +1,13 @@
1
+ # encoding: utf-8
2
+
3
+ require 'spec_helper'
4
+ require 'capybara/rspec'
5
+
6
+ module ConstructorPages
7
+ describe 'Page Controller', type: :feature do
8
+ it 'should be valid' do
9
+ Page.create name: 'Hello'
10
+ visit '/hello'
11
+ end
12
+ end
13
+ end
metadata CHANGED
@@ -1,8 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: constructor-pages
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.5.6
5
- prerelease:
4
+ version: 0.5.7
6
5
  platform: ruby
7
6
  authors:
8
7
  - Ivan Zotov
@@ -14,55 +13,48 @@ dependencies:
14
13
  - !ruby/object:Gem::Dependency
15
14
  name: constructor-core
16
15
  requirement: !ruby/object:Gem::Requirement
17
- none: false
18
16
  requirements:
19
17
  - - '='
20
18
  - !ruby/object:Gem::Version
21
- version: 0.5.6
19
+ version: 0.5.7
22
20
  type: :runtime
23
21
  prerelease: false
24
22
  version_requirements: !ruby/object:Gem::Requirement
25
- none: false
26
23
  requirements:
27
24
  - - '='
28
25
  - !ruby/object:Gem::Version
29
- version: 0.5.6
26
+ version: 0.5.7
30
27
  - !ruby/object:Gem::Dependency
31
28
  name: dragonfly
32
29
  requirement: !ruby/object:Gem::Requirement
33
- none: false
34
30
  requirements:
35
- - - ! '>='
31
+ - - '>='
36
32
  - !ruby/object:Gem::Version
37
33
  version: '0'
38
34
  type: :runtime
39
35
  prerelease: false
40
36
  version_requirements: !ruby/object:Gem::Requirement
41
- none: false
42
37
  requirements:
43
- - - ! '>='
38
+ - - '>='
44
39
  - !ruby/object:Gem::Version
45
40
  version: '0'
46
41
  - !ruby/object:Gem::Dependency
47
42
  name: rack-cache
48
43
  requirement: !ruby/object:Gem::Requirement
49
- none: false
50
44
  requirements:
51
- - - ! '>='
45
+ - - '>='
52
46
  - !ruby/object:Gem::Version
53
47
  version: '0'
54
48
  type: :runtime
55
49
  prerelease: false
56
50
  version_requirements: !ruby/object:Gem::Requirement
57
- none: false
58
51
  requirements:
59
- - - ! '>='
52
+ - - '>='
60
53
  - !ruby/object:Gem::Version
61
54
  version: '0'
62
55
  - !ruby/object:Gem::Dependency
63
56
  name: awesome_nested_set
64
57
  requirement: !ruby/object:Gem::Requirement
65
- none: false
66
58
  requirements:
67
59
  - - ~>
68
60
  - !ruby/object:Gem::Version
@@ -70,7 +62,6 @@ dependencies:
70
62
  type: :runtime
71
63
  prerelease: false
72
64
  version_requirements: !ruby/object:Gem::Requirement
73
- none: false
74
65
  requirements:
75
66
  - - ~>
76
67
  - !ruby/object:Gem::Version
@@ -78,65 +69,57 @@ dependencies:
78
69
  - !ruby/object:Gem::Dependency
79
70
  name: haml-rails
80
71
  requirement: !ruby/object:Gem::Requirement
81
- none: false
82
72
  requirements:
83
- - - ! '>='
73
+ - - '>='
84
74
  - !ruby/object:Gem::Version
85
75
  version: '0'
86
76
  type: :runtime
87
77
  prerelease: false
88
78
  version_requirements: !ruby/object:Gem::Requirement
89
- none: false
90
79
  requirements:
91
- - - ! '>='
80
+ - - '>='
92
81
  - !ruby/object:Gem::Version
93
82
  version: '0'
94
83
  - !ruby/object:Gem::Dependency
95
84
  name: acts_as_list
96
85
  requirement: !ruby/object:Gem::Requirement
97
- none: false
98
86
  requirements:
99
- - - ! '>='
87
+ - - '>='
100
88
  - !ruby/object:Gem::Version
101
89
  version: '0'
102
90
  type: :runtime
103
91
  prerelease: false
104
92
  version_requirements: !ruby/object:Gem::Requirement
105
- none: false
106
93
  requirements:
107
- - - ! '>='
94
+ - - '>='
108
95
  - !ruby/object:Gem::Version
109
96
  version: '0'
110
97
  - !ruby/object:Gem::Dependency
111
98
  name: rspec-rails
112
99
  requirement: !ruby/object:Gem::Requirement
113
- none: false
114
100
  requirements:
115
- - - ! '>='
101
+ - - '>='
116
102
  - !ruby/object:Gem::Version
117
103
  version: '0'
118
104
  type: :development
119
105
  prerelease: false
120
106
  version_requirements: !ruby/object:Gem::Requirement
121
- none: false
122
107
  requirements:
123
- - - ! '>='
108
+ - - '>='
124
109
  - !ruby/object:Gem::Version
125
110
  version: '0'
126
111
  - !ruby/object:Gem::Dependency
127
112
  name: capybara
128
113
  requirement: !ruby/object:Gem::Requirement
129
- none: false
130
114
  requirements:
131
- - - ! '>='
115
+ - - '>='
132
116
  - !ruby/object:Gem::Version
133
117
  version: '0'
134
118
  type: :development
135
119
  prerelease: false
136
120
  version_requirements: !ruby/object:Gem::Requirement
137
- none: false
138
121
  requirements:
139
- - - ! '>='
122
+ - - '>='
140
123
  - !ruby/object:Gem::Version
141
124
  version: '0'
142
125
  description: Pages for Constructor CMS
@@ -155,6 +138,7 @@ files:
155
138
  - app/controllers/constructor_pages/fields_controller.rb
156
139
  - app/controllers/constructor_pages/pages_controller.rb
157
140
  - app/controllers/constructor_pages/templates_controller.rb
141
+ - app/helpers/constructor_pages/code_name_uniq.rb
158
142
  - app/helpers/constructor_pages/fields_helper.rb
159
143
  - app/helpers/constructor_pages/move_helper.rb
160
144
  - app/helpers/constructor_pages/pages_helper.rb
@@ -217,33 +201,33 @@ files:
217
201
  - spec/models/constructor_pages/field_model_spec.rb
218
202
  - spec/models/constructor_pages/page_model_spec.rb
219
203
  - spec/models/constructor_pages/template_model_spec.rb
204
+ - spec/requests/constructor_pages/pages_controller_spec.rb
220
205
  homepage: http://ivanzotov.github.com/constructor
221
206
  licenses: []
207
+ metadata: {}
222
208
  post_install_message:
223
209
  rdoc_options: []
224
210
  require_paths:
225
211
  - lib
226
212
  required_ruby_version: !ruby/object:Gem::Requirement
227
- none: false
228
213
  requirements:
229
- - - ! '>='
214
+ - - '>='
230
215
  - !ruby/object:Gem::Version
231
216
  version: '0'
232
217
  required_rubygems_version: !ruby/object:Gem::Requirement
233
- none: false
234
218
  requirements:
235
- - - ! '>='
219
+ - - '>='
236
220
  - !ruby/object:Gem::Version
237
221
  version: '0'
238
222
  requirements: []
239
223
  rubyforge_project:
240
- rubygems_version: 1.8.25
224
+ rubygems_version: 2.0.3
241
225
  signing_key:
242
- specification_version: 3
226
+ specification_version: 4
243
227
  summary: Pages for Constructor CMS
244
228
  test_files:
245
229
  - spec/features/constructor_pages/pages_controller_spec.rb
246
230
  - spec/models/constructor_pages/field_model_spec.rb
247
231
  - spec/models/constructor_pages/page_model_spec.rb
248
232
  - spec/models/constructor_pages/template_model_spec.rb
249
- has_rdoc:
233
+ - spec/requests/constructor_pages/pages_controller_spec.rb