survey_on_rails 0.4.3 → 1.0.0

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.
Files changed (42) hide show
  1. data/gen/models/model.rb +6 -2
  2. data/gen/models/styles.rb +1 -1
  3. data/gen/models/view.rb +4 -0
  4. data/lib/generators/survey/USAGE +4 -4
  5. data/lib/generators/survey/metamodels/app.rb +38 -27
  6. data/lib/generators/survey/metamodels/base.rb +31 -29
  7. data/lib/generators/survey/metamodels/main.rb +1 -0
  8. data/lib/generators/survey/metamodels/model.rb +22 -54
  9. data/lib/generators/survey/metamodels/static.rb +44 -0
  10. data/lib/generators/survey/metamodels/style.rb +64 -83
  11. data/lib/generators/survey/metamodels/types.rb +2 -0
  12. data/lib/generators/survey/metamodels/validation.rb +15 -2
  13. data/lib/generators/survey/metamodels/view.rb +124 -172
  14. data/lib/generators/survey/showcase/assets/static_pages/about.html.erb +10 -0
  15. data/lib/generators/survey/showcase/assets/static_pages/contact.html.erb +7 -0
  16. data/lib/generators/survey/showcase/assets/static_pages/help.html.erb +8 -0
  17. data/lib/generators/survey/showcase/assets/static_pages/home.html.erb +11 -0
  18. data/lib/generators/survey/showcase/models/app.rb +10 -0
  19. data/lib/generators/survey/showcase/models/model.rb +13 -0
  20. data/lib/generators/survey/showcase/models/static.rb +22 -0
  21. data/lib/generators/survey/showcase/models/styles.rb +3 -0
  22. data/lib/generators/survey/showcase/models/view.rb +13 -0
  23. data/lib/generators/survey/survey_generator.rb +11 -0
  24. data/lib/generators/survey/templates/app/assets/stylesheets/stylesheet.tpl +7 -7
  25. data/lib/generators/survey/templates/app/controllers/survey_controller.tpl +1 -1
  26. data/lib/generators/survey/templates/app/models/validator.tpl +2 -2
  27. data/lib/generators/survey/templates/app/views/{form → forms}/checkbox_group.tpl +12 -12
  28. data/lib/generators/survey/templates/app/views/{form → forms}/choice_question.tpl +0 -0
  29. data/lib/generators/survey/templates/app/views/{form → forms}/dropdown.tpl +0 -0
  30. data/lib/generators/survey/templates/app/views/{form → forms}/element.tpl +0 -0
  31. data/lib/generators/survey/templates/app/views/{form → forms}/form.tpl +0 -0
  32. data/lib/generators/survey/templates/app/views/{form → forms}/group.tpl +0 -0
  33. data/lib/generators/survey/templates/app/views/{form → forms}/horizontal_radio_button_group.tpl +0 -0
  34. data/lib/generators/survey/templates/app/views/{form → forms}/image.tpl +0 -0
  35. data/lib/generators/survey/templates/app/views/{form → forms}/pagination.tpl +4 -5
  36. data/lib/generators/survey/templates/app/views/{form → forms}/radio_button_group.tpl +0 -0
  37. data/lib/generators/survey/templates/app/views/{form → forms}/table.tpl +0 -0
  38. data/lib/generators/survey/templates/app/views/{form → forms}/textfield.tpl +0 -0
  39. data/lib/generators/survey/templates/app/views/layouts/header.tpl +31 -31
  40. data/lib/generators/survey/templates/app/views/views.tpl +1 -1
  41. metadata +29 -17
  42. checksums.yaml +0 -15
@@ -1,4 +1,6 @@
1
1
  module SurveyMetamodel extend RGen::MetamodelBuilder::ModuleExtension
2
+ LIKERT_SCALE = ["Strongly disagree", "Disagree", "Neutral", "Agree", "Strongly Agree"]
3
+
2
4
  Color = RGen::MetamodelBuilder::DataTypes::Enum.new(:name => "Color", :literals => [:blue, :red, :yellow, :gray, :green, :white, :black, :lightGray, :darkGray])
3
5
  FontStyle = RGen::MetamodelBuilder::DataTypes::Enum.new(:name => "FontStyle", :literals => [:normal, :italic, :oblique])
4
6
  FontWeight = RGen::MetamodelBuilder::DataTypes::Enum.new(:name => "FontWeight", :literals => [:normal, :bold])
