surveyor 0.13.0 → 0.14.0

Sign up to get free protection for your applications and to get access to all the features.
data/README.md CHANGED
@@ -59,19 +59,19 @@ As a plugin:
59
59
 
60
60
  gem install haml
61
61
  gem install fastercsv
62
- script/plugin install git://github.com/breakpointer/surveyor.git -r 'tag v0.13.0'
62
+ script/plugin install git://github.com/breakpointer/surveyor.git -r 'tag v0.14.0'
63
63
 
64
64
  Or as a gem:
65
65
 
66
66
  # in environment.rb
67
- config.gem "surveyor", :version => '~> 0.13.0', :source => 'http://gemcutter.org'
67
+ config.gem "surveyor", :version => '~> 0.14.0', :source => 'http://gemcutter.org'
68
68
 
69
69
  rake gems:install
70
70
 
71
71
  Or as a gem (with bundler):
72
72
 
73
73
  # in environment.rb
74
- gem "surveyor", '~> 0.13.0'
74
+ gem "surveyor", '~> 0.14.0'
75
75
 
76
76
  bundle install
77
77
 
@@ -114,6 +114,16 @@ To work on the plugin code (for enhancements, and bug fixes, etc...) fork this g
114
114
 
115
115
  # Changes
116
116
 
117
+ 0.14.0
118
+
119
+ * view my survey specs fixed, fragment caching for surveyor#edit, localization. thanks bnadav
120
+
121
+ 0.13.0
122
+
123
+ * simpler customization of surveyor.
124
+ * spec plugins task
125
+ * Feature instead of Story for cucumber. http://wiki.github.com/aslakhellesoy/cucumber/upgrading
126
+
117
127
  0.12.0
118
128
 
119
129
  * fix parser error in ruby 1.9, where instance_variables are symbols. closes #61
data/VERSION CHANGED
@@ -1 +1 @@
1
- 0.13.0
1
+ 0.14.0
@@ -1,5 +1,5 @@
1
1
  module SurveyorHelper
2
-
2
+
3
3
  # Layout: stylsheets and javascripts
4
4
  def surveyor_includes
5
5
  surveyor_stylsheets + surveyor_javascripts
@@ -25,14 +25,14 @@ module SurveyorHelper
25
25
  submit_tag(section.title, :name => "section[#{section.id}]")
26
26
  end
27
27
  def previous_section
28
- # submit_tag("« Previous section", :name => "section[#{@section.previous.id}]") unless @section.previous.nil?
28
+ # submit_tag("#{t ('surveyor.previous_section')} »", :name => "section[#{@section.previous.id}]") unless @section.previous.nil?
29
29
  # refactored to use copy in memory instead of making extra db calls
30
- submit_tag("« Previous section", :name => "section[#{@sections[@sections.index(@section)-1].id}]") unless @sections.first == @section
30
+ submit_tag(t('surveyor.previous_section'), :name => "section[#{@sections[@sections.index(@section)-1].id}]") unless @sections.first == @section
31
31
  end
32
32
  def next_section
33
- # @section.next.nil? ? submit_tag("Click here to finish", :name => "finish") : submit_tag("Next section »", :name => "section[#{@section.next.id}]")
33
+ # @section.next.nil? ? submit_tag(t ('surveyor.click_here_to_finish'), :name => "finish") : submit_tag("Next section «", :name => "section[#{@section.next.id}]")
34
34
  # refactored to use copy in memory instead of making extra db calls
35
- @sections.last == @section ? submit_tag("Click here to finish", :name => "finish") : submit_tag("Next section »", :name => "section[#{@sections[@sections.index(@section)+1].id}]")
35
+ @sections.last == @section ? submit_tag(t('surveyor.click_here_to_finish'), :name => "finish") : submit_tag(t('surveyor.next_section'), :name => "section[#{@sections[@sections.index(@section)+1].id}]")
36
36
  end
37
37
 
38
38
  # Questions
@@ -66,14 +66,14 @@ class ResponseSet < ActiveRecord::Base
66
66
  if (answer_id = responses_hash[:answer_id])
67
67
  if (!responses_hash[:answer_id].empty?) # Dropdowns return answer id but have an empty value if they are not set... ignoring those.
68
68
  #radio or dropdown - only one response
69
- responses.build({:question_id => question_id, :answer_id => answer_id}.merge(responses_hash[answer_id] || {}))
69
+ responses.build({:question_id => question_id, :answer_id => answer_id, :survey_section_id => current_section_id}.merge(responses_hash[answer_id] || {}))
70
70
  end
71
71
  else
