surveyor 0.15.0 → 0.16.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 CHANGED
@@ -89,8 +89,12 @@ After you have run them start up your app and go to:
89
89
 
90
90
  http://localhost:3000/surveys
91
91
 
92
- Try taking the survey and compare it to the contents of the DSL file kitchen\_sink\_survey.rb. See how each type of
93
- DSL question maps to the resulting rendered view of the question.
92
+ Try taking the survey and compare it to the contents of the DSL file kitchen\_sink\_survey.rb. See how each type of DSL question maps to the resulting rendered view of the question.
93
+
94
+ There are two other useful rake tasks for removing (only surveys without responses) and un-parsing (from db to DSL file) surveys:
95
+
96
+ rake surveyor:remove
97
+ rake surveyor:unparse
94
98
 
95
99
  # Customizing surveyor
96
100
 
@@ -110,6 +114,13 @@ To work on the plugin code (for enhancements, and bug fixes, etc...) fork this g
110
114
 
111
115
  # Changes
112
116
 
117
+ 0.16.0
118
+
119
+ * minor fixes to unparsing
120
+ * refining unparser. added rake task to unparse survey. closes #79
121
+ * unparsing for groups, dependencies, validations
122
+ * starting work on unparser for basic survey, section and question.
123
+
113
124
  0.15.0
114
125
 
115
126
  * prevent duplicate survey titles by appending incrementing numbers
data/VERSION CHANGED
@@ -1 +1 @@
1
- 0.15.0
1
+ 0.16.0
@@ -73,7 +73,7 @@ survey "“Kitchen Sink” survey" do
73
73
  a :text, :custom_class => 'mapper'
74
74
  # validations can use regexp values
75
75
  validation :rule => "A"
76
- condition_A "=~", :regexp => /[0-9a-zA-z\. #]/
76
+ condition_A "=~", :regexp => "[0-9a-zA-z\. #]"
77
77
 
78
78
  # Questions, groups, and answers take a custom renderer (a partial in the application's views dir)
79
79
  # defaults are "/partials/question_group", "/partials/question", "/partials/answer", so the custom renderers should have a different name
@@ -82,13 +82,7 @@ survey "“Kitchen Sink” survey" do
82
82
 
83
83
  q_time_lunch "What time do you usually take a lunch break?"
84
84
  a_1 :time
85
-
86
- # # validation conditions can look up the response to another question/answer pair
87
- # q_time_dinner "What time do you usually take a dinner break?"
88
- # a :time
89
- # validation :rule => "A"
90
- # condition_A ">=", :question_reference => "time_lunch", :answer_reference => "1"
91
-
85
+
92
86
  q "When would you like to meet for dinner?"
93
87
  a :date
94
88
 
@@ -24,9 +24,11 @@ module Surveyor
24
24
 
25
25
  def default_args
26
26
  self.display_order ||= self.question ? self.question.answers.count : 0
27
- # self.is_exclusive ||= false
28
- # self.hide_label ||= false
29
- # self.response_class ||= "answer"
27
+ self.is_exclusive ||= false
28
+ self.hide_label ||= false
29
+ self.response_class ||= "answer"
30
+ self.short_text ||= text
31
+ self.data_export_identifier ||= Surveyor::Common.normalize(text)
30
32
  end
31
33
 
32
34
  def renderer(q = question)
@@ -21,6 +21,10 @@ module Surveyor
21
21
  display_type.blank? ? :default : display_type.to_sym
22
22
  end
23
23
 
24
+ def display_type=(val)
25
+ write_attribute(:display_type, val.nil? ? nil : val.to_s)
26
+ end
27
+
24
28
  def dependent?
25
29
  self.dependency != nil
26
30
  end
@@ -29,6 +29,8 @@ module Surveyor
29
29
  self.display_type ||= "default"
30
30
  self.pick ||= "none"
31
31
  self.display_order ||= self.survey_section ? self.survey_section.questions.count : 0
32
+ self.data_export_identifier ||= Surveyor::Common.normalize(text)
33
+ self.short_text ||= text
32
34
  end
33
35
 
34
36
  def pick=(val)
@@ -55,6 +57,9 @@ module Surveyor
55
57
  def part_of_group?
56
58
  !self.question_group.nil?
57
59
  end
60
+ def solo?
61
+ self.question_group.nil?
62
+ end
58
63
 
59
64
  def renderer(g = question_group)
60
65
  r = [g ? g.renderer.to_s : nil, display_type].compact.join("_")
@@ -23,7 +23,8 @@ module Surveyor
23
23
  end
24
24
 
25
25
  def default_args
26
- self.display_order ||= self.survey ? self.survey.sections.count : 0
26
+ self.display_order ||= survey ? survey.sections.count : 0
27
+ self.data_export_identifier ||= Surveyor::Common.normalize(title)
27
28
  end
28
29
 
29
30
  end
@@ -95,8 +95,7 @@ class SurveySection < ActiveRecord::Base
95
95
 
96
96
  # build and set context
97
97
  title = args[0]
98
- context[:survey_section] = context[:survey].sections.build({ :title => title,
99
- :data_export_identifier => Surveyor::Common.normalize(title)}.merge(args[1] || {}))
98
+ context[:survey_section] = context[:survey].sections.build({ :title => title }.merge(args[1] || {}))
100
99
  end
101
100
  def clear(context)
102
101
  context.delete_if{|k,v| k != :survey && k != :question_references && k != :answer_references}
@@ -133,9 +132,7 @@ class Question < ActiveRecord::Base
133
132
  :question_group => context[:question_group],
134
133
  :reference_identifier => reference_identifier,
135
134
  :text => text,
136
- :short_text => text,
137
- :display_type => (original_method =~ /label|image/ ? original_method : "default"),
138
- :data_export_identifier => Surveyor::Common.normalize(text)}.merge(args[1] || {}))
135
+ :display_type => (original_method =~ /label|image/ ? original_method : "default")}.merge(args[1] || {}))
139
136
 
