active_record_survey 0.1.30 → 0.1.31
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.
- checksums.yaml +4 -4
- data/README.md +3 -0
- data/lib/active_record_survey/node/answer/chained.rb +70 -0
- data/lib/active_record_survey/node/answer.rb +24 -0
- data/lib/active_record_survey/node_map.rb +1 -1
- data/lib/active_record_survey/version.rb +1 -1
- data/spec/active_record_survey/node/answer/boolean_spec.rb +60 -0
- data/spec/active_record_survey/node/answer_spec.rb +46 -0
- metadata +2 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 082ebe76b425818c9a032b73ed6c0c5385744225
|
4
|
+
data.tar.gz: c0c5f13b437c964afa64e515c91e45a180525942
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 5b0880add7fe547eaecc719abd0467f1b4c1e3c652831c4d9c9d347840146c9159c71e24cff4a11141c004311bc1ed9907424d2b31512c507dd4a7de322c053e
|
7
|
+
data.tar.gz: c3fd2f597ba728044f8556b1a81d57dbd43c0d471baadc3db73086a6ed166f340864a406c08df1020f5aa6f4fbc0af6bc977e7ceabc87bc32f70a2f606fb098d
|
data/README.md
CHANGED
@@ -11,6 +11,9 @@ The goal is to give a simple interface for creating surveys and validating the a
|
|
11
11
|
|
12
12
|
Release Notes
|
13
13
|
============
|
14
|
+
**0.1.31**
|
15
|
+
- `ActiveRecordSurvey::Node::Answer#move_up` and `ActiveRecordSurvey::Node::Answer#move_down` implemented so you can change the position of answers relative to one another i both branching and chained types.
|
16
|
+
I am not happy yet with this. [AwesomeNestedSet](https://github.com/collectiveidea/awesome_nested_set) seems to require nodes exist before moving them which is a limitation I'd like to not have.
|
14
17
|
|
15
18
|
**0.1.30**
|
16
19
|
- `ActiveRecordSurvey::Node::Question` now throws ArgumentError if answers of different types are added to it
|
@@ -32,6 +32,76 @@ module ActiveRecordSurvey
|
|
32
32
|
true
|
33
33
|
end
|
34
34
|
|
35
|
+
# Moves answer down relative to other answers by swapping parent and children
|
36
|
+
def move_up
|
37
|
+
# Ensure each parent node to this node (the goal here is to hit a question node) is valid
|
38
|
+
!self.survey.node_maps.select { |i|
|
39
|
+
i.node == self
|
40
|
+
}.collect { |node_map|
|
41
|
+
# Parent must be an answer - cannot move into the position of a Question!
|
42
|
+
if !node_map.parent.nil? && node_map.parent.node.class.ancestors.include?(::ActiveRecordSurvey::Node::Answer)
|
43
|
+
# I know this looks overly complicated, but we need to always work with the survey.node_maps - never children/parent of the relation
|
44
|
+
parent_node = self.survey.node_maps.select { |j|
|
45
|
+
node_map.parent == j
|
46
|
+
}.first
|
47
|
+
|
48
|
+
parent_parent = self.survey.node_maps.select { |j|
|
49
|
+
node_map.parent.parent == j
|
50
|
+
}.first
|
51
|
+
|
52
|
+
node_map.parent = parent_parent
|
53
|
+
parent_parent.children << node_map
|
54
|
+
|
55
|
+
self.survey.node_maps.select { |j|
|
56
|
+
node_map.children.include?(j)
|
57
|
+
}.each { |c|
|
58
|
+
c.parent = parent_node
|
59
|
+
parent_node.children << c
|
60
|
+
}
|
61
|
+
|
62
|
+
parent_node.parent = node_map
|
63
|
+
node_map.children << parent_node
|
64
|
+
end
|
65
|
+
}
|
66
|
+
end
|
67
|
+
|
68
|
+
# Moves answer down relative to other answers by swapping parent and children
|
69
|
+
def move_down
|
70
|
+
# Ensure each parent node to this node (the goal here is to hit a question node) is valid
|
71
|
+
!self.survey.node_maps.select { |i|
|
72
|
+
i.node == self
|
73
|
+
}.collect { |node_map|
|
74
|
+
# Must have children to move lower!
|
75
|
+
# And the children are also answers!
|
76
|
+
if node_map.children.length > 0 && !node_map.children.select { |j| j.node.class.ancestors.include?(::ActiveRecordSurvey::Node::Answer) }.empty?
|
77
|
+
# I know this looks overly complicated, but we need to always work with the survey.node_maps - never children/parent of the relation
|
78
|
+
parent_node = self.survey.node_maps.select { |j|
|
79
|
+
node_map.parent == j
|
80
|
+
}.first
|
81
|
+
|
82
|
+
children = self.survey.node_maps.select { |j|
|
83
|
+
node_map.children.include?(j)
|
84
|
+
}
|
85
|
+
|
86
|
+
children_children = self.survey.node_maps.select { |j|
|
87
|
+
children.collect { |k| k.children }.flatten.include?(j)
|
88
|
+
}
|
89
|
+
|
90
|
+
children.each { |c|
|
91
|
+
parent_node.children << c
|
92
|
+
}
|
93
|
+
|
94
|
+
children.each { |c|
|
95
|
+
c.children << node_map
|
96
|
+
}
|
97
|
+
|
98
|
+
children_children.each { |i|
|
99
|
+
node_map.children << i
|
100
|
+
}
|
101
|
+
end
|
102
|
+
}
|
103
|
+
end
|
104
|
+
|
35
105
|
private
|
36
106
|
# Before a node is destroyed, will re-build the node_map links from parent to child if they exist
|
37
107
|
def before_destroy_rebuild_node_map
|
@@ -135,6 +135,30 @@ module ActiveRecordSurvey
|
|
135
135
|
}
|
136
136
|
end
|
137
137
|
|
138
|
+
# Moves answer up relative to other answers
|
139
|
+
def move_up
|
140
|
+
!self.survey.node_maps.select { |i|
|
141
|
+
i.node == self
|
142
|
+
}.collect { |node_map|
|
143
|
+
begin
|
144
|
+
node_map.move_left
|
145
|
+
rescue
|
146
|
+
end
|
147
|
+
}
|
148
|
+
end
|
149
|
+
|
150
|
+
# Moves answer down relative to other answers
|
151
|
+
def move_down
|
152
|
+
!self.survey.node_maps.select { |i|
|
153
|
+
i.node == self
|
154
|
+
}.collect { |node_map|
|
155
|
+
begin
|
156
|
+
node_map.move_right
|
157
|
+
rescue
|
158
|
+
end
|
159
|
+
}
|
160
|
+
end
|
161
|
+
|
138
162
|
private
|
139
163
|
# By default - answers build off the original question node
|
140
164
|
#
|
@@ -22,7 +22,7 @@ module ActiveRecordSurvey
|
|
22
22
|
|
23
23
|
c = (node_maps.nil?)? self.children : node_maps.select { |i|
|
24
24
|
i.parent == self && !i.marked_for_destruction?
|
25
|
-
}
|
25
|
+
}.sort { |a,b| a.left<=>b.left }
|
26
26
|
|
27
27
|
result = {}
|
28
28
|
result.merge!({ :id => self.id, :node_id => ((self.node.respond_to?(:id))? self.node.id : "") }) if !options[:no_ids] && !self.node.nil?
|
@@ -1,6 +1,66 @@
|
|
1
1
|
require 'spec_helper'
|
2
2
|
|
3
3
|
describe ActiveRecordSurvey::Node::Answer::Boolean, :boolean_spec => true do
|
4
|
+
describe 'move operations' do
|
5
|
+
before(:each) do
|
6
|
+
@survey = ActiveRecordSurvey::Survey.new()
|
7
|
+
@q1 = ActiveRecordSurvey::Node::Question.new(:text => "Question #1", :survey => @survey)
|
8
|
+
@q1_a1 = ActiveRecordSurvey::Node::Answer::Boolean.new(:text => "Q1 Answer #1")
|
9
|
+
@q1_a2 = ActiveRecordSurvey::Node::Answer::Boolean.new(:text => "Q1 Answer #2")
|
10
|
+
@q1_a3 = ActiveRecordSurvey::Node::Answer::Boolean.new(:text => "Q1 Answer #3")
|
11
|
+
@q1.build_answer(@q1_a1)
|
12
|
+
@q1.build_answer(@q1_a2)
|
13
|
+
@q1.build_answer(@q1_a3)
|
14
|
+
@survey.save
|
15
|
+
end
|
16
|
+
|
17
|
+
describe '#move_up' do
|
18
|
+
it 'should go higher of possible' do
|
19
|
+
@q1_a2.move_up
|
20
|
+
|
21
|
+
expect(@survey.as_map(no_ids: true)).to eq([{"text"=>"Question #1", :type=>"ActiveRecordSurvey::Node::Question", :children=>[{"text"=>"Q1 Answer #2", :type=>"ActiveRecordSurvey::Node::Answer::Boolean", :children=>[{"text"=>"Q1 Answer #1", :type=>"ActiveRecordSurvey::Node::Answer::Boolean", :children=>[{"text"=>"Q1 Answer #3", :type=>"ActiveRecordSurvey::Node::Answer::Boolean", :children=>[]}]}]}]}])
|
22
|
+
|
23
|
+
@q1_a3.move_up
|
24
|
+
|
25
|
+
expect(@survey.as_map(no_ids: true)).to eq([{"text"=>"Question #1", :type=>"ActiveRecordSurvey::Node::Question", :children=>[{"text"=>"Q1 Answer #2", :type=>"ActiveRecordSurvey::Node::Answer::Boolean", :children=>[{"text"=>"Q1 Answer #3", :type=>"ActiveRecordSurvey::Node::Answer::Boolean", :children=>[{"text"=>"Q1 Answer #1", :type=>"ActiveRecordSurvey::Node::Answer::Boolean", :children=>[]}]}]}]}])
|
26
|
+
|
27
|
+
@survey.save
|
28
|
+
expect(@survey.as_map(no_ids: true)).to eq([{"text"=>"Question #1", :type=>"ActiveRecordSurvey::Node::Question", :children=>[{"text"=>"Q1 Answer #2", :type=>"ActiveRecordSurvey::Node::Answer::Boolean", :children=>[{"text"=>"Q1 Answer #3", :type=>"ActiveRecordSurvey::Node::Answer::Boolean", :children=>[{"text"=>"Q1 Answer #1", :type=>"ActiveRecordSurvey::Node::Answer::Boolean", :children=>[]}]}]}]}])
|
29
|
+
|
30
|
+
@survey.reload
|
31
|
+
expect(@survey.as_map(no_ids: true)).to eq([{"text"=>"Question #1", :type=>"ActiveRecordSurvey::Node::Question", :children=>[{"text"=>"Q1 Answer #2", :type=>"ActiveRecordSurvey::Node::Answer::Boolean", :children=>[{"text"=>"Q1 Answer #3", :type=>"ActiveRecordSurvey::Node::Answer::Boolean", :children=>[{"text"=>"Q1 Answer #1", :type=>"ActiveRecordSurvey::Node::Answer::Boolean", :children=>[]}]}]}]}])
|
32
|
+
end
|
33
|
+
|
34
|
+
it 'should not change the position of the first question' do
|
35
|
+
@q1_a1.move_up
|
36
|
+
|
37
|
+
expect(@survey.as_map(no_ids: true)).to eq([{"text"=>"Question #1", :type=>"ActiveRecordSurvey::Node::Question", :children=>[{"text"=>"Q1 Answer #1", :type=>"ActiveRecordSurvey::Node::Answer::Boolean", :children=>[{"text"=>"Q1 Answer #2", :type=>"ActiveRecordSurvey::Node::Answer::Boolean", :children=>[{"text"=>"Q1 Answer #3", :type=>"ActiveRecordSurvey::Node::Answer::Boolean", :children=>[]}]}]}]}])
|
38
|
+
|
39
|
+
# Save should not affect it
|
40
|
+
@survey.save
|
41
|
+
expect(@survey.as_map(no_ids: true)).to eq([{"text"=>"Question #1", :type=>"ActiveRecordSurvey::Node::Question", :children=>[{"text"=>"Q1 Answer #1", :type=>"ActiveRecordSurvey::Node::Answer::Boolean", :children=>[{"text"=>"Q1 Answer #2", :type=>"ActiveRecordSurvey::Node::Answer::Boolean", :children=>[{"text"=>"Q1 Answer #3", :type=>"ActiveRecordSurvey::Node::Answer::Boolean", :children=>[]}]}]}]}])
|
42
|
+
|
43
|
+
# Reload should not affect it
|
44
|
+
@survey.reload
|
45
|
+
expect(@survey.as_map(no_ids: true)).to eq([{"text"=>"Question #1", :type=>"ActiveRecordSurvey::Node::Question", :children=>[{"text"=>"Q1 Answer #1", :type=>"ActiveRecordSurvey::Node::Answer::Boolean", :children=>[{"text"=>"Q1 Answer #2", :type=>"ActiveRecordSurvey::Node::Answer::Boolean", :children=>[{"text"=>"Q1 Answer #3", :type=>"ActiveRecordSurvey::Node::Answer::Boolean", :children=>[]}]}]}]}])
|
46
|
+
end
|
47
|
+
end
|
48
|
+
|
49
|
+
describe '#move_down' do
|
50
|
+
it 'should go lower of possible' do
|
51
|
+
@q1_a2.move_down
|
52
|
+
|
53
|
+
expect(@survey.as_map(no_ids: true)).to eq([{"text"=>"Question #1", :type=>"ActiveRecordSurvey::Node::Question", :children=>[{"text"=>"Q1 Answer #1", :type=>"ActiveRecordSurvey::Node::Answer::Boolean", :children=>[{"text"=>"Q1 Answer #3", :type=>"ActiveRecordSurvey::Node::Answer::Boolean", :children=>[{"text"=>"Q1 Answer #2", :type=>"ActiveRecordSurvey::Node::Answer::Boolean", :children=>[]}]}]}]}])
|
54
|
+
end
|
55
|
+
|
56
|
+
it 'should not change the position of the last question' do
|
57
|
+
@q1_a3.move_down
|
58
|
+
|
59
|
+
expect(@survey.as_map(no_ids: true)).to eq([{"text"=>"Question #1", :type=>"ActiveRecordSurvey::Node::Question", :children=>[{"text"=>"Q1 Answer #1", :type=>"ActiveRecordSurvey::Node::Answer::Boolean", :children=>[{"text"=>"Q1 Answer #2", :type=>"ActiveRecordSurvey::Node::Answer::Boolean", :children=>[{"text"=>"Q1 Answer #3", :type=>"ActiveRecordSurvey::Node::Answer::Boolean", :children=>[]}]}]}]}])
|
60
|
+
end
|
61
|
+
end
|
62
|
+
end
|
63
|
+
|
4
64
|
describe '#destroy' do
|
5
65
|
it 'should re-link broken chains' do
|
6
66
|
survey = ActiveRecordSurvey::Survey.new()
|
@@ -1,6 +1,52 @@
|
|
1
1
|
require 'spec_helper'
|
2
2
|
|
3
3
|
describe ActiveRecordSurvey::Node::Answer, :answer_spec => true do
|
4
|
+
describe 'move operations' do
|
5
|
+
before(:each) do
|
6
|
+
@survey = ActiveRecordSurvey::Survey.new()
|
7
|
+
@q1 = ActiveRecordSurvey::Node::Question.new(:text => "Question #1", :survey => @survey)
|
8
|
+
@q1_a1 = ActiveRecordSurvey::Node::Answer.new(:text => "Q1 Answer #1")
|
9
|
+
@q1_a2 = ActiveRecordSurvey::Node::Answer.new(:text => "Q1 Answer #2")
|
10
|
+
@q1_a3 = ActiveRecordSurvey::Node::Answer.new(:text => "Q1 Answer #3")
|
11
|
+
@q1.build_answer(@q1_a1)
|
12
|
+
@q1.build_answer(@q1_a2)
|
13
|
+
@q1.build_answer(@q1_a3)
|
14
|
+
@survey.save
|
15
|
+
end
|
16
|
+
|
17
|
+
describe '#move_up' do
|
18
|
+
it 'should go higher of possible' do
|
19
|
+
@q1_a2.move_up
|
20
|
+
|
21
|
+
@survey.reload
|
22
|
+
expect(@survey.as_map(no_ids: true)).to eq([{"text"=>"Question #1", :type=>"ActiveRecordSurvey::Node::Question", :children=>[{"text"=>"Q1 Answer #2", :type=>"ActiveRecordSurvey::Node::Answer", :children=>[]}, {"text"=>"Q1 Answer #1", :type=>"ActiveRecordSurvey::Node::Answer", :children=>[]}, {"text"=>"Q1 Answer #3", :type=>"ActiveRecordSurvey::Node::Answer", :children=>[]}]}])
|
23
|
+
end
|
24
|
+
|
25
|
+
it 'should not change the position of the first question' do
|
26
|
+
@q1_a1.move_up
|
27
|
+
|
28
|
+
@survey.reload
|
29
|
+
expect(@survey.as_map(no_ids: true)).to eq([{"text"=>"Question #1", :type=>"ActiveRecordSurvey::Node::Question", :children=>[{"text"=>"Q1 Answer #1", :type=>"ActiveRecordSurvey::Node::Answer", :children=>[]}, {"text"=>"Q1 Answer #2", :type=>"ActiveRecordSurvey::Node::Answer", :children=>[]}, {"text"=>"Q1 Answer #3", :type=>"ActiveRecordSurvey::Node::Answer", :children=>[]}]}])
|
30
|
+
end
|
31
|
+
end
|
32
|
+
|
33
|
+
describe '#move_down' do
|
34
|
+
it 'should go lower of possible' do
|
35
|
+
@q1_a2.move_down
|
36
|
+
|
37
|
+
@survey.reload
|
38
|
+
expect(@survey.as_map(no_ids: true)).to eq([{"text"=>"Question #1", :type=>"ActiveRecordSurvey::Node::Question", :children=>[{"text"=>"Q1 Answer #1", :type=>"ActiveRecordSurvey::Node::Answer", :children=>[]}, {"text"=>"Q1 Answer #3", :type=>"ActiveRecordSurvey::Node::Answer", :children=>[]}, {"text"=>"Q1 Answer #2", :type=>"ActiveRecordSurvey::Node::Answer", :children=>[]}]}])
|
39
|
+
end
|
40
|
+
|
41
|
+
it 'should not change the position of the last question' do
|
42
|
+
@q1_a3.move_down
|
43
|
+
|
44
|
+
@survey.reload
|
45
|
+
expect(@survey.as_map(no_ids: true)).to eq([{"text"=>"Question #1", :type=>"ActiveRecordSurvey::Node::Question", :children=>[{"text"=>"Q1 Answer #1", :type=>"ActiveRecordSurvey::Node::Answer", :children=>[]}, {"text"=>"Q1 Answer #2", :type=>"ActiveRecordSurvey::Node::Answer", :children=>[]}, {"text"=>"Q1 Answer #3", :type=>"ActiveRecordSurvey::Node::Answer", :children=>[]}]}])
|
46
|
+
end
|
47
|
+
end
|
48
|
+
end
|
49
|
+
|
4
50
|
# When answer nodes are deleted should:
|
5
51
|
# - Clean upp node_maps
|
6
52
|
# - If chained, build a chain from parent -> child after removing self
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: active_record_survey
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.1.
|
4
|
+
version: 0.1.31
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Butch Marshall
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2016-03-
|
11
|
+
date: 2016-03-26 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: activerecord
|