72
72
  #possibly multiples responses - unresponded radios end up here too
73
73
  # we use the variable question_id, not the "question_id" in the response_hash
74
74
  responses_hash.delete_if{|k,v| k == "question_id"}.each do |answer_id, response_hash|
75
75
  unless response_hash.delete_if{|k,v| v.blank?}.empty?
76
- responses.build({:question_id => question_id, :answer_id => answer_id}.merge(response_hash))
76
+ responses.build({:question_id => question_id, :answer_id => answer_id, :survey_section_id => current_section_id}.merge(response_hash))
77
77
  end
78
78
  end
79
79
  end
@@ -87,14 +87,14 @@ class ResponseSet < ActiveRecord::Base
87
87
  if (answer_id = group_hash[:answer_id]) # if group_hash has an answer_id key we treat it differently
88
88
  if (!group_hash[:answer_id].empty?) # dropdowns return empty values in answer_ids if they are not selected
89
89
  #radio or dropdown - only one response
90
- responses.build({:question_id => question_id, :answer_id => answer_id, :response_group => response_group_number}.merge(group_hash[answer_id] || {}))
90
+ responses.build({:question_id => question_id, :answer_id => answer_id, :response_group => response_group_number, :section_id => current_section_id}.merge(group_hash[answer_id] || {}))
91
91
  end
92
92
  else
93
93
  #possibly multiples responses - unresponded radios end up here too
94
94
  # we use the variable question_id in the key, not the "question_id" in the response_hash... same with response_group key
95
95
  group_hash.delete_if{|k,v| (k == "question_id") or (k == "response_group")}.each do |answer_id, inner_hash|
96
96
  unless inner_hash.delete_if{|k,v| v.blank?}.empty?
97
- responses.build({:question_id => question_id, :answer_id => answer_id, :response_group => response_group_number}.merge(inner_hash))
97
+ responses.build({:question_id => question_id, :answer_id => answer_id, :response_group => response_group_number, :section_id => current_section_id}.merge(inner_hash))
98
98
  end
99
99
  end
100
100
  end
@@ -153,7 +153,12 @@ class ResponseSet < ActiveRecord::Base
153
153
  arr = dependencies.partition{|d| d.is_met?(self) }
154
154
  {:show => arr[0].map{|d| d.question_group_id.nil? ? "question_#{d.question_id}" : "question_group_#{d.question_group_id}"}, :hide => arr[1].map{|d| d.question_group_id.nil? ? "question_#{d.question_id}" : "question_group_#{d.question_group_id}"}}
155
155
  end
156
-
156
+
157
+ # Check existence of responses to questions from a given survey_section
158
+ def no_responses_for_section?(section)
159
+ self.responses.count(:conditions => {:survey_section_id => section.id}) == 0
160
+ end
161
+
157
162
  protected
158
163
 
159
164
  def dependencies(question_ids = nil)
@@ -0,0 +1,15 @@
1
+ class SurveySectionSweeper < ActionController::Caching::Sweeper
2
+ observer SurveySection
3
+
4
+ def after_save(section)
5
+ expire_cache(section)
6
+ end
7
+
8
+ def after_destroy(section)
9
+ expire_cache(section)
10
+ end
11
+
12
+ def expire_cache(section)
13
+ expire_fregment "section_#{section.id}"
14
+ end
15
+ end
@@ -19,7 +19,7 @@
19
19
  %ol.answers
20
20
  %li.answer
21
21
  - options = question.answers.collect{|a| "<option #{ (response_set.response_for(question.id, a.id).selected?)? "selected='selected'" : nil } value ='#{a.id}'>#{a.text}</option>" }
22
- = renderer == :slider ? select_tag("responses[#{question.id}][answer_id]", options, {:id => "slider_#{question.id}"}) : select_tag("responses[#{question.id}][answer_id]", ["<option value=''>Select one...</option>"].concat(options))
22
+ = renderer == :slider ? select_tag("responses[#{question.id}][answer_id]", options, {:id => "slider_#{question.id}"}) : select_tag("responses[#{question.id}][answer_id]", ["<option value=''>#{t('surveyor.Select_one')}</option>"].concat(options))
23
23
  - when :grid_default
24
24
  - reset_cycle("col")
25
25
  - content_tag_for :tr, question, :class => question.css_class(response_set) do
@@ -69,4 +69,4 @@
69
69
  %ol.answers{:class => renderer == :inline ? "inline" : nil}
70
70
  - question.answers.each do |answer|
71
71
  - content_tag_for :li, answer, :class => answer.custom_class do