140
137
  # keep reference for dependencies
141
138
  context[:question_references][reference_identifier] = context[:question] unless reference_identifier.blank?
@@ -196,12 +193,9 @@ class Answer < ActiveRecord::Base
196
193
 
197
194
  def self.parse_and_build(context, args, original_method, reference_identifier)
198
195
  # clear context
199
- context.delete_if{|k,v| %w(answer validation validation_condition).map(&:to_sym).include? k}
196
+ context.delete_if{|k,v| %w(answer validation validation_condition reference_identifier).map(&:to_sym).include? k}
200
197
 
201
- attrs = { :reference_identifier => reference_identifier,
202
- :is_exclusive => false,
203
- :hide_label => false,
204
- :response_class => "answer"}.merge(self.parse_args(args))
198
+ attrs = { :reference_identifier => reference_identifier}.merge(self.parse_args(args))
205
199
 
206
200
  # add answers to grid
207
201
  if context[:question_group] && context[:question_group].display_type == "grid"
@@ -227,7 +221,7 @@ class Answer < ActiveRecord::Base
227
221
  end
228
222
  end
229
223
  def self.text_args(text = "Answer")
230
- {:text => text.to_s, :short_text => text, :data_export_identifier => Surveyor::Common.normalize(text)}
224
+ {:text => text.to_s}
231
225
  end
232
226
  def self.hash_from(arg)
233
227
  arg.is_a?(Symbol) ? {:response_class => arg.to_s} : arg.is_a?(Hash) ? arg : {}