@@ -1,4 +1,9 @@
1
1
  module SurveyMetamodel extend RGen::MetamodelBuilder::ModuleExtension
2
+ class Dependency < Base
3
+ has_attr 'requires', String
4
+ has_attr 'value', String
5
+ end
6
+
2
7
  class ValidationRule < Base
3
8
  abstract
4
9
  end
@@ -7,10 +12,10 @@ module SurveyMetamodel extend RGen::MetamodelBuilder::ModuleExtension
7
12
  has_attr 'regex', String
8
13
  end
9
14
 
10
- class NumberRule < ValidationRule
15
+ class IntegerRule < ValidationRule
11
16
  end
12
17
 
13
- class FloatNumberRule < ValidationRule
18
+ class FloatRule < ValidationRule
14
19
  end
15
20
 
16
21
  class PresenceRule < ValidationRule
@@ -25,4 +30,12 @@ module SurveyMetamodel extend RGen::MetamodelBuilder::ModuleExtension
25
30
  has_attr 'min', Float
26
31
  has_attr 'max', Float
27
32
  end
33
+ end
34
+
35
+ module SurveyMetamodel
36
+ module Dependency::ClassModule
37
+ def condition
38
+ return "(!params[:#{requires}].blank? and params[:#{requires}][:content] == '#{value}')"
39
+ end
40
+ end
28
41
  end
@@ -1,22 +1,25 @@
1
1
  module SurveyMetamodel extend RGen::MetamodelBuilder::ModuleExtension
2
2
  class ViewElement < StyleElement
3
3
  abstract
4
- contains_one 'model_element', ModelElement, 'element', :unsettable => true
4
+ has_attr 'model_element', Object, :unsettable => true
5
5
  end
6
6
 
7
- class Form < ViewElement
8
- has_attr 'author', String
9
- contains_many 'elements', ViewElement, 'form'
10
-
11
- has_attr 'page_elements', Object
7
+ class ContentElement < ViewElement
8
+ abstract
12
9
  end
13
10
 
14
- class Input < ViewElement
11
+ class Input < ContentElement
15
12
  abstract
16
13
  has_attr 'info', String
17
14
  contains_one 'for', Input, 'element'
18
15
  end
19
16
 
17
+ class Form < ViewElement
18
+ has_attr 'author', String
19
+ has_attr 'page_elements', Object, :unsettable => true
20
+ contains_many 'elements', ContentElement, 'form'
21
+ end
22
+
20
23
  class Textfield < Input
21
24
  has_attr 'type', TextFieldType
22
25
  has_attr 'prefix', String
@@ -37,7 +40,16 @@ module SurveyMetamodel extend RGen::MetamodelBuilder::ModuleExtension
37
40
  class HorizontalRadioButtonGroup < SelectionGroup
38
41
  end
39
42
 
40
- class Image < ViewElement
43
+ class Page < ContentElement
44
+ has_attr 'break', Boolean
45
+ contains_many 'elements', ContentElement, 'container'
46
+ end
47
+
48
+ class Group < ContentElement
49
+ contains_many 'elements', Input, 'container'
50
+ end
51
+
52
+ class Image < ContentElement
41
53
  has_attr 'source', String
42
54
  has_attr 'url', String
43
55
  has_attr 'width', Integer
@@ -50,85 +62,36 @@ module SurveyMetamodel extend RGen::MetamodelBuilder::ModuleExtension
50
62
  has_attr 'images_s', String
51
63
  contains_many 'images', Image, 'matrix'
52
64
  end
53
-
54
- class LayoutElement < ViewElement
55
- abstract
56
- contains_many 'elements', ViewElement, 'container'
57
- end
58
-
59
- class Group < LayoutElement
60
- end
61
-
62
- class Page < LayoutElement
63
- has_attr 'break', Boolean
64
- end
65
-
66
- class StaticElement < ViewElement
67
- abstract
68
- end
69
-
70
- class PageView < ViewElement
71
- abstract
72
- contains_many 'elements', StaticElement, 'page'
73
- end
74
-
75
- class StaticPage < PageView
76
- has_attr 'root', Boolean
77
- has_attr 'file', String
78
- end
79
-
80
- class Header < PageView
81
- end
82
-
83
- class Footer < PageView
84
- end
85
-
86
- class Label < StaticElement
87
- end
88
-
89
- class Link < StaticElement
90
- has_attr 'url', String
91
- has_attr 'path', Boolean
92
- end
93
-
94
- class SurveyManagement < StaticElement
95
- end
96
-
97
- class UserManagement < StaticElement
98
- end
99
65
  end
