surveyor 0.8.0 → 0.9.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.
- data/README.md +22 -5
- data/VERSION +1 -1
- data/app/models/dependency.rb +16 -32
- data/app/models/question.rb +1 -1
- data/app/models/question_group.rb +1 -1
- data/app/models/response.rb +1 -4
- data/app/models/response_set.rb +4 -3
- data/app/models/survey.rb +0 -1
- data/app/models/validation.rb +20 -0
- data/app/models/validation_condition.rb +19 -17
- data/generators/surveyor/surveyor_generator.rb +9 -5
- data/generators/surveyor/templates/migrate/add_display_order_to_surveys.rb +9 -0
- data/generators/surveyor/templates/surveys/kitchen_sink_survey.rb +15 -4
- data/lib/surveyor.rb +16 -0
- data/script/surveyor/answer.rb +32 -55
- data/script/surveyor/base.rb +61 -0
- data/script/surveyor/dependency.rb +4 -41
- data/script/surveyor/dependency_condition.rb +13 -38
- data/script/surveyor/question.rb +16 -50
- data/script/surveyor/question_group.rb +7 -19
- data/script/surveyor/specs/answer_spec.rb +15 -52
- data/script/surveyor/specs/question_spec.rb +37 -85
- data/script/surveyor/specs/spec_helper.rb +6 -0
- data/script/surveyor/specs/survey_section_spec.rb +23 -0
- data/script/surveyor/specs/validation_condition_spec.rb +20 -0
- data/script/surveyor/specs/validation_spec.rb +20 -0
- data/script/surveyor/survey.rb +10 -85
- data/script/surveyor/survey_parser.rb +160 -38
- data/script/surveyor/survey_section.rb +6 -130
- data/script/surveyor/validation.rb +19 -0
- data/script/surveyor/validation_condition.rb +19 -0
- data/spec/lib/surveyor_spec.rb +44 -0
- data/spec/models/dependency_spec.rb +9 -16
- data/spec/models/question_group_spec.rb +3 -3
- data/spec/models/question_spec.rb +1 -1
- data/spec/models/validation_condition_spec.rb +29 -0
- data/spec/models/validation_spec.rb +27 -0
- data/spec/spec_helper.rb +0 -2
- data/surveyor.gemspec +12 -7
- metadata +12 -7
- data/lib/tiny_code.rb +0 -58
- data/script/surveyor/columnizer.rb +0 -36
- data/script/surveyor/specs/question_dependency_spec.rb +0 -46
- data/script/surveyor/specs/question_group_spec.rb +0 -9
- data/script/surveyor/specs/section_spec.rb +0 -58
@@ -0,0 +1,23 @@
|
|
1
|
+
require File.expand_path(File.dirname(__FILE__) + '/spec_helper')
|
2
|
+
require 'survey_section'
|
3
|
+
|
4
|
+
describe SurveySection, "when first created" do
|
5
|
+
|
6
|
+
before(:each) do
|
7
|
+
@section = SurveySection.new(mock("Survey", :id => 2, :parser => mock("Parser", :new_survey_section_id => 1)), ["Demographics"], {})
|
8
|
+
end
|
9
|
+
|
10
|
+
it "should generate a data export identifier" do
|
11
|
+
@section.data_export_identifier.should == "demographics"
|
12
|
+
end
|
13
|
+
|
14
|
+
it "should find a question by reference" do
|
15
|
+
@section.questions << mock("Question", :reference_identifier => "1", :text => "foo")
|
16
|
+
@section.questions << mock("Question", :reference_identifier => "2", :text => "foo")
|
17
|
+
@section.questions << mock("Question", :reference_identifier => "3", :text => "foo")
|
18
|
+
|
19
|
+
q = @section.find_question_by_reference("2")
|
20
|
+
q.should_not be_nil
|
21
|
+
q.reference_identifier.should == "2"
|
22
|
+
end
|
23
|
+
end
|
@@ -0,0 +1,20 @@
|
|
1
|
+
require File.expand_path(File.dirname(__FILE__) + '/spec_helper')
|
2
|
+
require 'validation_condition'
|
3
|
+
|
4
|
+
describe ValidationCondition, " when first created" do
|
5
|
+
before do
|
6
|
+
validation = mock("Validation", :id => 29, :parser => mock("Parser", :new_validation_condition_id => 21))
|
7
|
+
validation.stub!(:class => Validation)
|
8
|
+
args = [">=", {:integer_value => 0}]
|
9
|
+
options = {}
|
10
|
+
@validation_condition = ValidationCondition.new(validation, args, options)
|
11
|
+
end
|
12
|
+
|
13
|
+
it "should set initialization parameters properly" do
|
14
|
+
@validation_condition.id.should == 21
|
15
|
+
@validation_condition.validation_id.should == 29
|
16
|
+
@validation_condition.integer_value.should == 0
|
17
|
+
@validation_condition.operator.should == ">="
|
18
|
+
end
|
19
|
+
|
20
|
+
end
|
@@ -0,0 +1,20 @@
|
|
1
|
+
require File.expand_path(File.dirname(__FILE__) + '/spec_helper')
|
2
|
+
require 'validation'
|
3
|
+
|
4
|
+
describe Validation, " when first created" do
|
5
|
+
before do
|
6
|
+
answer = mock("Answer", :id => 2, :parser => mock("Parser", :new_validation_id => 1))
|
7
|
+
answer.stub!(:class => Answer)
|
8
|
+
args = [{:rule => "C", :message => "Please select a number between 0 and 120"}]
|
9
|
+
options = {}
|
10
|
+
@validation = Validation.new(answer, args, options)
|
11
|
+
end
|
12
|
+
|
13
|
+
it "should set initialization parameters properly" do
|
14
|
+
@validation.id.should == 1
|
15
|
+
@validation.message.should == "Please select a number between 0 and 120"
|
16
|
+
@validation.answer_id.should == 2
|
17
|
+
@validation.rule.should == "C"
|
18
|
+
end
|
19
|
+
|
20
|
+
end
|
data/script/surveyor/survey.rb
CHANGED
@@ -1,85 +1,25 @@
|
|
1
|
-
|
2
|
-
|
3
|
-
class Survey
|
4
|
-
include Columnizer
|
5
|
-
# Context, Content, Reference, Expiry, Display, Children
|
1
|
+
class Survey < SurveyParser::Base
|
2
|
+
# Context, Content, Reference, Expiry, Display
|
6
3
|
attr_accessor :id, :parser
|
7
4
|
attr_accessor :title, :description
|
8
5
|
attr_accessor :access_code, :reference_identifier, :data_export_identifier, :common_namespace, :common_identitier
|
9
6
|
attr_accessor :active_at, :inactive_at
|
10
7
|
attr_accessor :css_url, :custom_class
|
11
|
-
|
12
|
-
|
13
|
-
@@current_survey = nil
|
14
|
-
|
15
|
-
def self.current_survey
|
16
|
-
@@current_survey
|
17
|
-
end
|
18
|
-
|
19
|
-
def self.current_survey=(value)
|
20
|
-
@@current_survey = value
|
21
|
-
puts "Assigning current survey #{@@current_survey.title}"
|
22
|
-
end
|
8
|
+
has_children :survey_sections
|
23
9
|
|
24
|
-
|
25
|
-
|
26
|
-
|
27
|
-
self.parser = parser
|
28
|
-
self.title = title
|
29
|
-
self.survey_sections = []
|
30
|
-
self.access_code = Columnizer.to_normalized_column(title)
|
31
|
-
# self.default_options(title).merge(options).each{|key,value| self.instance_variable_set("@#{key}", value)}
|
32
|
-
Survey.current_survey = self
|
10
|
+
def parse_args(args)
|
11
|
+
title = args[0]
|
12
|
+
{:title => title, :access_code => Surveyor.to_normalized_string(title)}.merge(args[1] || {})
|
33
13
|
end
|
34
|
-
|
35
|
-
# def default_options(title)
|
36
|
-
# {}
|
37
|
-
# end
|
38
14
|
|
39
|
-
# This method_missing magic does all the heavy lifting for the DSL
|
40
|
-
def method_missing(missing_method, *args, &block)
|
41
|
-
m_name = missing_method.to_s
|
42
|
-
if (section_match = m_name.match(/(\Asection)_?(.*)/))
|
43
|
-
build_survey_section(section_match[3].to_s, *args, &block) # Parse "section" method, create new section in this survey
|
44
|
-
else
|
45
|
-
puts " ERROR: '#{m_name}' not valid method_missing name"
|
46
|
-
end
|
47
|
-
end
|
48
|
-
|
49
|
-
def build_survey_section(reference_identifier, title, &block)
|
50
|
-
puts " Section: #{title}"
|
51
|
-
if block_given?
|
52
|
-
new_survey_section = SurveySection.new(new_survey_section_id, self, title, {:display_order => self.survey_sections.size + 1, :reference_identifier => reference_identifier})
|
53
|
-
new_survey_section.instance_eval(&block)
|
54
|
-
add_survey_section(new_survey_section)
|
55
|
-
puts " Section added"
|
56
|
-
else
|
57
|
-
puts " ERROR: A section cannot be empty!"
|
58
|
-
end
|
59
|
-
end
|
60
|
-
|
61
|
-
def new_survey_section_id
|
62
|
-
self.parser.new_survey_section_id
|
63
|
-
end
|
64
|
-
|
65
|
-
def add_survey_section(survey_section)
|
66
|
-
self.survey_sections << survey_section
|
67
|
-
end
|
68
|
-
|
69
|
-
# Used to find questions for dependency linking
|
70
15
|
def find_question_by_reference(ref_id)
|
71
|
-
|
72
|
-
|
73
|
-
|
74
|
-
question = self.survey_sections[count].find_question_by_reference(ref_id)
|
75
|
-
count += 1
|
76
|
-
end
|
77
|
-
question
|
16
|
+
found = nil
|
17
|
+
survey_sections.detect{|s| found = s.find_question_by_reference(ref_id)}
|
18
|
+
return found
|
78
19
|
end
|
79
20
|
|
80
|
-
|
81
21
|
def reconcile_dependencies
|
82
|
-
|
22
|
+
survey_sections.each do |section|
|
83
23
|
section.questions.each do |question|
|
84
24
|
question.dependency.dependency_conditions.each { |con| con.reconcile_dependencies} unless question.dependency.nil?
|
85
25
|
end
|
@@ -89,19 +29,4 @@ class Survey
|
|
89
29
|
end
|
90
30
|
end
|
91
31
|
|
92
|
-
def yml_attrs
|
93
|
-
instance_variables.sort - ["@parser", "@survey_sections"]
|
94
|
-
end
|
95
|
-
def to_yml
|
96
|
-
out = [ %(survey_#{@id}:) ]
|
97
|
-
yml_attrs.each{|a| out << " #{a[1..-1]}: #{instance_variable_get(a).is_a?(String) ? "\"#{instance_variable_get(a)}\"" : instance_variable_get(a) }"}
|
98
|
-
(out << nil ).join("\r\n")
|
99
|
-
end
|
100
|
-
|
101
|
-
def to_file
|
102
|
-
"survey -#{self.title}- written to file..."
|
103
|
-
File.open(self.parser.surveys_yml, File::CREAT|File::APPEND|File::WRONLY) {|f| f << to_yml}
|
104
|
-
self.survey_sections.compact.map(&:to_file)
|
105
|
-
end
|
106
|
-
|
107
32
|
end
|
@@ -1,60 +1,182 @@
|
|
1
|
-
require
|
1
|
+
require 'activesupport' # for pluralize, humanize in ActiveSupport::CoreExtensions::String::Inflections
|
2
2
|
|
3
3
|
class SurveyParser
|
4
|
-
|
5
|
-
|
6
|
-
|
7
|
-
|
4
|
+
@@models = %w(survey survey_section question_group question answer dependency dependency_condition validation validation_condition)
|
5
|
+
|
6
|
+
# Require base and all models
|
7
|
+
(%w(base) + @@models).each{|m| require File.dirname(__FILE__) + "/#{m}"}
|
8
8
|
|
9
|
-
#
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
|
9
|
+
# Attributes
|
10
|
+
attr_accessor :surveys, :grid_answers
|
11
|
+
@@models.each{|m| attr_accessor "#{m.pluralize}_yml".to_sym } # for fixtures
|
12
|
+
(@@models - %w(dependency_condition validation_condition)).each {|m| attr_accessor "current_#{m}".to_sym} # for current_model caches
|
13
|
+
|
14
|
+
# Class methods
|
15
|
+
def self.parse(file_name)
|
16
|
+
self.define_counter_methods(@@models)
|
17
|
+
puts "\n--- Parsing '#{file_name}' ---"
|
18
|
+
parser = SurveyParser.new
|
19
|
+
parser.instance_eval(File.read(file_name))
|
20
|
+
parser.to_files
|
21
|
+
puts "--- End of parsing ---\n\n"
|
14
22
|
end
|
15
23
|
|
16
24
|
# new_survey_id, new_survey_section_id, etc.
|
17
|
-
def define_counter_methods(names)
|
25
|
+
def self.define_counter_methods(names)
|
18
26
|
names.each do |name|
|
19
|
-
|
20
|
-
|
21
|
-
self.class.send(:define_method, "new_#{name}_id") do
|
22
|
-
self.instance_variable_set("@last_#{name}_id", self.instance_variable_get("@last_#{name}_id") + 1)
|
27
|
+
define_method("new_#{name}_id") do
|
28
|
+
instance_variable_set("@last_#{name}_id", instance_variable_get("@last_#{name}_id") + 1)
|
23
29
|
end
|
24
30
|
end
|
25
31
|
end
|
32
|
+
|
33
|
+
# Instance methods
|
34
|
+
def initialize
|
35
|
+
self.surveys = []
|
36
|
+
self.grid_answers = []
|
37
|
+
initialize_counters(@@models)
|
38
|
+
initialize_fixtures(@@models.map(&:pluralize), File.join(RAILS_ROOT, "surveys", "fixtures"))
|
39
|
+
end
|
40
|
+
|
41
|
+
# @last_survey_id, @last_survey_section_id, etc.
|
42
|
+
def initialize_counters(names)
|
43
|
+
names.each{|name| instance_variable_set("@last_#{name}_id", 0)}
|
44
|
+
end
|
26
45
|
|
27
|
-
# surveys_yml, survey_sections_yml, etc.
|
46
|
+
# @surveys_yml, @survey_sections_yml, etc.
|
28
47
|
def initialize_fixtures(names, path)
|
29
|
-
names.each
|
30
|
-
file = self.instance_variable_set("@#{name}_yml", "#{path}/#{name}.yml")
|
31
|
-
File.truncate(file, 0) if File.exist?(file)
|
32
|
-
end
|
48
|
+
names.each {|name| file = instance_variable_set("@#{name}_yml", "#{path}/#{name}.yml"); File.truncate(file, 0) if File.exist?(file) }
|
33
49
|
end
|
34
50
|
|
35
|
-
|
36
|
-
|
37
|
-
|
38
|
-
|
39
|
-
|
40
|
-
|
41
|
-
|
51
|
+
# This method_missing does all the heavy lifting for the DSL
|
52
|
+
def method_missing(missing_method, *args, &block)
|
53
|
+
method_name, reference_identifier = missing_method.to_s.split("_", 2)
|
54
|
+
opts = {:method_name => method_name, :reference_identifier => reference_identifier}
|
55
|
+
case method_name
|
56
|
+
when "survey"
|
57
|
+
self.current_survey = Survey.new(self, args, opts)
|
58
|
+
evaluate_the "survey", &block
|
59
|
+
|
60
|
+
when "section"
|
61
|
+
self.current_survey_section = SurveySection.new(self.current_survey, args, opts.merge({:display_order => current_survey.survey_sections.size + 1}))
|
62
|
+
evaluate_the "survey_section", &block
|
63
|
+
|
64
|
+
when "group", "g", "grid", "repeater"
|
65
|
+
self.current_question_group = QuestionGroup.new(self.current_survey_section, args, opts)
|
66
|
+
evaluate_the "question_group", &block
|
67
|
+
|
68
|
+
when "question", "q", "label", "image"
|
69
|
+
drop_the &block
|
70
|
+
self.current_question = Question.new(self.current_survey_section, args, opts.merge(:question_group_id => current_question_group ? current_question_group.id : nil))
|
71
|
+
add_grid_answers if in_a_grid?
|
72
|
+
|
73
|
+
when "dependency", "d"
|
74
|
+
drop_the &block
|
75
|
+
self.current_dependency = Dependency.new(self.current_question_group || current_question, args, opts)
|
76
|
+
|
77
|
+
when "condition", "c"
|
78
|
+
drop_the &block
|
79
|
+
raise "Error: No current dependency or validation for this condition" if self.current_dependency.nil? && self.current_validation.nil?
|
80
|
+
if self.current_dependency.nil?
|
81
|
+
self.current_validation.validation_conditions << ValidationCondition.new(self.current_validation, args, opts)
|
82
|
+
else
|
83
|
+
self.current_dependency.dependency_conditions << DependencyCondition.new(self.current_dependency, args, opts)
|
84
|
+
end
|
85
|
+
|
86
|
+
when "answer", "a"
|
87
|
+
drop_the &block
|
88
|
+
if in_a_grid?
|
89
|
+
self.grid_answers << Answer.new(nil, args, opts.merge(:display_order => grid_answers.size + 1))
|
90
|
+
else
|
91
|
+
raise "Error: No current question" if self.current_question.nil?
|
92
|
+
self.current_answer = Answer.new(self.current_question, args, opts.merge(:display_order => current_question.answers.size + 1))
|
93
|
+
end
|
94
|
+
|
95
|
+
when "validation", "v"
|
96
|
+
drop_the &block
|
97
|
+
self.current_validation = Validation.new(self.current_answer, args, opts)
|
42
98
|
|
43
|
-
def survey(title, &block)
|
44
|
-
puts "Survey: #{title}"
|
45
|
-
if block_given?
|
46
|
-
new_survey = Survey.new(self.new_survey_id, self, title)
|
47
|
-
new_survey.instance_eval(&block)
|
48
|
-
new_survey.reconcile_dependencies
|
49
|
-
add_survey(new_survey)
|
50
|
-
puts "Survey added"
|
51
99
|
else
|
52
|
-
|
100
|
+
raise " ERROR: '#{method_name}' not valid method"
|
101
|
+
|
102
|
+
end
|
103
|
+
end
|
104
|
+
|
105
|
+
def drop_the(&block)
|
106
|
+
raise "Error, I'm dropping the block like it's hot" if block_given?
|
107
|
+
end
|
108
|
+
|
109
|
+
def evaluate_the(model, &block)
|
110
|
+
raise "Error: A #{model.humanize} cannot be empty" unless block_given?
|
111
|
+
self.instance_eval(&block)
|
112
|
+
self.send("clear_current", model)
|
113
|
+
end
|
114
|
+
|
115
|
+
def clear_current(model)
|
116
|
+
# puts "clear_current #{model}"
|
117
|
+
case model
|
118
|
+
when "survey"
|
119
|
+
self.current_survey.reconcile_dependencies unless current_survey.nil?
|
120
|
+
when "question_group"
|
121
|
+
self.grid_answers = []
|
122
|
+
clear_current("question")
|
123
|
+
when "question"
|
124
|
+
@current_dependency = nil
|
125
|
+
when "answer"
|
126
|
+
@current_validation = nil
|
53
127
|
end
|
128
|
+
instance_variable_set("@current_#{model}", nil)
|
129
|
+
model.classify.constantize.send(:children).each{|m| clear_current(m.to_s.singularize)}
|
130
|
+
end
|
131
|
+
|
132
|
+
def current_survey=(s)
|
133
|
+
clear_current "survey"
|
134
|
+
self.surveys << s
|
135
|
+
@current_survey = s
|
136
|
+
end
|
137
|
+
def current_survey_section=(s)
|
138
|
+
clear_current "survey_section"
|
139
|
+
self.current_survey.survey_sections << s
|
140
|
+
@current_survey_section = s
|
141
|
+
end
|
142
|
+
def current_question_group=(g)
|
143
|
+
clear_current "question_group"
|
144
|
+
self.current_survey_section.question_groups << g
|
145
|
+
@current_question_group = g
|
146
|
+
end
|
147
|
+
def current_question=(q)
|
148
|
+
clear_current "question"
|
149
|
+
self.current_survey_section.questions << q
|
150
|
+
@current_question = q
|
151
|
+
end
|
152
|
+
def current_dependency=(d)
|
153
|
+
raise "Error: No question or question group" unless (dependent = self.current_question_group || self.current_question)
|
154
|
+
dependent.dependency = d
|
155
|
+
@current_dependency = d
|
156
|
+
end
|
157
|
+
def current_answer=(a)
|
158
|
+
raise "Error: No current question" if self.current_question.nil?
|
159
|
+
self.current_question.answers << a
|
160
|
+
@current_answer = a
|
161
|
+
end
|
162
|
+
def current_validation=(v)
|
163
|
+
clear_current "validation"
|
164
|
+
self.current_answer.validation = v
|
165
|
+
@current_validation = v
|
54
166
|
end
|
55
167
|
|
56
|
-
def
|
57
|
-
self.
|
168
|
+
def in_a_grid?
|
169
|
+
self.current_question_group and self.current_question_group.display_type == "grid"
|
170
|
+
end
|
171
|
+
|
172
|
+
def add_grid_answers
|
173
|
+
self.grid_answers.each do |grid_answer|
|
174
|
+
my_answer = grid_answer.dup
|
175
|
+
my_answer.id = new_answer_id
|
176
|
+
my_answer.question_id = self.current_question.id
|
177
|
+
my_answer.parser = self
|
178
|
+
self.current_answer = my_answer
|
179
|
+
end
|
58
180
|
end
|
59
181
|
|
60
182
|
def to_files
|
@@ -1,143 +1,19 @@
|
|
1
|
-
|
2
|
-
require File.dirname(__FILE__) + '/question'
|
3
|
-
require File.dirname(__FILE__) + '/answer'
|
4
|
-
require File.dirname(__FILE__) + '/dependency'
|
5
|
-
require File.dirname(__FILE__) + '/dependency_condition'
|
6
|
-
require File.dirname(__FILE__) + '/columnizer'
|
7
|
-
require 'activesupport'
|
8
|
-
#require 'activesupport/lib/active_support/core_ext/string/inflections'
|
9
|
-
|
10
|
-
class SurveySection
|
11
|
-
include Columnizer
|
12
|
-
|
1
|
+
class SurveySection < SurveyParser::Base
|
13
2
|
# Context, Content, Display, Reference, Children, Placeholders
|
14
3
|
attr_accessor :id, :parser, :survey_id
|
15
4
|
attr_accessor :title, :description
|
16
5
|
attr_accessor :reference_identifier, :data_export_identifier, :common_namespace, :common_identitier
|
17
6
|
attr_accessor :display_order, :custom_class
|
18
|
-
|
19
|
-
attr_accessor :current_question_group, :current_question, :current_dependency
|
7
|
+
has_children :question_groups, :questions
|
20
8
|
|
21
|
-
|
22
|
-
|
23
|
-
|
24
|
-
self.survey_id = survey.id
|
25
|
-
self.parser = survey.parser
|
26
|
-
self.title = title.strip
|
27
|
-
self.questions = []
|
28
|
-
self.question_groups = []
|
29
|
-
self.grid_answers = []
|
30
|
-
self.current_question_group = nil
|
31
|
-
self.current_question = nil
|
32
|
-
self.current_dependency = nil
|
33
|
-
self.default_options(title).merge(options).each{|key,value| self.instance_variable_set("@#{key}", value)}
|
9
|
+
def parse_args(args)
|
10
|
+
title = args[0]
|
11
|
+
{:title => title, :data_export_identifier => Surveyor.to_normalized_string(title)}.merge(args[1] || {})
|
34
12
|
end
|
35
13
|
|
36
|
-
|
37
|
-
{ :data_export_identifier => Columnizer.to_normalized_column(title)
|
38
|
-
}
|
39
|
-
end
|
40
|
-
|
41
|
-
# This method_missing magic does all the heavy lifting for the DSL
|
42
|
-
def method_missing(missing_method, *args, &block)
|
43
|
-
method_name, reference_identifier = missing_method.to_s.split("_")
|
44
|
-
|
45
|
-
case method_name
|
46
|
-
|
47
|
-
when "group", "g", "grid", "repeater"
|
48
|
-
puts " Group: #{reference_identifier}"
|
49
|
-
raise "Error: A question group cannot be empty" unless block_given?
|
50
|
-
|
51
|
-
clear_current_question
|
52
|
-
options = {:reference_identifier => reference_identifier, :display_type => (method_name =~ /grid|repeater/)? method_name : nil }
|
53
|
-
self.question_groups << (self.current_question_group = QuestionGroup.new(self, args, options))
|
54
|
-
self.instance_eval(&block)
|
55
|
-
clear_current_question_group
|
56
|
-
|
57
|
-
when "question", "q", "label", "image"
|
58
|
-
puts " Question: #{reference_identifier}"
|
59
|
-
raise "Error: I'm dropping the block like it's hot" if block_given?
|
60
|
-
|
61
|
-
clear_current_question
|
62
|
-
options = {:reference_identifier => reference_identifier, :question_group_id => (current_question_group ? current_question_group.id : nil)}
|
63
|
-
options.merge!({:display_type => "label"}) if method_name == "label"
|
64
|
-
options.merge!({:display_type => "image"}) if method_name == "image"
|
65
|
-
self.questions << (self.current_question = Question.new(self, args, options))
|
66
|
-
add_grid_answers if self.current_question_group and self.current_question_group.display_type == "grid"
|
67
|
-
|
68
|
-
when "dependency", "d"
|
69
|
-
puts " Dependency: #{reference_identifier}"
|
70
|
-
raise "Error: I'm dropping the block like it's hot" if block_given?
|
71
|
-
raise "Error: No question or question group" unless (d = self.current_question_group || self.current_question)
|
72
|
-
|
73
|
-
options = {}# {:reference_identifier => reference_identifier}
|
74
|
-
d.dependency = (self.current_dependency = Dependency.new(d, args, options))
|
75
|
-
|
76
|
-
when "condition", "c"
|
77
|
-
puts " Condition: #{reference_identifier}"
|
78
|
-
raise "Error, I'm dropping the block like it's hot" if block_given?
|
79
|
-
raise "Error: No current dependency" unless self.current_dependency
|
80
|
-
|
81
|
-
options = {:rule_key => reference_identifier}
|
82
|
-
self.current_dependency.add_dependency_condition DependencyCondition.new(self, args, options)
|
83
|
-
|
84
|
-
when "answer", "a"
|
85
|
-
puts " Answer: #{reference_identifier}"
|
86
|
-
raise "Error, I'm dropping the block like it's hot" if block_given?
|
87
|
-
|
88
|
-
if self.current_question_group and self.current_question_group.display_type == "grid"
|
89
|
-
options = {:reference_identifier => reference_identifier, :display_order => self.grid_answers.size + 1}
|
90
|
-
self.grid_answers << Answer.new(nil, args, options)
|
91
|
-
else
|
92
|
-
raise "Error: No current question" unless self.current_question
|
93
|
-
options = {:reference_identifier => reference_identifier, :display_order => self.current_question.answers.size + 1}
|
94
|
-
self.current_question.answers << Answer.new(self.current_question, args, options)
|
95
|
-
end
|
96
|
-
|
97
|
-
else
|
98
|
-
raise " ERROR: '#{m_name}' not valid method_missing name"
|
99
|
-
end
|
100
|
-
end
|
101
|
-
|
102
|
-
def clear_current_question_group
|
103
|
-
self.current_question_group = nil
|
104
|
-
self.grid_answers = []
|
105
|
-
self.current_question = nil
|
106
|
-
end
|
107
|
-
|
108
|
-
def clear_current_question
|
109
|
-
self.current_question = nil
|
110
|
-
self.current_dependency = nil
|
111
|
-
end
|
112
|
-
|
113
|
-
def add_grid_answers
|
114
|
-
self.grid_answers.each do |grid_answer|
|
115
|
-
my_answer = grid_answer.dup
|
116
|
-
my_answer.id = self.parser.new_answer_id
|
117
|
-
my_answer.question_id = self.current_question.id
|
118
|
-
my_answer.parser = self.parser
|
119
|
-
self.current_question.answers << my_answer
|
120
|
-
end
|
121
|
-
end
|
122
|
-
|
123
|
-
# Used to find questions for dependency linking
|
14
|
+
# Used to find questions for dependency linking
|
124
15
|
def find_question_by_reference(ref_id)
|
125
16
|
self.questions.detect{|q| q.reference_identifier == ref_id}
|
126
17
|
end
|
127
18
|
|
128
|
-
def yml_attrs
|
129
|
-
instance_variables.sort - ["@parser", "@question_groups", "@questions", "@grid_answers", "@current_question_group", "@current_question", "@current_dependency"]
|
130
|
-
end
|
131
|
-
def to_yml
|
132
|
-
out = [ %(#{@data_export_identifier}_#{@id}:) ]
|
133
|
-
yml_attrs.each{|a| out << " #{a[1..-1]}: #{instance_variable_get(a).is_a?(String) ? "\"#{instance_variable_get(a)}\"" : instance_variable_get(a) }"}
|
134
|
-
(out << nil ).join("\r\n")
|
135
|
-
end
|
136
|
-
|
137
|
-
def to_file
|
138
|
-
File.open(self.parser.survey_sections_yml, File::CREAT|File::APPEND|File::WRONLY) {|f| f << to_yml}
|
139
|
-
self.question_groups.compact.map(&:to_file)
|
140
|
-
self.questions.compact.map(&:to_file)
|
141
|
-
end
|
142
|
-
|
143
19
|
end
|