@@ -0,0 +1,146 @@
1
+ module Surveyor
2
+ class Unparser
3
+ # Class methods
4
+ def self.unparse(survey)
5
+ survey.unparse(dsl = "")
6
+ dsl
7
+ end
8
+ end
9
+ end
10
+
11
+ # Surveyor models with extra parsing methods
12
+ class Survey < ActiveRecord::Base
13
+ # block
14
+ include Surveyor::Models::SurveyMethods
15
+ def unparse(dsl)
16
+ attrs = (self.attributes.diff Survey.new(:title => title).attributes).delete_if{|k,v| %w(created_at updated_at inactive_at id title access_code).include? k}.symbolize_keys!
17
+ dsl << "survey \"#{title}\""
18
+ dsl << (attrs.blank? ? " do\n" : ", #{attrs.inspect.gsub(/\{|\}/, "")} do\n")
19
+ sections.each{|section| section.unparse(dsl)}
20
+ dsl << "end\n"
21
+ end
22
+ end
23
+ class SurveySection < ActiveRecord::Base
24
+ # block
25
+ include Surveyor::Models::SurveySectionMethods
26
+ def unparse(dsl)
27
+ attrs = (self.attributes.diff SurveySection.new(:title => title).attributes).delete_if{|k,v| %w(created_at updated_at id survey_id).include? k}.symbolize_keys!
28
+ group_questions = []
29
+ dsl << " section \"#{title}\""
30
+ dsl << (attrs.blank? ? " do\n" : ", #{attrs.inspect.gsub(/\{|\}/, "")} do\n")
31
+ questions.each_with_index do |question, index|
32
+ if question.solo?
33
+ question.unparse(dsl)
34
+ else # gather up the group questions
35
+ group_questions << question
36
+ if (index + 1 >= questions.size) or (question.question_group != questions[index + 1].question_group)
37
+ # this is the last question of the section, or the group
38
+ question.question_group.unparse(dsl)
39
+ end
40
+ group_questions = []
41
+ end
42
+ end
43
+ dsl << " end\n"
44
+ end
45
+ end
46
+ class QuestionGroup < ActiveRecord::Base
47
+ # block
48
+ include Surveyor::Models::QuestionGroupMethods
49
+ def unparse(dsl)
50
+ attrs = (self.attributes.diff QuestionGroup.new(:text => text).attributes).delete_if{|k,v| %w(created_at updated_at id).include?(k) or (k == "display_type" && %w(grid repeater default).include?(v))}.symbolize_keys!
51
+ method = (%w(grid repeater).include?(display_type) ? display_type : "group")
52
+ dsl << "\n"
53
+ dsl << " #{method} \"#{text}\""
54
+ dsl << (attrs.blank? ? " do\n" : ", #{attrs.inspect.gsub(/\{|\}/, "")} do\n")
55
+ questions.first.answers.each{|answer| answer.unparse(dsl)} if display_type == "grid"
56
+ questions.each{|question| question.unparse(dsl)}
57
+ dsl << " end\n"
58
+ end
59
+ end
60
+ class Question < ActiveRecord::Base
61
+ # nonblock
62
+ include Surveyor::Models::QuestionMethods
63
+ def unparse(dsl)
64
+ attrs = (self.attributes.diff Question.new(:text => text).attributes).delete_if{|k,v| %w(created_at updated_at reference_identifier id survey_section_id question_group_id).include?(k) or (k == "display_type" && v == "label")}.symbolize_keys!
65
+ dsl << (solo? ? "\n" : " ")
66
+ if display_type == "label"
67
+ dsl << " label"
68
+ else
69
+ dsl << " q"
70
+ end
71
+ dsl << "_#{reference_identifier}" unless reference_identifier.blank?
72
+ dsl << " \"#{text}\""
73
+ dsl << (attrs.blank? ? "\n" : ", #{attrs.inspect.gsub(/\{|\}/, "")}\n")
74
+ if solo? or question_group.display_type != "grid"
75
+ answers.each{|answer| answer.unparse(dsl)}
76
+ end
77
+ dependency.unparse(dsl) if dependency
78
+ end
79
+ end
80
+ class Dependency < ActiveRecord::Base
81
+ # nonblock
82
+ include Surveyor::Models::DependencyMethods
83
+ def unparse(dsl)
84
+ attrs = (self.attributes.diff Dependency.new.attributes).delete_if{|k,v| %w(created_at updated_at id question_id).include?(k) }.symbolize_keys!
85
+ dsl << " " if question.part_of_group?
86
+ dsl << " dependency"
87
+ dsl << (attrs.blank? ? "\n" : " #{attrs.inspect.gsub(/\{|\}/, "")}\n")
88
+ dependency_conditions.each{|dependency_condition| dependency_condition.unparse(dsl)}
89
+ end
90
+ end
91
+ class DependencyCondition < ActiveRecord::Base
92
+ # nonblock
93
+ include Surveyor::Models::DependencyConditionMethods
94
+ def unparse(dsl)
95
+ attrs = (self.attributes.diff Dependency.new.attributes).delete_if{|k,v| %w(created_at updated_at question_id question_group_id rule_key rule operator id dependency_id answer_id).include? k}.symbolize_keys!
96
+ dsl << " " if dependency.question.part_of_group?
97
+ dsl << " condition"
98
+ dsl << "_#{rule_key}" unless rule_key.blank?
99
+ dsl << " :q_#{question.reference_identifier}, \"#{operator}\""
100
+ dsl << (attrs.blank? ? ", {:answer_reference=>\"#{answer.reference_identifier}\"}\n" : ", {#{attrs.inspect.gsub(/\{|\}/, "")}, :answer_reference=>\"#{answer.reference_identifier}\"}\n")
101
+ end
102
+ end
103
+ class Answer < ActiveRecord::Base
104
+ # nonblock
105
+ include Surveyor::Models::AnswerMethods
106
+ def unparse(dsl)
107
+ attrs = (self.attributes.diff Answer.new(:text => text).attributes).delete_if{|k,v| %w(created_at updated_at reference_identifier response_class id question_id).include? k}.symbolize_keys!
108
+ attrs.delete(:is_exclusive) if text == "Omit" && is_exclusive == true
109
+ attrs.merge!({:is_exclusive => false}) if text == "Omit" && is_exclusive == false
110
+ dsl << " " if question.part_of_group?
111
+ dsl << " a"
112
+ dsl << "_#{reference_identifier}" unless reference_identifier.blank?
113
+ if response_class.to_s.titlecase == text && attrs == {:hide_label => true}
114
+ dsl << " :#{response_class}"
115
+ else
116
+ dsl << [ text.blank? ? nil : text == "Other" ? " :other" : text == "Omit" ? " :omit" : " \"#{text}\"",
117
+ (response_class.blank? or response_class == "answer") ? nil : " #{response_class.to_sym.inspect}",
118
+ attrs.blank? ? nil : " #{attrs.inspect.gsub(/\{|\}/, "")}\n"].compact.join(",")
119
+ end
120
+ dsl << "\n"
121
+ validations.each{|validation| validation.unparse(dsl)}
122
+ end
123
+ end
124
+ class Validation < ActiveRecord::Base
125
+ # nonblock
126
+ include Surveyor::Models::ValidationMethods
127
+ def unparse(dsl)
128
+ attrs = (self.attributes.diff Validation.new.attributes).delete_if{|k,v| %w(created_at updated_at id answer_id).include?(k) }.symbolize_keys!
129
+ dsl << " " if answer.question.part_of_group?
130
+ dsl << " validation"
131
+ dsl << (attrs.blank? ? "\n" : " #{attrs.inspect.gsub(/\{|\}/, "")}\n")
132
+ validation_conditions.each{|validation_condition| validation_condition.unparse(dsl)}
133
+ end
134
+ end
135
+ class ValidationCondition < ActiveRecord::Base
136
+ # nonblock
137
+ include Surveyor::Models::ValidationConditionMethods
138
+ def unparse(dsl)
139
+ attrs = (self.attributes.diff ValidationCondition.new.attributes).delete_if{|k,v| %w(created_at updated_at operator rule_key id validation_id).include? k}.symbolize_keys!
140
+ dsl << " " if validation.answer.question.part_of_group?
141
+ dsl << " condition"
142
+ dsl << "_#{rule_key}" unless rule_key.blank?
143
+ dsl << " \"#{operator}\""
144
+ dsl << (attrs.blank? ? "\n" : ", #{attrs.inspect.gsub(/\{|\}/, "")}\n")
145
+ end
146
+ end
@@ -10,6 +10,27 @@ namespace :surveyor do
10
10
  Surveyor::Parser.parse File.read(file)