100
66
 
101
67
  module SurveyMetamodel
102
68
  module ViewElement::ClassModule
103
- def get_form
104
- cont = self
105
- while true
106
- if !cont.container.nil?
107
- cont = cont.container
108
- else
109
- break
110
- end
111
- end
112
- return cont.form
113
- end
114
-
115
- def rules
116
- model_element.rules if !model_element.nil?
69
+ def model_element?
70
+ return !model_element.nil?
117
71
  end
118
72
 
119
- def is_mandatory?
120
- return (!model_element.nil? and model_element.rules.any? { |r| r.is_a?(PresenceRule) })
73
+ def is_layout_element?
74
+ return (self.is_a?(Group) or self.is_a?(Page) or self.is_a?(Image))
121
75
  end
122
76
 
123
77
  def has_label?
124
78
  return self.is_a?(Input)
125
79
  end
126
80
 
127
- def number_title(i)
128
- suffix = (is_mandatory?)? " *": ""
129
- real_title = "#{title}#{suffix}"
130
- num_title = (i > 0)? ("#{i}. #{real_title}"): real_title
131
- return num_title
81
+ def has_model_element?
82
+ return (model_element? and !is_layout_element?)
83
+ end
84
+
85
+ def has_valid_model_element?
86
+ return (model_element? or is_layout_element?)
87
+ end
88
+
89
+ def is_mandatory?
90
+ return (!model_element.nil? and model_element.rules.any? { |r| r.is_a?(PresenceRule) })
91
+ end
92
+
93
+ def rules
94
+ model_element.rules if !model_element.nil?
132
95
  end
133
96
 
134
97
  def set_model_element
@@ -144,7 +107,8 @@ module SurveyMetamodel
144
107
  self.for.model_element = nil
145
108
  end
146
109
 
147
- cont = self.get_form
110
+ cont = get_form
111
+ cont.set_model_element if !cont.model_element?
148
112
  view = cont.view
149
113
  survey = view.app.model.surveys.select { |s| s.name == cont.name }.first
150
114
  model_elements = survey.questions.select { |q| q.name == self.name or q.name == self.snake_class }
@@ -158,25 +122,28 @@ module SurveyMetamodel
158
122
  self.class_name = self.snake_base_class
159
123
  end
160
124
 
161
- raise "Names cannot be nil and can only consist of letters, numbers and underscore (name='#{self.name}')!" if has_name and !(self.name.scan(/\w+/).count == 1)
162
- end
163
-
164
- def is_layout_element?
165
- return (self.is_a?(Group) or self.is_a?(Page) or self.is_a?(Image))
125
+ raise "Names cannot be nil and can only consist of letters, numbers and underscore (name='#{name}')!" if has_name? and !(self.name.scan(/\w+/).count == 1)
166
126
  end
167
127
 
168
- def model_element?
169
- return !model_element.nil?
128
+ def number_title(i)
129
+ suffix = (is_mandatory?)? " *": ""
130
+ real_title = "#{title}#{suffix}"
131
+ num_title = (i > 0)? ("#{i}. #{real_title}"): real_title
132
+ return num_title
170
133
  end
171
134
 
172
- def has_model_element?
173
- return (model_element? and !is_layout_element?)
135
+ def get_form
136
+ cont = self
137
+ while true
138
+ if !cont.container.nil?
139
+ cont = cont.container
140
+ else
141
+ break
142
+ end
143
+ end
144
+ return cont.form
174
145
  end
175
146
 
176
- def has_valid_model_element?
177
- return (model_element? or is_layout_element?)
178
- end
179
-
180
147
  private
181
148
 
182
149
  def custom_html?
@@ -185,12 +152,17 @@ module SurveyMetamodel
185
152
  end
186
153
 
187
154
  module Form::ClassModule
155
+ def has_multiple_pages?
156
+ actual_pages_number > 1
157
+ end
158
+
188
159
  def author
189
- model_element.author if !model_element.nil?
160
+ model_element.author if model_element?
190
161
  end
191
162
 