72
- = render(:partial => answer.custom_renderer || "/partials/answer", :locals => {:answer => answer, :question => question, :response_obj => @response_set.response_for(question.id, answer.id), :hide_label => answer.hide_label})
72
+ = render(:partial => answer.custom_renderer || "/partials/answer", :locals => {:answer => answer, :question => question, :response_obj => @response_set.response_for(question.id, answer.id), :hide_label => answer.hide_label})
@@ -0,0 +1,13 @@
1
+ - div_for @section, :class => @section.custom_class do
2
+ %span.title= @section.title
3
+ .questions
4
+ - group_questions ||= []
5
+ - @questions.each_with_index do |question, index|
6
+ - unless question.part_of_group?
7
+ = render(:partial => question.custom_renderer || "/partials/question", :locals => {:question => question, :response_set => @response_set})
8
+ - else # gather up the group questions
9
+ - group_questions << question
10
+ - if (index + 1 >= @questions.size) or (question.question_group_id != @questions[index + 1].question_group_id)
11
+ - # this is the last question of the section, or the group
12
+ = render(:partial => question.question_group.custom_renderer || "/partials/question_group", :locals => {:question_group => question.question_group, :response_set => @response_set, :group_questions => group_questions})
13
+ - group_questions = []
@@ -16,18 +16,13 @@
16
16
  -# @dependents.each_with_index do |question, index|
17
17
  = dependency_explanation_helper(question, @response_set)
18
18
  = render(:partial => question.custom_renderer || "/partials/question", :locals => {:question => question, :response_set => @response_set, :number => "D#{index+1}"})
19
- - div_for @section, :class => @section.custom_class do
20
- %span.title= @section.title
21
- .questions
22
- - group_questions ||= []
23
- - @questions.each_with_index do |question, index|
24
- - unless question.part_of_group?
25
- = render(:partial => question.custom_renderer || "/partials/question", :locals => {:question => question, :response_set => @response_set})
26
- - else # gather up the group questions
27
- - group_questions << question
28
- - if (index + 1 >= @questions.size) or (question.question_group_id != @questions[index + 1].question_group_id)
29
- - # this is the last question of the section, or the group
30
- = render(:partial => question.question_group.custom_renderer || "/partials/question_group", :locals => {:question_group => question.question_group, :response_set => @response_set, :group_questions => group_questions})
31
- - group_questions = []
19
+ -# cache section if there are no responses for that section in th current response_set
20
+ - if @response_set.no_responses_for_section?(@section)
21
+ - cache("section_#{@section.id}") do
22
+ -# cache
23
+ = render(:partial => "/partials/section", :locals => {:section => @section, :questions => @questions, :response_set => @response_set})
24
+ - else
25
+ -# no cache
26
+ = render(:partial => "/partials/section", :locals => {:section => @section, :questions => @questions, :response_set => @response_set})
32
27
  .next_section= next_section
33
-
28
+
@@ -1,6 +1,6 @@
1
1
  #surveyor
2
2
  #header
3
- .title= @title
3
+ .title= t ('surveyor.take_these_surveys')
4
4
  %br
5
5
  #survey_list
6
6
  %ul
@@ -10,7 +10,7 @@
10
10
  - form_tag(take_survey_path(:survey_code => survey.access_code)) do
11
11
  = survey.title
12
12
  &nbsp;
13
- = submit_tag("Take it" )
13
+ = submit_tag( t ('surveyor.take_it') )
14
14
  - else
15
15
  %li
16
- No surveys
16
+ No surveys
@@ -3,10 +3,13 @@
3
3
  - div_for section do
4
4
  .title= section.title
5
5
  .questions
6
- - @section.questions.each_with_index do |question, index|
6
+ - group_questions ||= []
7
+ - section.questions.each_with_index do |question, index|
7
8
  - if question.part_of_group?
8
- - if (index + 1 >= @section.questions.size) or (question.question_group_id != @section.questions[index + 1].question_group_id)
9
+ - group_questions << question
10
+ - if (index + 1 >= section.questions.size) or (question.question_group_id != section.questions[index + 1].question_group_id)
9
11
  - # skip to the last question of the section, or the last question of the group
10
- = render(:partial => "/partials/question_group", :locals => {:question_group => question.question_group, :response_set => @response_set})
12
+ = render(:partial => "/partials/question_group", :locals => {:question_group => question.question_group, :response_set => @response_set, :group_questions => group_questions})
13
+ - group_questions = []
11
14
  - else
12
15
  = render(:partial => "/partials/question", :locals => {:question => question, :response_set => @response_set})