11
11
  puts "--- Done #{file} ---"
12
12
  end
13
+ desc "generate a surveyor DSL file from a survey"
14
+ task :unparse => :environment do
15
+ surveys = Survey.all
16
+ if surveys
17
+ puts "The following surveys are available"
18
+ surveys.each do |survey|
19
+ puts "#{survey.id} #{survey.title}"
20
+ end
21
+ print "Which survey would you like to unparse? "
22
+ id = $stdin.gets.to_i
23
+ if survey_to_unparse = surveys.detect{|s| s.id == id}
24
+ filename = "surveys/#{survey_to_unparse.access_code}_#{Date.today.to_s(:db)}.rb"
25
+ puts "unparsing #{survey_to_unparse.title} to #{filename}"
26
+ File.open(filename, 'w') {|f| f.write(Surveyor::Unparser.unparse(survey_to_unparse))}
27
+ else
28
+ puts "not found"
29
+ end
30
+ else
31
+ puts "There are no surveys available"
32
+ end
33
+ end
13
34
  desc "remove surveys (that don't have response sets)"
14
35
  task :remove => :environment do
15
36
  surveys = Survey.all.delete_if{|s| !s.response_sets.blank?}
@@ -18,7 +39,7 @@ namespace :surveyor do
18
39
  surveys.each do |survey|
