active_record_survey-node_map_group 0.0.2 → 0.0.4
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/Gemfile +2 -0
- data/lib/active_record_survey/node_map/class_methods.rb +9 -0
- data/lib/active_record_survey/node_map_group.rb +5 -1
- data/lib/active_record_survey/node_map_group/instance_methods.rb +86 -0
- data/lib/active_record_survey/node_map_group/version.rb +1 -1
- metadata +3 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 11e86c11a387a583868a8390049c0bcded8eda47
|
4
|
+
data.tar.gz: 6592788ffb17ebf285872edd8f970f328d727d75
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 57db7f700994af3fedfb929a9aeffb31776155f51872acf1e5ac13a195fda496ca8eca5710a77b8ae563d6fb9d979929d036084ccfec45893b0a4ea0da163f2a
|
7
|
+
data.tar.gz: 77125d8171294a2fb73b22f5546f2662f68273e946dd0a3fa8c5424f86b69c8b7616cc343dfdfd26754a00c89721a659fb2498ebb77f93d503adf88954ffb9a5
|
data/Gemfile
CHANGED
@@ -0,0 +1,9 @@
|
|
1
|
+
module ActiveRecordSurvey
|
2
|
+
class NodeMap < ActiveRecord::Base
|
3
|
+
module ClassMethods
|
4
|
+
def self.extended(base)
|
5
|
+
base.belongs_to :node_map_group, :class_name => "ActiveRecordSurvey::NodeMapGroup", :foreign_key => :active_record_survey_api_node_map_group_id
|
6
|
+
end
|
7
|
+
end
|
8
|
+
end
|
9
|
+
end
|
@@ -8,10 +8,14 @@ require "active_record_survey/node_map_group/version"
|
|
8
8
|
require "active_record_survey/node_map_group/class_methods"
|
9
9
|
require "active_record_survey/node_map_group/instance_methods"
|
10
10
|
|
11
|
+
require "active_record_survey/node_map/class_methods"
|
12
|
+
|
11
13
|
module ActiveRecordSurvey
|
12
14
|
class NodeMapGroup < ActiveRecord::Base
|
13
15
|
end
|
14
16
|
end
|
15
17
|
|
16
18
|
ActiveRecordSurvey::NodeMapGroup.send :include, ActiveRecordSurvey::NodeMapGroup::InstanceMethods
|
17
|
-
ActiveRecordSurvey::NodeMapGroup.send :extend, ActiveRecordSurvey::NodeMapGroup::ClassMethods
|
19
|
+
ActiveRecordSurvey::NodeMapGroup.send :extend, ActiveRecordSurvey::NodeMapGroup::ClassMethods
|
20
|
+
|
21
|
+
ActiveRecordSurvey::NodeMap.send :extend, ActiveRecordSurvey::NodeMap::ClassMethods
|
@@ -25,6 +25,83 @@ module ActiveRecordSurvey
|
|
25
25
|
(results.length > 0 && !results.include?(false))
|
26
26
|
end
|
27
27
|
|
28
|
+
# Builds questions
|
29
|
+
#
|
30
|
+
# From an array of questions (and question/answer key value pairs) builds all the node_map_groups to be associated with this node_map_group
|
31
|
+
#
|
32
|
+
# * *Args* :
|
33
|
+
# - +array+ -> The array of questions
|
34
|
+
# * *Returns* :
|
35
|
+
# - +boolean+ -> Whether successul or not
|
36
|
+
# * *Raises* :
|
37
|
+
# - +StandardError+ -> Survey has not yet been associated
|
38
|
+
# - +ArgumentError+ -> Question or Answers do not exist
|
39
|
+
#
|
40
|
+
def build_questions(questions)
|
41
|
+
# Must be associated with a survey first
|
42
|
+
raise StandardError, "SURVEY_MISSING" if self.survey.nil?
|
43
|
+
|
44
|
+
questions.each { |datum|
|
45
|
+
# Find question by inputs
|
46
|
+
question = case datum.class.to_s
|
47
|
+
when 'Fixnum' then ActiveRecordSurvey::Node::Question.where(:id => datum, :survey => self.survey).first
|
48
|
+
when 'Hash' then ActiveRecordSurvey::Node::Question.where(:id => datum[:question_id], :survey => self.survey).first
|
49
|
+
else nil
|
50
|
+
end
|
51
|
+
|
52
|
+
# Don't continue if question does not exist
|
53
|
+
raise ArgumentError, "INVALID_QUESTION" if question.nil?
|
54
|
+
|
55
|
+
# Find answer by inputs
|
56
|
+
previous_node = case datum.class.to_s
|
57
|
+
when 'Hash' then ActiveRecordSurvey::Node.where(:id => datum[:previous_id], :survey => self.survey).first
|
58
|
+
else nil
|
59
|
+
end
|
60
|
+
|
61
|
+
# Via Survey object, find all the node_maps that match the criteria passed
|
62
|
+
question_node_maps = self.survey.node_maps.select { |node_map|
|
63
|
+
node_map.node == question
|
64
|
+
}
|
65
|
+
|
66
|
+
# Filter list by the previous node
|
67
|
+
question_node_maps.select! { |node_map| previous_node.node_maps.select { |i| i.children.include?(node_map) }.length > 0 } unless previous_node.nil?
|
68
|
+
|
69
|
+
# Filter by existing node maps
|
70
|
+
filtered = question_node_maps.select { |new_node_map|
|
71
|
+
# Only keep new node_maps if there is an existing node_map that is an ancestor of it
|
72
|
+
self.node_maps.select { |existing_node_map|
|
73
|
+
# This is the only path we want - throw out the others
|
74
|
+
new_node_map.is_decendant_of?(existing_node_map)
|
75
|
+
}.length > 0
|
76
|
+
}
|
77
|
+
|
78
|
+
# At least one existing node_map was an ancestor of the one we're adding
|
79
|
+
question_node_maps = filtered if filtered.length != 0
|
80
|
+
|
81
|
+
# Now prune existing node maps
|
82
|
+
# We are removing node_maps that are apart of paths that don't logically make sense anymore
|
83
|
+
self.node_maps = self.node_maps.select { |existing_node_map|
|
84
|
+
keep = true
|
85
|
+
question_node_maps.select { |new_node_map|
|
86
|
+
if existing_node_map.node != new_node_map.node && !existing_node_map.is_decendant_of?(new_node_map) && ! new_node_map.is_decendant_of?(existing_node_map)
|
87
|
+
existing_node_map.node_map_group = nil
|
88
|
+
keep = false
|
89
|
+
end
|
90
|
+
}
|
91
|
+
keep
|
92
|
+
}
|
93
|
+
|
94
|
+
# After our investigation - no nodes found!
|
95
|
+
raise ArgumentError, "QUESTION_NOT_FOUND" if question_node_maps.length === 0
|
96
|
+
|
97
|
+
# Add the remaining nodes
|
98
|
+
question_node_maps.each { |node_map|
|
99
|
+
self.node_maps << node_map
|
100
|
+
}
|
101
|
+
}
|
102
|
+
true
|
103
|
+
end
|
104
|
+
|
28
105
|
private
|
29
106
|
def validate_node_maps
|
30
107
|
self.node_maps.each { |node_map|
|
@@ -39,6 +116,15 @@ module ActiveRecordSurvey
|
|
39
116
|
# Must inherit from ActiveRecordSurvey::Node::Question
|
40
117
|
return false if !potential_node_map.node.class.ancestors.include?(::ActiveRecordSurvey::Node::Question)
|
41
118
|
|
119
|
+
# A question also linked to this node_group leads to this node
|
120
|
+
# BUT - that previous question actually points to multiple questions
|
121
|
+
return false if self.node_maps.select { |node_map|
|
122
|
+
# This node map is the question before the one we're validating
|
123
|
+
node_map.node.next_questions.include?(potential_node_map.node)
|
124
|
+
}.collect { |node_map|
|
125
|
+
node_map.node.next_questions.length === 1
|
126
|
+
}.include?(false)
|
127
|
+
|
42
128
|
# Nothing else added - so yep - valid!
|
43
129
|
return true if self.node_maps.length === 0
|
44
130
|
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: active_record_survey-node_map_group
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.0.
|
4
|
+
version: 0.0.4
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Butch Marshall
|
8
8
|
autorequire:
|
9
9
|
bindir: exe
|
10
10
|
cert_chain: []
|
11
|
-
date: 2016-
|
11
|
+
date: 2016-08-13 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: active_record_survey
|
@@ -124,6 +124,7 @@ files:
|
|
124
124
|
- active_record_survey-node_map_group.gemspec
|
125
125
|
- bin/console
|
126
126
|
- bin/setup
|
127
|
+
- lib/active_record_survey/node_map/class_methods.rb
|
127
128
|
- lib/active_record_survey/node_map_group.rb
|
128
129
|
- lib/active_record_survey/node_map_group/class_methods.rb
|
129
130
|
- lib/active_record_survey/node_map_group/compatibility.rb
|