@@ -1,4 +1,4 @@
1
- Feature: Logging in
1
+ Story: Logging in
2
2
  As an anonymous user with an account
3
3
  I want to log in to my account
4
4
  So that I can be myself
@@ -0,0 +1,24 @@
1
+ module SurveyExtensions
2
+ def self.included(base)
3
+ base.extend(ClassMethods)
4
+ base.send(:include, InstanceMethods)
5
+ base.class_eval do
6
+ # Same as typing in the class
7
+
8
+ end
9
+ end
10
+
11
+ module ClassMethods
12
+ end
13
+
14
+ module InstanceMethods
15
+ # def title
16
+ # foo
17
+ # end
18
+ # def foo
19
+ # "bar"
20
+ # end
21
+ end
22
+ end
23
+
24
+ # Add "survey" to config['extend'] array in config/initializers/surveyor.rb to activate these extensions
@@ -0,0 +1,28 @@
1
+ module SurveyorControllerExtensions
2
+ def self.included(base)
3
+ base.extend(ClassMethods)
4
+ base.send(:include, InstanceMethods)
5
+ base.class_eval do
6
+ # Same as typing in the class
7
+ # before_filter :pimp_my_ride
8
+ end
9
+ end
10
+
11
+ module ClassMethods
12
+ end
13
+
14
+ module InstanceMethods
15
+ # def pimp_my_ride
16
+ # flash[:notice] = "pimped!"
17
+ # end
18
+ end
19
+
20
+ module Actions
21
+ # Redefine the controller actions [index, new, create, show, update] here
22
+ # def new
23
+ # render :text =>"surveys are down"
24
+ # end
25
+ end
26
+ end
27
+
28
+ # Add "surveyor_controller" to config['extend'] array in config/initializers/surveyor.rb to activate these extensions
@@ -10,4 +10,4 @@
10
10
  <div id="flash"><%= flash[:notice] %></div>
11
11
  <%= yield %>
12
12
  </body>
13
- </html>
13
+ </html>
@@ -0,0 +1,17 @@
1
+ module SurveyorHelperExtensions
2
+ def self.included(base) # :nodoc:
3
+ base.send(:include, InstanceMethods)
4
+ base.class_eval do
5
+ # Same as typing in the module
6
+ # alias_method_chain :question_number_helper, :sauce
7
+ end
8
+ end
9
+
10
+ module InstanceMethods
11
+ # def question_number_helper_with_sauce(number)
12
+ # question_number_helper_without_sauce(number) + "Extra sauce"
13
+ # end
14
+ end
15
+ end
16
+
17
+ # Add "surveyor_helper" to config['extend'] array in config/initializers/surveyor.rb to activate these extensions
@@ -26,7 +26,8 @@ class SurveyorGenerator < Rails::Generator::Base
26
26
  "create_dependencies", "create_dependency_conditions",
27
27
  "create_validations", "create_validation_conditions",
28
28
  "add_display_order_to_surveys", "add_correct_answer_id_to_questions",