19
40
  puts "#{survey.id} #{survey.title}"
20
41
  end
21
- puts "Which survey would you like to remove?"
42
+ print "Which survey would you like to remove? "
22
43
  id = $stdin.gets.to_i
23
44
  if survey_to_delete = surveys.detect{|s| s.id == id}
24
45
  puts "removing #{survey_to_delete.title}"
@@ -27,7 +48,7 @@ namespace :surveyor do
27
48
  put "not found"
28
49
  end
29
50
  else
30
- puts "There are no surveys surveys without response sets"
51
+ puts "There are no surveys without response sets"
31
52
  end
32
53
  end
33
54
  end
@@ -0,0 +1,126 @@
1
+ require File.expand_path(File.dirname(__FILE__) + '/../spec_helper')
2
+
3
+ describe Surveyor::Unparser do
4
+ before(:each) do
5
+ @survey = Survey.new(:title => "Simple survey", :description => "very simple")
6
+ @section = @survey.sections.build(:title => "Simple section")
7
+ end
8
+
9
+ it "should unparse a basic survey, section, and question" do
10
+ q1 = @section.questions.build(:text => "What is your favorite color?", :reference_identifier => 1, :pick => :one)
11
+ a11 = q1.answers.build(:text => "red", :response_class => "answer", :reference_identifier => 1, :question => q1)
12
+ a12 = q1.answers.build(:text => "green", :response_class => "answer", :reference_identifier => 2, :question => q1)
13
+ a13 = q1.answers.build(:text => "blue", :response_class => "answer", :reference_identifier => 3, :question => q1)
14
+ a14 = q1.answers.build(:text => "Other", :response_class => "string", :reference_identifier => 4, :question => q1)
15
+ a15 = q1.answers.build(:text => "Omit", :reference_identifier => 5, :question => q1, :is_exclusive => true)
16
+ q2 = @section.questions.build(:text => "What is your name?", :reference_identifier => 2, :pick => :none)
17
+ a21 = q2.answers.build(:response_class => "string", :reference_identifier => 1, :question => q2)
18
+ Surveyor::Unparser.unparse(@survey).should ==
19
+ <<-dsl
20
+ survey "Simple survey", :description=>"very simple" do
21
+ section "Simple section" do
22
+
23
+ q_1 "What is your favorite color?", :pick=>"one"
24
+ a_1 "red"
25
+ a_2 "green"
26
+ a_3 "blue"
27
+ a_4 :other, :string
28
+ a_5 :omit
29
+
30
+ q_2 "What is your name?"
31
+ a_1 :string
32
+ end
33
+ end
34
+ dsl
35
+ end
36
+
37
+ it "should unparse groups" do
38
+ q3 = @section.questions.build(:text => "Happy?")
39
+ a31 = q3.answers.build(:text => "Yes", :question => q3)
40
+ a32 = q3.answers.build(:text => "Maybe", :question => q3)
41
+ a33 = q3.answers.build(:text => "No", :question => q3)
42
+
43
+ q4 = @section.questions.build(:text => "Energized?")
44
+ a41 = q4.answers.build(:text => "Yes", :question => q4)
45
+ a42 = q4.answers.build(:text => "Maybe", :question => q4)
46
+ a43 = q4.answers.build(:text => "No", :question => q4)
47
+
48
+ g1 = q3.build_question_group(:text => "How are you feeling?", :display_type => "grid")
49
+ q4.question_group = g1
50
+ g1.questions = [q3, q4]
51
+
52
+ q5 = @section.questions.build(:text => "Model")
53
+ a51 = q5.answers.build(:response_class => "string", :question => q3)
54
+
55
+ g2 = q5.build_question_group(:text => "Tell us about the cars you own", :display_type => "repeater")
56
+ g2.questions = [q5]
57
+
58
+ Surveyor::Unparser.unparse(@survey).should ==
59
+ <<-dsl
60
+ survey "Simple survey", :description=>"very simple" do
61
+ section "Simple section" do
62
+
63
+ grid "How are you feeling?" do
64
+ a "Yes"
65
+ a "Maybe"
66
+ a "No"
67
+ q "Happy?"
68
+ q "Energized?"
69
+ end
70
+
71
+ repeater "Tell us about the cars you own" do
72
+ q "Model"
73
+ a :string
74
+ end
75
+ end
76
+ end
77
+ dsl
78
+ end
79
+
80
+ it "should unparse a basic survey, section, and question" do
81
+ q6 = @section.questions.build(:text => "What... is your name? (e.g. It is 'Arthur', King of the Britons)", :reference_identifier => "montypython3")
82
+ a61 = q6.answers.build(:response_class => "string", :reference_identifier => 1, :question => q6)
83
+
84
+ q7 = @section.questions.build(:text => "What... is your quest? (e.g. To seek the Holy Grail)", :display_type => "label")
85
+ d1 = q7.build_dependency(:rule => "A", :question => q7)
86
+ dc1 = d1.dependency_conditions.build(:dependency => d1, :question => q6, :answer => a61, :operator => "==", :string_value => "It is 'Arthur', King of the Britons", :rule_key => "A")
87
+
88
+ q8 = @section.questions.build(:text => "How many pets do you own?")
89
+ a81 = q8.answers.build(:response_class => "integer", :question => q8)
90
+ v1 = a81.validations.build(:rule => "A", :answer => a81)
91
+ vc1 = v1.validation_conditions.build(:operator => ">=", :integer_value => 0, :validation => v1, :rule_key => "A")
92
+
93
+ q9 = @section.questions.build(:text => "Pick your favorite date AND time", :custom_renderer => "/partials/custom_question")
94
+ a91 = q9.answers.build(:response_class => "datetime", :question => q9)
95
+
96
+ q10 = @section.questions.build(:text => "What time do you usually take a lunch break?", :reference_identifier => "time_lunch")
97
+ a101 = q10.answers.build(:response_class => "time", :reference_identifier => 1, :question => q10)
98
+
99
+ Surveyor::Unparser.unparse(@survey).should ==
100
+ <<-dsl
101
+ survey "Simple survey", :description=>"very simple" do
102
+ section "Simple section" do
103
+
104
+ q_montypython3 "What... is your name? (e.g. It is 'Arthur', King of the Britons)"
105
+ a_1 :string
106
+
107
+ label "What... is your quest? (e.g. To seek the Holy Grail)"
108
+ dependency :rule=>"A"
109
+ condition_A :q_montypython3, "==", {:string_value=>"It is 'Arthur', King of the Britons", :answer_reference=>"1"}
110
+
111
+ q "How many pets do you own?"
112
+ a :integer
113
+ validation :rule=>"A"
114
+ condition_A ">=", :integer_value=>0
115
+
116
+ q "Pick your favorite date AND time", :custom_renderer=>"/partials/custom_question"
117
+ a :datetime
118
+
119
+ q_time_lunch "What time do you usually take a lunch break?"
120
+ a_1 :time
121
+ end
122
+ end
123
+ dsl
124
+ end
125
+ end
126
+
@@ -59,6 +59,14 @@ describe Question, "when interacting with an instance" do
59
59
  @question.renderer.should == :default
