surveyor 0.8.0 → 0.9.0
Sign up to get free protection for your applications and to get access to all the features.
- 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
|