29
- "add_index_to_response_sets", "add_index_to_surveys", "add_unique_indicies"].each_with_index do |model, i|
29
+ "add_index_to_response_sets", "add_index_to_surveys",
30
+ "add_unique_indicies", "add_section_id_to_responses"].each_with_index do |model, i|
30
31
  unless (prev_migrations = Dir.glob("db/migrate/[0-9]*_*.rb").grep(/[0-9]+_#{model}.rb$/)).empty?
31
32
  prev_migration_timestamp = prev_migrations[0].match(/([0-9]+)_#{model}.rb$/)[1]
32
33
  end
@@ -44,6 +45,13 @@ class SurveyorGenerator < Rails::Generator::Base
44
45
  m.directory "public/stylesheets/sass"
45
46
  m.file "assets/stylesheets/sass/surveyor.sass", "public/stylesheets/sass/surveyor.sass"
46
47
 
48
+
49
+ # Locales
50
+ m.directory "config/locales"
51
+ Dir.glob(File.join(File.dirname(__FILE__), "templates", "locales", "*.yml")).map{|path| File.basename(path)}.each do |filename|
52
+ m.file "locales/#{filename}", "config/locales/#{filename}"
53
+ end
54
+
47
55
  # Surveys
48
56
  m.directory "surveys/fixtures"
49
57
  m.file "surveys/kitchen_sink_survey.rb", "surveys/kitchen_sink_survey.rb"
@@ -0,0 +1,15 @@
1
+ # Sample localization file for English. Add more files in this directory for other locales.
2
+ # See http://github.com/svenfuchs/rails-i18n/tree/master/rails%2Flocale for starting points.
3
+
4
+ en:
5
+ surveyor:
6
+ take_these_surveys: "You may take these surveys"
7
+ take_it: "Take it"
8
+ Completed_survey: "Completed survey"
9
+ Unable_to_find_your_responses: "Unable to find your responses to the survey"
10
+ Unable to_find_that_survey: "Unable to find that survey"
11
+ survey_started_success: "Survey started successfully"
12
+ click_here_to_finish: "Click here to finish"
13
+ previous_section: "&laquo; Previous section"
14
+ next_section: "Next section &raquo;"
15
+ Select_one: "Select one ..."
@@ -0,0 +1,16 @@
1
+ # Localization file for Hebrew. Add more files in this directory for other locales.
2
+ # See http://github.com/svenfuchs/rails-i18n/tree/master/rails%2Flocale for starting points.
3
+
4
+ he:
5
+ surveyor:
6
+ take_these_surveys: "תוכלו לבצע סקרים אלו"
7
+ take_it: "בצע"
8
+ Completed_survey: "סיום הסקר"
9
+ Unable_to_find_your_responses: "לא נמצאו תשובותיך לסקר"
10
+ Unable to_find_that_survey: "לא ניתן לאתר את הסקר המבוקש"
11
+ survey_started_success: "הסקר הוחל בהצלחה"
12
+ click_here_to_finish: "לסיום"
13
+ previous_section: "חזרה &raquo;"
14
+ next_section: "&laquo; המשך"
15
+ Select_one: "בחר/י"
16
+
@@ -0,0 +1,11 @@
1
+ class AddSectionIdToResponses < ActiveRecord::Migration
2
+ def self.up
3
+ add_column :responses, :survey_section_id, :integer
4
+ add_index :responses, :survey_section_id
5
+ end
6
+
7
+ def self.down
8
+ remove_index :responses, :survey_section_id
9
+ remove_column :responses, :survey_section_id
10
+ end
11
+ end
@@ -4,7 +4,7 @@ module Surveyor
4
4
  base.send :before_filter, :get_current_user, :only => [:new, :create]
5
5
  base.send :layout, 'surveyor_default'
6
6
  end
7
-
7
+
8
8
  # Actions
9
9
  def new
10
10
  @surveys = Survey.find(:all)
@@ -16,10 +16,10 @@ module Surveyor
16
16
  @survey = Survey.find_by_access_code(params[:survey_code])
17
17
  @response_set = ResponseSet.create(:survey => @survey, :user_id => (@current_user.nil? ? @current_user : @current_user.id))
18
18
  if (@survey && @response_set)
19
- flash[:notice] = "Survey was successfully started."
19
+ flash[:notice] = t('surveyor.survey_started_success')
20
20
  redirect_to(edit_my_survey_path(:survey_code => @survey.access_code, :response_set_code => @response_set.access_code))
21
21
  else
22
- flash[:notice] = "Unable to find that survey"
22
+ flash[:notice] = t('surveyor.Unable_to_find_that_survey')
23
23
  redirect_to surveyor_index
24
24
  end
25
25
  end
@@ -27,6 +27,7 @@ module Surveyor
27
27
  def show
28
28
  @response_set = ResponseSet.find_by_access_code(params[:response_set_code], :include => {:responses => [:question, :answer]})
29
29
  if @response_set
30
+ @survey = @response_set.survey
30
31
  respond_to do |format|
31
32
  format.html #{render :action => :show}
32
33
  format.csv {
@@ -34,7 +35,7 @@ module Surveyor
34
35
  }
35
36
  end
36
37
  else
37
- flash[:notice] = "Unable to find your responses to the survey"
38
+ flash[:notice] = t('surveyor.Unable_to_find_your_responses')
38
39
  redirect_to surveyor_index
39
40
  end
40
41
  end
@@ -52,7 +53,7 @@ module Surveyor
52
53
  @questions = @section.questions
53
54
  @dependents = (@response_set.unanswered_dependencies - @section.questions) || []
54
55
  else
55
- flash[:notice] = "Unable to find your responses to the survey"
56
+ flash[:notice] = t('surveyor.Unable_to_find_your_responses')
56
57
  redirect_to surveyor_index
57
58
  end
58
59
  end
@@ -63,7 +64,7 @@ module Surveyor
63
64
  if @response_set = ResponseSet.find_by_access_code(params[:response_set_code], :include => {:responses => :answer},:lock => true)
64
65
  @response_set.current_section_id = params[:current_section_id]
65
66
  else
66
- flash[:notice] = "Unable to find your responses to the survey"
67
+ flash[:notice] = t('surveyor.Unable_to_find_your_responses')
67
68
  redirect_to(available_surveys_path) and return
68
69
  end
69
70
 
@@ -80,10 +81,10 @@ module Surveyor
80
81
  respond_to do |format|
81
82
  format.html do
82
83
  if saved && params[:finish]
83
- flash[:notice] = "Completed survey"
84
+ flash[:notice] = t('surveyor.Completed_survey')
84
85
  redirect_to surveyor_finish
85
86
  else
86
- flash[:notice] = "Unable to update survey" if !saved #and !saved.nil? # saved.nil? is true if there are no questions on the page (i.e. if it only contains a label)
87
+ flash[:notice] = t('surveyor.Unable_to_update_survey') if !saved #and !saved.nil? # saved.nil? is true if there are no questions on the page (i.e. if it only contains a label)
87
88
  redirect_to :action => "edit", :anchor => anchor_from(params[:section]), :params => {:section => section_id_from(params[:section])}
88
89
  end
89
90
  end
@@ -80,7 +80,7 @@ describe SurveyorController do
80
80
  end
81
81
 
82
82
  describe "view my survey: GET /surveys/xyz/pdq" do
83
-
83
+ #integrate_views
84
84
  before(:each) do
85
85
  @survey = Factory(:survey, :title => "xyz", :access_code => "xyz", :sections => [Factory(:survey_section)])
86
86
  @response_set = Factory(:response_set, :access_code => "pdq", :survey => @survey)
@@ -105,11 +105,6 @@ describe SurveyorController do
105
105
  do_get
106
106
  end
107
107
 
108
- it "should assign the found response_set and survey for the view" do
109
- do_get
110
- assigns[:response_set].should == @response_set
111
- end
112
-
113
108
  it "should redirect if :response_code not found" do
114
109
  get :show, :survey_code => "xyz", :response_set_code => "DIFFERENT"
115
110
  response.should redirect_to(available_surveys_url)
data/spec/factories.rb CHANGED
@@ -110,6 +110,7 @@ end
110
110
 
111
111
  Factory.define :response do |r|
112
112
  r.association :response_set # r.response_set_id {}
113
+ r.survey_section_id {}
113
114
  r.question_id {}
114
115
  r.answer_id {}
115
116
  r.datetime_value {}
@@ -80,6 +80,21 @@ describe ResponseSet, "Updating the response set" do
80
80
 
81
81
  pending
82
82
  end
83
+ describe "assoication of responses to a survey_section" do
84
+ before(:each) do
85
+ @section = Factory(:survey_section)
86
+ @response_set.current_section_id = @section.id
87
+ end
88
+ it "should detect existence of responses to questions that belong to a given survey_section" do
89
+ @response_set.update_attributes(:response_attributes => @radio_response_attributes)
90
+ @response_set.no_responses_for_section?(@section).should be_false
91
+ end
92
+ it "should detect absence of responses to questions that belong to a given survey_section" do
93
+ @response_set.update_attributes(:response_attributes => @radio_response_attributes) #responses are associated with @section
94
+ @another_section = Factory(:survey_section)
95
+ @response_set.no_responses_for_section?(@another_section).should be_true
96
+ end
97
+ end
83
98
  end
84
99
 
85
100
  describe ResponseSet, "with dependencies" do
@@ -242,4 +257,4 @@ describe ResponseSet, "exporting csv" do
242
257
  csv.should match "What flavor?"
243
258
  csv.should match /pecan pie/
244
259
  end
245
- end
260
+ end
@@ -0,0 +1,32 @@
1
+ require File.expand_path(File.dirname(__FILE__) + '/../../spec_helper')
2
+
3
+
4
+ describe "surveyor/show" do
5
+ before(:each) do
6
+ @survey = Factory(:survey, :title => "xyz", :access_code => "xyz", :sections => [Factory(:survey_section)])
7
+ @survey.sections.first.questions=Array.new(3) {Factory(:question)}
8
+ template.stub!(:next_number).and_return(1)
9
+ end
10
+
11
+ it "should render _question partial,if question is not part of a question_group" do
12
+ @survey.sections.first.questions.each{|q| q.stub(:part_of_group?).and_return(false)}
13
+ assigns[:survey] = @survey
14
+ expect_render_partial_calls('question', 3)
15
+ end
16
+
17
+ it "should render _question_group partial for a group of questions" do
18
+ question_group = Factory.create(:question_group)
19
+ # Assosciate all questions with the question_group
20
+ @survey.sections.first.questions.each{|q| q.question_group = question_group}
21
+ assigns[:survey] = @survey
22
+ expect_render_partial_calls('question_group', 1)
23
+ end
24
+
25
+ def expect_render_partial_calls(partial_name, num_calls)
26
+ # Excpection regaring calls to render :partial
27
+ template.should_receive(:render).exactly(num_calls).times.with(hash_including(:partial => "/partials/#{partial_name}"))
28
+ render "surveyor/show.html.haml"
29
+ end
30
+
31
+
32
+ end
data/surveyor.gemspec CHANGED
@@ -5,11 +5,11 @@
5
5
 
6
6
  Gem::Specification.new do |s|
7
7
  s.name = %q{surveyor}
8
- s.version = "0.13.0"
8
+ s.version = "0.14.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"]
12
- s.date = %q{2010-08-23}
12
+ s.date = %q{2010-08-24}
13
13
  s.email = %q{yoon@northwestern.edu}
14
14
  s.extra_rdoc_files = [
15
15
  "README.md"
@@ -32,12 +32,14 @@ Gem::Specification.new do |s|
32
32
  "app/models/response_set.rb",
33
33
  "app/models/survey.rb",
34
34
  "app/models/survey_section.rb",
35
+ "app/models/survey_section_sweeper.rb",
35
36
  "app/models/validation.rb",
36
37
  "app/models/validation_condition.rb",
37
38
  "app/views/layouts/surveyor_default.html.erb",
38
39
  "app/views/partials/_answer.html.haml",
39
40
  "app/views/partials/_question.html.haml",
40
41
  "app/views/partials/_question_group.html.haml",
42
+ "app/views/partials/_section.html.haml",
41
43
  "app/views/surveyor/edit.html.haml",
42
44
  "app/views/surveyor/new.html.haml",
43
45
  "app/views/surveyor/show.html.haml",
@@ -49,8 +51,11 @@ Gem::Specification.new do |s|
49
51
  "features/surveyor.feature",
50
52
  "generators/extend_surveyor/extend_surveyor_generator.rb",
51
53
  "generators/extend_surveyor/templates/EXTENDING_SURVEYOR",
54
+ "generators/extend_surveyor/templates/extensions/survey_extensions.rb",
52
55
  "generators/extend_surveyor/templates/extensions/surveyor_controller.rb",
56
+ "generators/extend_surveyor/templates/extensions/surveyor_controller_extensions.rb",
53
57
  "generators/extend_surveyor/templates/extensions/surveyor_custom.html.erb",
58
+ "generators/extend_surveyor/templates/extensions/surveyor_helper_extensions.rb",
54
59
  "generators/surveyor/surveyor_generator.rb",
55
60
  "generators/surveyor/templates/README",
56
61
  "generators/surveyor/templates/assets/images/222222_11x11_icon_arrows_leftright.gif",
@@ -104,10 +109,13 @@ Gem::Specification.new do |s|
104
109
  "generators/surveyor/templates/assets/stylesheets/reset.css",
105
110
  "generators/surveyor/templates/assets/stylesheets/sass/surveyor.sass",
106
111
  "generators/surveyor/templates/assets/stylesheets/ui.theme.css",
112
+ "generators/surveyor/templates/locales/surveyor_en.yml",
113
+ "generators/surveyor/templates/locales/surveyor_he.yml",
107
114
  "generators/surveyor/templates/migrate/add_correct_answer_id_to_questions.rb",
108
115
  "generators/surveyor/templates/migrate/add_display_order_to_surveys.rb",
109
116
  "generators/surveyor/templates/migrate/add_index_to_response_sets.rb",
110
117
  "generators/surveyor/templates/migrate/add_index_to_surveys.rb",
118
+ "generators/surveyor/templates/migrate/add_section_id_to_responses.rb",
111
119
  "generators/surveyor/templates/migrate/add_unique_indicies.rb",
112
120
  "generators/surveyor/templates/migrate/create_answers.rb",
113
121
  "generators/surveyor/templates/migrate/create_dependencies.rb",
@@ -171,6 +179,7 @@ Gem::Specification.new do |s|
171
179
  "spec/rcov.opts",
172
180
  "spec/spec.opts",
173
181
  "spec/spec_helper.rb",
182
+ "spec/views/surveyor/show.html.haml_spec.rb",
174
183
  "surveyor.gemspec",
175
184
  "uninstall.rb"
176
185
  ]
@@ -194,7 +203,8 @@ Gem::Specification.new do |s|
194
203
  "spec/models/survey_spec.rb",
195
204
  "spec/models/validation_condition_spec.rb",
196
205
  "spec/models/validation_spec.rb",
197
- "spec/spec_helper.rb"
206
+ "spec/spec_helper.rb",
207
+ "spec/views/surveyor/show.html.haml_spec.rb"
198
208
  ]
199
209
 
200
210
  if s.respond_to? :specification_version then
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: 43
4
+ hash: 39
5
5
  prerelease: false
6
6
  segments:
7
7
  - 0
8
- - 13
8
+ - 14
9
9
  - 0
10
- version: 0.13.0
10
+ version: 0.14.0
11
11
  platform: ruby
12
12
  authors:
13
13
  - Brian Chamberlain
@@ -16,7 +16,7 @@ autorequire:
16
16
  bindir: bin
17
17
  cert_chain: []
18
18
 
19
- date: 2010-08-23 00:00:00 -05:00
19
+ date: 2010-08-24 00:00:00 -05:00
20
20
  default_executable:
21
21
  dependencies:
22
22
  - !ruby/object:Gem::Dependency
@@ -73,12 +73,14 @@ files:
73
73
  - app/models/response_set.rb
74
74
  - app/models/survey.rb
75
75
  - app/models/survey_section.rb
76
+ - app/models/survey_section_sweeper.rb
76
77
  - app/models/validation.rb
77
78
  - app/models/validation_condition.rb
78
79
  - app/views/layouts/surveyor_default.html.erb
79
80
  - app/views/partials/_answer.html.haml
80
81
  - app/views/partials/_question.html.haml
81
82
  - app/views/partials/_question_group.html.haml
83
+ - app/views/partials/_section.html.haml
82
84
  - app/views/surveyor/edit.html.haml
83
85
  - app/views/surveyor/new.html.haml
84
86
  - app/views/surveyor/show.html.haml
@@ -90,8 +92,11 @@ files:
90
92
  - features/surveyor.feature
91
93
  - generators/extend_surveyor/extend_surveyor_generator.rb
92
94
  - generators/extend_surveyor/templates/EXTENDING_SURVEYOR
95
+ - generators/extend_surveyor/templates/extensions/survey_extensions.rb
93
96
  - generators/extend_surveyor/templates/extensions/surveyor_controller.rb
97
+ - generators/extend_surveyor/templates/extensions/surveyor_controller_extensions.rb
94
98
  - generators/extend_surveyor/templates/extensions/surveyor_custom.html.erb
99
+ - generators/extend_surveyor/templates/extensions/surveyor_helper_extensions.rb
95
100
  - generators/surveyor/surveyor_generator.rb
96
101
  - generators/surveyor/templates/README
97
102
  - generators/surveyor/templates/assets/images/222222_11x11_icon_arrows_leftright.gif
@@ -145,10 +150,13 @@ files:
145
150
  - generators/surveyor/templates/assets/stylesheets/reset.css
146
151
  - generators/surveyor/templates/assets/stylesheets/sass/surveyor.sass
147
152
  - generators/surveyor/templates/assets/stylesheets/ui.theme.css
153
+ - generators/surveyor/templates/locales/surveyor_en.yml
154
+ - generators/surveyor/templates/locales/surveyor_he.yml
148
155
  - generators/surveyor/templates/migrate/add_correct_answer_id_to_questions.rb
149
156
  - generators/surveyor/templates/migrate/add_display_order_to_surveys.rb
150
157
  - generators/surveyor/templates/migrate/add_index_to_response_sets.rb
151
158
  - generators/surveyor/templates/migrate/add_index_to_surveys.rb
159
+ - generators/surveyor/templates/migrate/add_section_id_to_responses.rb
152
160
  - generators/surveyor/templates/migrate/add_unique_indicies.rb
153
161
  - generators/surveyor/templates/migrate/create_answers.rb
154
162
  - generators/surveyor/templates/migrate/create_dependencies.rb
@@ -212,6 +220,7 @@ files:
212
220
  - spec/rcov.opts
213
221
  - spec/spec.opts
214
222
  - spec/spec_helper.rb
223
+ - spec/views/surveyor/show.html.haml_spec.rb
215
224
  - surveyor.gemspec
216
225
  - uninstall.rb
217
226
  has_rdoc: true
@@ -264,3 +273,4 @@ test_files:
264
273
  - spec/models/validation_condition_spec.rb
265
274
  - spec/models/validation_spec.rb
266
275
  - spec/spec_helper.rb
276
+ - spec/views/surveyor/show.html.haml_spec.rb