60
60
  end
61
61
 
62
+ it "should let you know if it is part of a group" do
63
+ @question.question_group = Factory(:question_group)
64
+ @question.solo?.should be_false
65
+ @question.part_of_group?.should be_true
66
+ @question.question_group = nil
67
+ @question.solo?.should be_true
68
+ @question.part_of_group?.should be_false
69
+ end
62
70
  end
63
71
 
64
72
  describe Question, "with dependencies" do
data/surveyor.gemspec CHANGED
@@ -5,7 +5,7 @@
5
5
 
6
6
  Gem::Specification.new do |s|
7
7
  s.name = %q{surveyor}
8
- s.version = "0.15.0"
8
+ s.version = "0.16.0"
9
9
 
10
10
  s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
11
11
  s.authors = ["Brian Chamberlain", "Mark Yoon"]
@@ -154,12 +154,14 @@ Gem::Specification.new do |s|
154
154
  "lib/surveyor/models/validation_methods.rb",
155
155
  "lib/surveyor/parser.rb",
156
156
  "lib/surveyor/surveyor_controller_methods.rb",
157
+ "lib/surveyor/unparser.rb",
157
158
  "lib/tasks/surveyor_tasks.rake",
158
159
  "rails/init.rb",
159
160
  "spec/controllers/surveyor_controller_spec.rb",