192
- def inputs
193
- elements.select { |e| e.is_a?(Input) }
163
+ def page_title(j)
164
+ page = (pages.reject { |p| p.break == true })[j - 1]
165
+ return (!page.nil? and page.title? and !page.break)? page.title: ""
194
166
  end
195
167
 
196
168
  def pages_number
@@ -201,8 +173,8 @@ module SurveyMetamodel
201
173
  page_elements.count
202
174
  end
203
175
 
204
- def has_multiple_pages
205
- actual_pages_number > 1
176
+ def inputs
177
+ elements.select { |e| e.is_a?(Input) }
206
178
  end
207
179
 
208
180
  def pages
@@ -210,7 +182,7 @@ module SurveyMetamodel
210
182
  end
211
183
 
212
184
  def input_elements
213
- page_elements = self.elements.select { |e| e.is_a?(Page) }.elements
185
+ page_elements = elements.select { |e| e.is_a?(Page) }.elements
214
186
  other_elements = page_elements.select { |e| !e.is_a?(Group) }
215
187
  group_elements = page_elements.select { |e| e.is_a?(Group) }.elements
216
188
  input_elems = (inputs + other_elements + group_elements)
@@ -218,7 +190,8 @@ module SurveyMetamodel
218
190
  end
219
191
 
220
192
  def set_model_element
221
- model_elements = self.view.app.model.surveys.select { |s| s.name == self.name }
193
+ model_elements = view.app.model.surveys.select { |s| s.name == name }
194
+ raise "Form have to be associated to exactly one survey (name='#{name}')!" if !name? or model_elements.nil? or model_elements.count > 1
222
195
  if !model_elements.nil? and model_elements.count == 1
223
196
  self.model_element = model_elements.first
224
197
  self.title = model_element.title if !title? and model_element.title?
@@ -226,36 +199,29 @@ module SurveyMetamodel
226
199
  end
227
200
 
228
201
  def set_page_elements
229
- _pages = pages
230
- first_page_break = _pages.first
202
+ first_page = pages.first
203
+ page_elems = Array.new
204
+ page_elems << elements if pages.count == 0
231
205
 
232
- self.page_elements = Array.new
233
- self.page_elements << elements if _pages.count == 0
234
- if _pages.any?
235
- _pages.each do |page_break|
236
- if !page_break.elements.nil? and !page_break.elements.empty?
237
- self.page_elements << page_break.elements.reject { |e| e.is_a?(Page) }
238
- else
239
- if page_break == first_page_break
240
- self.page_elements << page_elements_before_first
241
- self.page_elements << page_elements_after(page_break)
242
- else
243
- self.page_elements << page_elements_after(page_break)
244
- end
245
- end
206
+ pages.each do |page|
207
+ if !page.elements.nil? and !page.elements.empty?
208
+ page_elems << page.elements
209
+ else
210
+ page_elems << page_elements_before(first_page) if (page == first_page)
211
+ after_page_elements = page_elements_after(page)
212
+ page_elems << after_page_elements if after_page_elements.any?
246
213
  end
247
214
  end
215
+ self.page_elements = page_elems
248
216
  end
249
217
 
250
218
  private
251
219
 
252
- def page_elements_before_first
220
+ def page_elements_before(page)
253
221
  page_elements = Array.new
254
- add = true
255
-
256
- elements.each do |elem|
257
- add = false if elem.is_a?(Page)
258
- page_elements << elem if add
222
+ elements.each do |element|
223
+ break if element.is_a?(Page) and element == page
224
+ page_elements << element
259
225
  end
260
226
  return page_elements
261
227
  end
@@ -263,14 +229,13 @@ module SurveyMetamodel
263
229
  def page_elements_after(page)
264
230
  page_elements = Array.new
265
231
  add = false
266
-
267
- elements.each do |elem|
268
- if elem.is_a?(Page) and elem == page
232
+ elements.each do |element|
233
+ if element.is_a?(Page) and element == page
269
234
  add = true
270
- elsif elem.is_a?(Page) and elem != page
235
+ elsif element.is_a?(Page) and element != page
271
236
  add = false
272
237
  end
273
- page_elements << elem if !elem.is_a?(Page) and add
238
+ page_elements << element if !element.is_a?(Page) and add
274
239
  end
275
240
  return page_elements
276
241
  end
@@ -282,26 +247,15 @@ module SurveyMetamodel
282
247
  end
283
248
 
284
249
  def dependencies?