160
161
  "spec/factories.rb",
161
162
  "spec/lib/common_spec.rb",
162
163
  "spec/lib/parser_spec.rb",
164
+ "spec/lib/unparser_spec.rb",
163
165
  "spec/models/answer_spec.rb",
164
166
  "spec/models/dependency_condition_spec.rb",
165
167
  "spec/models/dependency_spec.rb",
@@ -188,6 +190,7 @@ Gem::Specification.new do |s|
188
190
  "spec/factories.rb",
189
191
  "spec/lib/common_spec.rb",
190
192
  "spec/lib/parser_spec.rb",
193
+ "spec/lib/unparser_spec.rb",
191
194
  "spec/models/answer_spec.rb",
192
195
  "spec/models/dependency_condition_spec.rb",
193
196
  "spec/models/dependency_spec.rb",
metadata CHANGED
@@ -1,13 +1,13 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: surveyor
3
3
  version: !ruby/object:Gem::Version
4
- hash: 35
4
+ hash: 95
5
5
  prerelease: false
6
6
  segments:
7
7
  - 0
8
- - 15
8
+ - 16
9
9
  - 0
10
- version: 0.15.0
10
+ version: 0.16.0
11
11
  platform: ruby
12
12
  authors:
13
13
  - Brian Chamberlain
@@ -195,12 +195,14 @@ files:
195
195
  - lib/surveyor/models/validation_methods.rb
196
196
  - lib/surveyor/parser.rb
197
197
  - lib/surveyor/surveyor_controller_methods.rb
198
+ - lib/surveyor/unparser.rb
198
199
  - lib/tasks/surveyor_tasks.rake
199
200
  - rails/init.rb
200
201
  - spec/controllers/surveyor_controller_spec.rb
201
202
  - spec/factories.rb
202
203
  - spec/lib/common_spec.rb
203
204
  - spec/lib/parser_spec.rb
205
+ - spec/lib/unparser_spec.rb
204
206
  - spec/models/answer_spec.rb
205
207
  - spec/models/dependency_condition_spec.rb
206
208
  - spec/models/dependency_spec.rb
@@ -257,6 +259,7 @@ test_files:
257
259
  - spec/factories.rb
258
260
  - spec/lib/common_spec.rb
259
261
  - spec/lib/parser_spec.rb
262
+ - spec/lib/unparser_spec.rb
260
263
  - spec/models/answer_spec.rb
261
264
  - spec/models/dependency_condition_spec.rb
262
265
  - spec/models/dependency_spec.rb