285
- return (!model_element.nil? and !model_element.dependencies.empty?)
250
+ !model_element.dependencies.empty? if model_element?
286
251
  end
287
252
 
288
253
  def dependencies
289
- model_element.dependencies if !model_element.nil?
254
+ model_element.dependencies if model_element?
290
255
  end
291
256
 
292
257
  def conditions
293
- model_element.conditions if !model_element.nil?
294
- end
295
- end
296
-
297
- module StaticPage::ClassModule
298
- def file_path
299
- raise "The referenced static page does not exist. Please define it first." if !file.nil? and !File.exists?(file)
300
- return (!file.nil?)? file: "gen/assets/static_pages/#{name}.html.erb"
301
- end
302
-
303
- def create_page_file
304
- File.new(file_path, 'w') unless File.exists?(file_path)
258
+ model_element.conditions if model_element?
305
259
  end
306
260
  end
307
261
 
@@ -320,65 +274,63 @@ module SurveyMetamodel
320
274
  model_element.real_choices if !model_element.nil?
321
275
  end
322
276
 
323
- def params_s
324
- choices_string_a = Array.new
325
- choices.each { |choice| choices_string_a << "params[:#{name}_#{choice.name}].to_s" }
326
- return "[#{choices_string_a.join(', ')}].reject(&:empty?).join(', ')"
277
+ def parameters
278
+ parameters_a = Array.new
279
+ choices.each { |choice| parameters_a << "params[:#{name}_#{choice.name}].to_s" }
280
+ return "[#{parameters_a.join(', ')}].reject(&:empty?).join(', ')"
281
+ end
282
+ end
283
+
284
+ module Image::ClassModule
285
+ def source?
286
+ !source.blank?
287
+ end
288
+
289
+ def url?
290
+ !url.blank?
327
291
  end
328
292
  end
329
293
 
330
294
  module Table::ClassModule
295
+ def has_images?
296
+ return (images.any? or !images_s.blank?)
297
+ end
298
+
331
299
  def type
332
- model_element.type if !model_element.nil?
300
+ model_element.type if model_element?
333
301
  end
334
302
 
335
303
  def rows
336
- model_element.real_rows if !model_element.nil?
304
+ model_element.real_rows if model_element?
337
305
  end
338
306
 
339
307
  def columns
340
- model_element.real_columns if !model_element.nil?
308
+ model_element.real_columns if model_element?
341
309
  end
342
310
 
343
311
  def choices
344
- model_element.real_choices if !model_element.nil?
345
- end
346
-
347
- def has_images?
348
- return (images.any? or !images_s.blank?)
312
+ model_element.real_choices if model_element?
349
313
  end
350
314
 
351
315
  def real_images
352
- imgs = nil
316
+ images_a = nil
353
317
  if !images_s.blank? and images.empty?
354
- imgs = Array.new
355
- images_s.split(",").each { |image_s| imgs << Image.new(:source => image_s.strip) }
318
+ images_a = Array.new
319
+ images_s.split(",").each { |image| images_a << Image.new(:source => image.strip) }
356
320
  else
357
- imgs = images
321
+ images_a = images
358
322
  end
359
- raise "The number of images cannot be more than the number of cells." if imgs.count > (rows.count * columns.count)
360
- return imgs
323
+ raise "The number of images has to be the same than the number of cells." if images_a.count != (rows.count * columns.count)
324
+ return images_a
361
325
  end
362
326
 
363
- def params_s
364
- cells_string_a = Array.new
327
+ def parameters
328
+ parameters_a = Array.new
365
329
  rows.each do |row|
366
- cells_string_a << "params[:#{name}_#{row.name}]"
367
- columns.each do |column|
368
- cells_string_a << "params[:#{name}_#{row.name}_#{column.name}]"
369
- end
330
+ parameters_a << "params[:#{name}_#{row.name}]"
331
+ columns.each { |column| parameters_a << "params[:#{name}_#{row.name}_#{column.name}]" }
370
332
  end
371
- return "[#{cells_string_a.join(', ')}].uniq.reject(&:blank?).join(', ')"
372
- end
373
- end
374
-
375
- module Image::ClassModule
376
- def source?
377
- !source.blank?
378
- end
379
-
380
- def url?
381
- !url.blank?
333
+ return "[#{parameters_a.join(', ')}].uniq.reject(&:blank?).join(', ')"
382
334
  end
383
335
  end
384
336
  end