survey-gizmo-ruby 4.0.0 → 4.1.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/README.md +30 -10
- data/lib/survey-gizmo-ruby.rb +3 -3
- data/lib/survey_gizmo/api/option.rb +1 -3
- data/lib/survey_gizmo/api/page.rb +2 -4
- data/lib/survey_gizmo/api/question.rb +5 -7
- data/lib/survey_gizmo/api/response.rb +13 -1
- data/lib/survey_gizmo/api/survey.rb +7 -13
- data/lib/survey_gizmo/api/survey_campaign.rb +2 -2
- data/lib/survey_gizmo/configuration.rb +3 -0
- data/lib/survey_gizmo/multilingual_title.rb +3 -2
- data/lib/survey_gizmo/resource.rb +72 -62
- data/lib/survey_gizmo/rest_response.rb +17 -8
- data/lib/survey_gizmo/version.rb +2 -1
- data/spec/resource_spec.rb +8 -7
- 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: 00dc389fa6c3415227ed3ea344c8ec1b7152eaa8
|
4
|
+
data.tar.gz: 342bda557eb8df193f19958de0337a23504c5a49
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 35695df30398092c26e8fdb48eead2e669753df6cddd4a615eb70688ede385a80e6731adfd29d33bc83ae93b25a15d875c5cf3d2efa7519cb3124e02b018f6a5
|
7
|
+
data.tar.gz: 434990416b53a6cdd22c00f102f888125ec5a501c800c2c8df41fe1a8a126d510228595f8d9b4fd7a6482fb6644235d029564ca476c9166ccb14a7ccea3940c5
|
data/README.md
CHANGED
@@ -40,12 +40,17 @@ SurveyGizmo.configure do |config|
|
|
40
40
|
config.user = 'still_tippin@woodgraingrip.com'
|
41
41
|
config.password = 'it_takes_grindin_to_be_a_king'
|
42
42
|
|
43
|
-
#
|
43
|
+
# Optional - Defaults to v4, but you can probably set to v3 safely if you suspect a bug in v4
|
44
44
|
config.api_version = 'v4'
|
45
|
+
|
46
|
+
# Optional - Defaults to 50, maximum 500. Setting too high may cause SurveyGizmo to start throwing timeouts.
|
47
|
+
config.results_per_page = 100
|
45
48
|
end
|
46
49
|
|
47
|
-
# Retrieve
|
50
|
+
# Retrieve the first page of your surveys
|
48
51
|
surveys = SurveyGizmo::API::Survey.all
|
52
|
+
# Retrieve ALL your surveys (handle pagination for you)
|
53
|
+
surveys = SurveyGizmo::API::Survey.all(all_pages: true)
|
49
54
|
|
50
55
|
# Retrieve the survey with id: 12345
|
51
56
|
survey = SurveyGizmo::API::Survey.first(id: 12345)
|
@@ -54,6 +59,7 @@ survey.pages # => [page1, page2,...]
|
|
54
59
|
survey.number_of_completed_responses # => 355
|
55
60
|
survey.server_has_new_results_since?(Time.now.utc - 2.days) # => true
|
56
61
|
survey.team_names # => ['Development', 'Test']
|
62
|
+
survey.belongs_to?('Development') # => true
|
57
63
|
|
58
64
|
# Retrieving Questions for a given survey. Note that page_id is a required parameter.
|
59
65
|
questions = SurveyGizmo::API::Question.all(survey_id: survey.id, page_id: 1)
|
@@ -68,14 +74,28 @@ question.save
|
|
68
74
|
# Destroy a question
|
69
75
|
question.destroy
|
70
76
|
|
71
|
-
#
|
72
|
-
|
73
|
-
#
|
74
|
-
responses = SurveyGizmo::API::Response.all(
|
75
|
-
|
76
|
-
#
|
77
|
-
|
78
|
-
|
77
|
+
# Retrieve 2nd page of SurveyResponses for a given survey.
|
78
|
+
responses = SurveyGizmo::API::Response.all(survey_id: 12345, page: 2)
|
79
|
+
# Retrieve all responses for a given survey.
|
80
|
+
responses = SurveyGizmo::API::Response.all(all_pages: true, survey_id: 12345)
|
81
|
+
# Retrieving page 3 of completed, non test data SurveyResponses submitted within the past 3 days
|
82
|
+
# for contact id 999. This example shows you how to use some of the gem's built in filters and
|
83
|
+
# filter generators as well as how to construct your own raw filter.
|
84
|
+
# See: http://apihelp.surveygizmo.com/help/article/link/filters for more info on filters
|
85
|
+
responses = SurveyGizmo::API::Response.all(
|
86
|
+
survey_id: 12345,
|
87
|
+
page: 3,
|
88
|
+
filters: [
|
89
|
+
SurveyGizmo::API::Response::NO_TEST_DATA,
|
90
|
+
SurveyGizmo::API::Response::ONLY_COMPLETED,
|
91
|
+
SurveyGizmo::API::Response.submitted_since_filter(Time.now - 72.hours),
|
92
|
+
{
|
93
|
+
field: 'contact_id',
|
94
|
+
operator: '=',
|
95
|
+
value: 999
|
96
|
+
}
|
97
|
+
]
|
98
|
+
)
|
79
99
|
```
|
80
100
|
|
81
101
|
## On API Timeouts
|
data/lib/survey-gizmo-ruby.rb
CHANGED
@@ -3,15 +3,15 @@ require 'active_support/core_ext/module'
|
|
3
3
|
require 'active_support/core_ext/hash'
|
4
4
|
require 'active_support/core_ext/object/blank'
|
5
5
|
require 'active_support/concern'
|
6
|
+
require 'active_support/time_with_zone'
|
6
7
|
require 'awesome_print'
|
7
|
-
require 'virtus'
|
8
|
-
require 'httparty'
|
9
8
|
require 'digest/md5'
|
9
|
+
require 'httparty'
|
10
|
+
require 'virtus'
|
10
11
|
|
11
12
|
require 'survey_gizmo/version'
|
12
13
|
require 'survey_gizmo/survey_gizmo'
|
13
14
|
require 'survey_gizmo/configuration'
|
14
|
-
|
15
15
|
require 'survey_gizmo/multilingual_title'
|
16
16
|
require 'survey_gizmo/resource'
|
17
17
|
require 'survey_gizmo/rest_response'
|
@@ -2,17 +2,15 @@ module SurveyGizmo; module API
|
|
2
2
|
# @see SurveyGizmo::Resource::ClassMethods
|
3
3
|
class Option
|
4
4
|
include SurveyGizmo::Resource
|
5
|
+
include SurveyGizmo::MultilingualTitle
|
5
6
|
|
6
7
|
attribute :id, Integer
|
7
8
|
attribute :survey_id, Integer
|
8
9
|
attribute :page_id, Integer
|
9
10
|
attribute :question_id, Integer
|
10
|
-
attribute :title, String
|
11
11
|
attribute :value, String
|
12
12
|
attribute :properties, Hash
|
13
13
|
|
14
|
-
include SurveyGizmo::MultilingualTitle
|
15
|
-
|
16
14
|
route '/survey/:survey_id/surveypage/:page_id/surveyquestion/:question_id/surveyoption', via: :create
|
17
15
|
route '/survey/:survey_id/surveypage/:page_id/surveyquestion/:question_id/surveyoption/:id', via: [:get, :update, :delete]
|
18
16
|
|
@@ -2,16 +2,14 @@ module SurveyGizmo; module API
|
|
2
2
|
# @see SurveyGizmo::Resource::ClassMethods
|
3
3
|
class Page
|
4
4
|
include SurveyGizmo::Resource
|
5
|
+
include SurveyGizmo::MultilingualTitle
|
5
6
|
|
6
7
|
attribute :id, Integer
|
7
|
-
attribute :title, Hash
|
8
8
|
attribute :description, String
|
9
9
|
attribute :properties, Hash
|
10
10
|
attribute :after, Integer
|
11
11
|
attribute :survey_id, Integer
|
12
12
|
|
13
|
-
include SurveyGizmo::MultilingualTitle
|
14
|
-
|
15
13
|
# routing
|
16
14
|
route '/survey/:survey_id/surveypage', via: :create
|
17
15
|
route '/survey/:survey_id/surveypage/:id', via: [:get, :update, :delete]
|
@@ -21,7 +19,7 @@ module SurveyGizmo; module API
|
|
21
19
|
end
|
22
20
|
|
23
21
|
def questions
|
24
|
-
@questions ||= SurveyGizmo::API::Question.all(survey_id: survey_id, page_id: id)
|
22
|
+
@questions ||= SurveyGizmo::API::Question.all(survey_id: survey_id, page_id: id, all_pages: true)
|
25
23
|
end
|
26
24
|
|
27
25
|
def to_param_options
|
@@ -2,9 +2,9 @@ module SurveyGizmo; module API
|
|
2
2
|
# @see SurveyGizmo::Resource::ClassMethods
|
3
3
|
class Question
|
4
4
|
include SurveyGizmo::Resource
|
5
|
+
include SurveyGizmo::MultilingualTitle
|
5
6
|
|
6
7
|
attribute :id, Integer
|
7
|
-
attribute :title, Hash
|
8
8
|
attribute :type, String
|
9
9
|
attribute :description, String
|
10
10
|
attribute :shortname, String
|
@@ -17,26 +17,24 @@ module SurveyGizmo; module API
|
|
17
17
|
|
18
18
|
alias_attribute :_subtype, :type
|
19
19
|
|
20
|
-
include SurveyGizmo::MultilingualTitle
|
21
|
-
|
22
20
|
route '/survey/:survey_id/surveyquestion/:id', via: :get
|
23
21
|
route '/survey/:survey_id/surveypage/:page_id/surveyquestion', via: :create
|
24
22
|
route '/survey/:survey_id/surveypage/:page_id/surveyquestion/:id', via: [:update, :delete]
|
25
23
|
|
26
24
|
def survey
|
27
|
-
@survey ||=
|
25
|
+
@survey ||= Survey.first(id: survey_id)
|
28
26
|
end
|
29
27
|
|
30
28
|
def options
|
31
|
-
@options ||=
|
29
|
+
@options ||= Option.all(survey_id: survey_id, page_id: page_id, question_id: id, all_pages: true)
|
32
30
|
end
|
33
31
|
|
34
32
|
def parent_question
|
35
|
-
@parent_question ||= parent_question_id ?
|
33
|
+
@parent_question ||= parent_question_id ? Question.first(survey_id: survey_id, id: parent_question_id) : nil
|
36
34
|
end
|
37
35
|
|
38
36
|
def sub_questions
|
39
|
-
@sub_questions ||= sub_question_skus.map { |subquestion_id|
|
37
|
+
@sub_questions ||= sub_question_skus.map { |subquestion_id| Question.first(survey_id: survey_id, id: subquestion_id) }
|
40
38
|
.each { |subquestion| subquestion.parent_question_id = id }
|
41
39
|
end
|
42
40
|
|
@@ -3,6 +3,18 @@ module SurveyGizmo; module API
|
|
3
3
|
class Response
|
4
4
|
include SurveyGizmo::Resource
|
5
5
|
|
6
|
+
# Filters
|
7
|
+
NO_TEST_DATA = { field: 'istestdata', operator: '<>', value: 1 }
|
8
|
+
ONLY_COMPLETED = { field: 'status', operator: '=', value: 'Complete' }
|
9
|
+
|
10
|
+
def self.submitted_since_filter(time)
|
11
|
+
{
|
12
|
+
field: 'datesubmitted',
|
13
|
+
operator: '>=',
|
14
|
+
value: time.in_time_zone('Eastern Time (US & Canada)').strftime('%Y-%m-%d %H:%M:%S')
|
15
|
+
}
|
16
|
+
end
|
17
|
+
|
6
18
|
attribute :id, Integer
|
7
19
|
attribute :survey_id, Integer
|
8
20
|
attribute :contact_id, Integer
|
@@ -21,7 +33,7 @@ module SurveyGizmo; module API
|
|
21
33
|
route '/survey/:survey_id/surveyresponse/:id', via: [:get, :update, :delete]
|
22
34
|
|
23
35
|
def survey
|
24
|
-
@survey ||=
|
36
|
+
@survey ||= Survey.first(id: survey_id)
|
25
37
|
end
|
26
38
|
|
27
39
|
def to_param_options
|
@@ -25,18 +25,18 @@ module SurveyGizmo; module API
|
|
25
25
|
route '/survey', via: :create
|
26
26
|
|
27
27
|
def to_param_options
|
28
|
-
{ id:
|
28
|
+
{ id: id }
|
29
29
|
end
|
30
30
|
|
31
31
|
def pages
|
32
|
-
@pages ||=
|
32
|
+
@pages ||= Page.all(survey_id: id, all_pages: true)
|
33
33
|
end
|
34
34
|
|
35
35
|
# Sub question handling is in resource.rb. It should probably be here instead but if it gets moved here
|
36
36
|
# and people try to request all the questions for a specific page directly from a ::API::Question request,
|
37
37
|
# sub questions will not be included! So I left it there for least astonishment.
|
38
38
|
def questions
|
39
|
-
@questions ||= pages.map { |p|
|
39
|
+
@questions ||= pages.map { |p| Question.all(survey_id: id, page_id: p.id, all_pages: true) }.flatten
|
40
40
|
end
|
41
41
|
|
42
42
|
# Statistics array of arrays looks like:
|
@@ -50,19 +50,13 @@ module SurveyGizmo; module API
|
|
50
50
|
end
|
51
51
|
|
52
52
|
def server_has_new_results_since?(time)
|
53
|
-
filters
|
54
|
-
field: 'datesubmitted',
|
55
|
-
operator: '>=',
|
56
|
-
value: time.in_time_zone('Eastern Time (US & Canada)').strftime('%Y-%m-%d %H:%M:%S')
|
57
|
-
}]
|
58
|
-
responses = SurveyGizmo::API::Response.all({ survey_id: self.id }, { page: 1, filters: filters })
|
59
|
-
responses.size > 0
|
53
|
+
Response.all(survey_id: id, filters: [Response.submitted_since_filter(time)]).size > 0
|
60
54
|
end
|
61
55
|
|
62
|
-
# As of 2015-
|
63
|
-
#
|
56
|
+
# As of 2015-12-18, when you request data on multiple surveys from /survey, the team variable comes
|
57
|
+
# back as "0". If you request one survey at a time from /survey/{id}, it is populated correctly.
|
64
58
|
def teams
|
65
|
-
@individual_survey ||=
|
59
|
+
@individual_survey ||= Survey.first(id: id)
|
66
60
|
@individual_survey.team
|
67
61
|
end
|
68
62
|
|
@@ -23,8 +23,8 @@ module SurveyGizmo; module API
|
|
23
23
|
attribute :surveycampaign, Integer
|
24
24
|
attribute :copy, Boolean
|
25
25
|
|
26
|
-
route '/survey/:survey_id/surveycampaign/:id', :
|
27
|
-
route '/survey/:survey_id/surveycampaign', :
|
26
|
+
route '/survey/:survey_id/surveycampaign/:id', via: [:get, :update, :delete]
|
27
|
+
route '/survey/:survey_id/surveycampaign', via: :create
|
28
28
|
|
29
29
|
def to_param_options
|
30
30
|
{ id: self.id, survey_id: self.survey_id }
|
@@ -14,13 +14,16 @@ module SurveyGizmo
|
|
14
14
|
end
|
15
15
|
|
16
16
|
class Configuration
|
17
|
+
DEFAULT_RESULTS_PER_PAGE = 50
|
17
18
|
DEFAULT_API_VERSION = 'v4'
|
18
19
|
|
19
20
|
attr_accessor :api_version
|
20
21
|
attr_accessor :user
|
21
22
|
attr_accessor :password
|
23
|
+
attr_accessor :results_per_page
|
22
24
|
|
23
25
|
def initialize
|
26
|
+
@results_per_page = DEFAULT_RESULTS_PER_PAGE
|
24
27
|
@api_version = DEFAULT_API_VERSION
|
25
28
|
end
|
26
29
|
end
|
@@ -1,11 +1,12 @@
|
|
1
|
-
#
|
2
|
-
#
|
1
|
+
# SurveyGizmo has a bad habit of returning titles in different formats when one is
|
2
|
+
# requesting all surveys vs. an individual survey.
|
3
3
|
|
4
4
|
module SurveyGizmo
|
5
5
|
module MultilingualTitle
|
6
6
|
extend ActiveSupport::Concern
|
7
7
|
|
8
8
|
included do
|
9
|
+
attribute :title, Hash
|
9
10
|
alias_method_chain :title=, :multilingual
|
10
11
|
end
|
11
12
|
|
@@ -18,16 +18,41 @@ module SurveyGizmo
|
|
18
18
|
|
19
19
|
# These are methods that every API resource can use to access resources in SurveyGizmo
|
20
20
|
module ClassMethods
|
21
|
-
# Get an array of resources
|
22
|
-
|
23
|
-
|
24
|
-
|
21
|
+
# Get an array of resources.
|
22
|
+
# @param [Hash] options - simple URL params at the top level, and SurveyGizmo "filters" at the :filters key
|
23
|
+
#
|
24
|
+
# example: { page: 2, filters: [{ field: "istestdata", operator: "<>", value: 1 }] }
|
25
|
+
#
|
26
|
+
# The top level keys (e.g. page, resultsperpage) get encoded in the url, while the
|
27
|
+
# contents of the array of hashes passed at the :filters key get turned into the format
|
28
|
+
# SurveyGizmo expects for its internal filtering, for example:
|
29
|
+
#
|
30
|
+
# filter[field][0]=istestdata&filter[operator][0]=<>&filter[value][0]=1
|
31
|
+
#
|
32
|
+
# Set all_pages: true if you want the gem to page through all the available responses
|
33
|
+
def all(conditions = {}, _deprecated_filters = {})
|
34
|
+
conditions = merge_params(conditions, _deprecated_filters)
|
35
|
+
fail ':all_pages and :page are mutually exclusive' if conditions[:page] && conditions[:all_pages]
|
36
|
+
|
37
|
+
all_pages = conditions.delete(:all_pages)
|
38
|
+
properties = conditions.dup
|
39
|
+
conditions[:resultsperpage] = SurveyGizmo.configuration.results_per_page unless conditions[:resultsperpage]
|
40
|
+
|
41
|
+
request_route = handle_route!(:create, conditions)
|
42
|
+
response = RestResponse.new(SurveyGizmo.get(request_route + filters_to_query_string(conditions)))
|
43
|
+
collection = response.data.map { |datum| datum.is_a?(Hash) ? new(datum) : datum }
|
44
|
+
|
45
|
+
while all_pages && response.current_page < response.total_pages
|
46
|
+
paged_filter = filters_to_query_string(conditions.merge(page: response.current_page + 1))
|
47
|
+
response = RestResponse.new(SurveyGizmo.get(request_route + paged_filter))
|
48
|
+
collection += response.data.map { |datum| datum.is_a?(Hash) ? new(datum) : datum }
|
49
|
+
end
|
25
50
|
|
26
51
|
# Add in the properties from the conditions hash because many of the important ones (like survey_id) are
|
27
52
|
# not often part of the SurveyGizmo returned data
|
28
|
-
|
29
|
-
if
|
30
|
-
|
53
|
+
properties.each do |k,v|
|
54
|
+
if v && instance_methods.include?(k)
|
55
|
+
collection.each { |c| c[k] ||= v }
|
31
56
|
end
|
32
57
|
end
|
33
58
|
|
@@ -35,18 +60,21 @@ module SurveyGizmo
|
|
35
60
|
# SurveyGizmo claims they will fix this bug and eventually all questions will be
|
36
61
|
# returned in one request.
|
37
62
|
if self == SurveyGizmo::API::Question
|
38
|
-
|
63
|
+
collection += collection.map { |question| question.sub_questions }.flatten
|
39
64
|
end
|
40
65
|
|
41
|
-
|
66
|
+
collection
|
42
67
|
end
|
43
68
|
|
44
|
-
# Retrieve a single resource.
|
45
|
-
def first(conditions = {}
|
46
|
-
|
69
|
+
# Retrieve a single resource. See usage comment on .all
|
70
|
+
def first(conditions, _deprecated_filters = {})
|
71
|
+
conditions = merge_params(conditions, _deprecated_filters)
|
72
|
+
properties = conditions.dup
|
73
|
+
|
74
|
+
response = RestResponse.new(SurveyGizmo.get(handle_route!(:get, conditions) + filters_to_query_string(conditions)))
|
47
75
|
# Add in the properties from the conditions hash because many of the important ones (like survey_id) are
|
48
76
|
# not often part of the SurveyGizmo's returned data
|
49
|
-
new(
|
77
|
+
new(properties.merge(response.data))
|
50
78
|
end
|
51
79
|
|
52
80
|
# Create a new resource. Returns the newly created Resource instance.
|
@@ -58,7 +86,7 @@ module SurveyGizmo
|
|
58
86
|
|
59
87
|
# Delete resources
|
60
88
|
def destroy(conditions)
|
61
|
-
RestResponse.new(SurveyGizmo.delete(handle_route(:delete, conditions)))
|
89
|
+
RestResponse.new(SurveyGizmo.delete(handle_route!(:delete, conditions)))
|
62
90
|
end
|
63
91
|
|
64
92
|
# Define the path where a resource is located
|
@@ -68,56 +96,52 @@ module SurveyGizmo
|
|
68
96
|
methods.is_a?(Array) ? methods.each { |m| @paths[m] = path } : (@paths[methods] = path)
|
69
97
|
end
|
70
98
|
|
71
|
-
#
|
99
|
+
# Replaces the :page_id, :survey_id, etc strings defined in each model's URI routes with the
|
72
100
|
# values being passed in interpolation hash with the same keys.
|
73
|
-
|
101
|
+
#
|
102
|
+
# This method has the SIDE EFFECT of deleting REST path related keys from interpolation_hash!
|
103
|
+
def handle_route!(key, interpolation_hash)
|
74
104
|
path = @paths[key]
|
75
|
-
fail "No routes defined for `#{key}` in #{
|
105
|
+
fail "No routes defined for `#{key}` in #{name}" unless path
|
76
106
|
fail "User/password hash not setup!" if SurveyGizmo.default_params.empty?
|
77
107
|
|
78
108
|
path.gsub(/:(\w+)/) do |m|
|
79
109
|
raise(SurveyGizmo::URLError, "Missing RESTful parameters in request: `#{m}`") unless interpolation_hash[$1.to_sym]
|
80
|
-
interpolation_hash
|
110
|
+
interpolation_hash.delete($1.to_sym)
|
81
111
|
end
|
82
112
|
end
|
83
113
|
|
84
|
-
|
85
|
-
|
86
|
-
#
|
87
|
-
|
88
|
-
# example input: { page: 2, filters: [{:field=>"istestdata", :operator=>"<>", :value=>1}] }
|
89
|
-
#
|
90
|
-
# The top level keys (e.g. page, resultsperpage) get simply encoded in the url, while the
|
91
|
-
# contents of the array of hashes passed in the filters hash get turned into the format
|
92
|
-
# SurveyGizmo expects for its internal filtering, for example:
|
93
|
-
#
|
94
|
-
# filter[field][0]=istestdata&filter[operator][0]=<>&filter[value][0]=1
|
95
|
-
def convert_filters_into_query_string(filters = nil)
|
114
|
+
private
|
115
|
+
|
116
|
+
# Convert a [Hash] of params and internal surveygizmo style filters into a query string
|
117
|
+
def filters_to_query_string(filters = {})
|
96
118
|
return '' unless filters && filters.size > 0
|
97
119
|
|
98
|
-
|
99
|
-
|
100
|
-
|
101
|
-
|
102
|
-
|
103
|
-
|
104
|
-
|
105
|
-
)
|
120
|
+
params = {}
|
121
|
+
(filters.delete(:filters) || []).each_with_index do |filter, i|
|
122
|
+
fail "Bad filter params: #{filter}" unless filter.is_a?(Hash) && [:field, :operator, :value].all? { |k| filter[k] }
|
123
|
+
|
124
|
+
params["filter[field][#{i}]".to_sym] = "#{filter[:field]}"
|
125
|
+
params["filter[operator][#{i}]".to_sym] = "#{filter[:operator]}"
|
126
|
+
params["filter[value][#{i}]".to_sym] = "#{filter[:value]}"
|
106
127
|
end
|
107
|
-
simple_filters = filters.reject { |k,v| k == :filters }
|
108
|
-
filter_hash.merge!(simple_filters)
|
109
128
|
|
110
129
|
uri = Addressable::URI.new
|
111
|
-
uri.query_values =
|
130
|
+
uri.query_values = params.merge(filters)
|
112
131
|
"?#{uri.query}"
|
113
132
|
end
|
133
|
+
|
134
|
+
def merge_params(conditions, _deprecated_filters)
|
135
|
+
$stderr.puts('Use of the 2nd hash parameter is deprecated.') unless _deprecated_filters.empty?
|
136
|
+
conditions.merge(_deprecated_filters || {})
|
137
|
+
end
|
114
138
|
end
|
115
139
|
|
116
140
|
# Save the resource to SurveyGizmo
|
117
141
|
def save
|
118
142
|
if id
|
119
143
|
# Then it's an update, because we already know the surveygizmo assigned id
|
120
|
-
RestResponse.new(SurveyGizmo.post(handle_route(:update), query:
|
144
|
+
RestResponse.new(SurveyGizmo.post(handle_route(:update), query: attributes_without_blanks))
|
121
145
|
else
|
122
146
|
create_record_in_surveygizmo
|
123
147
|
end
|
@@ -143,46 +167,32 @@ module SurveyGizmo
|
|
143
167
|
|
144
168
|
# Returns itself if successfully saved, but with attributes added by SurveyGizmo
|
145
169
|
def create_record_in_surveygizmo(attributes = {})
|
146
|
-
rest_response = RestResponse.new(SurveyGizmo.put(handle_route(:create), query:
|
170
|
+
rest_response = RestResponse.new(SurveyGizmo.put(handle_route(:create), query: attributes_without_blanks))
|
147
171
|
self.attributes = rest_response.data
|
148
172
|
self
|
149
173
|
end
|
150
174
|
|
151
175
|
def inspect
|
152
|
-
if ENV['GIZMO_DEBUG']
|
153
|
-
ap "CLASS: #{self.class}"
|
154
|
-
end
|
155
|
-
|
156
176
|
attribute_strings = self.class.attribute_set.map do |attrib|
|
157
|
-
|
158
|
-
|
159
|
-
ap attrib.name
|
160
|
-
ap self.send(attrib.name)
|
161
|
-
ap self.send(attrib.name).class
|
162
|
-
end
|
163
|
-
|
164
|
-
if self.send(attrib.name).class == Hash
|
165
|
-
value = self.send(attrib.name).inspect
|
166
|
-
else
|
167
|
-
value = self.send(attrib.name).to_s
|
168
|
-
end
|
177
|
+
value = self.send(attrib.name)
|
178
|
+
value = value.is_a?(Hash) ? value.inspect : value.to_s
|
169
179
|
|
170
180
|
" \"#{attrib.name}\" => \"#{value}\"\n" unless value.strip.blank?
|
171
181
|
end.compact
|
172
182
|
|
173
|
-
"#<#{self.class.name}:#{self.object_id}>\n#{attribute_strings.join
|
183
|
+
"#<#{self.class.name}:#{self.object_id}>\n#{attribute_strings.join}"
|
174
184
|
end
|
175
185
|
|
176
186
|
protected
|
177
187
|
|
178
188
|
def attributes_without_blanks
|
179
|
-
|
189
|
+
attributes.reject { |k,v| v.blank? }
|
180
190
|
end
|
181
191
|
|
182
192
|
private
|
183
193
|
|
184
194
|
def handle_route(key)
|
185
|
-
self.class.handle_route(key, to_param_options)
|
195
|
+
self.class.handle_route!(key, to_param_options)
|
186
196
|
end
|
187
197
|
end
|
188
198
|
end
|
@@ -1,22 +1,23 @@
|
|
1
1
|
# This class normalizes the response returned by Survey Gizmo, including validation.
|
2
|
+
|
2
3
|
class RestResponse
|
3
4
|
attr_accessor :raw_response
|
4
5
|
attr_accessor :parsed_response
|
5
6
|
|
6
|
-
def initialize(
|
7
|
-
@raw_response =
|
8
|
-
@parsed_response =
|
7
|
+
def initialize(http_response)
|
8
|
+
@raw_response = http_response
|
9
|
+
@parsed_response = http_response.parsed_response
|
9
10
|
|
10
11
|
if ENV['GIZMO_DEBUG']
|
11
|
-
ap '
|
12
|
+
ap 'Parsed SurveyGizmo Response:'
|
12
13
|
ap @parsed_response
|
13
14
|
end
|
14
15
|
|
15
|
-
fail "Bad response: #{
|
16
|
+
fail "Bad response: #{http_response.inspect}" unless @parsed_response['result_ok'] && @parsed_response['result_ok'].to_s.downcase == 'true'
|
16
17
|
return unless data
|
17
18
|
|
18
19
|
# Handle really crappy [] notation in SG API, so far just in SurveyResponse
|
19
|
-
(data.is_a?(Array) ? data : [data]).each do |datum|
|
20
|
+
(data.is_a?(Array) ? data : [data]).compact.each do |datum|
|
20
21
|
unless datum['datesubmitted'].blank?
|
21
22
|
# SurveyGizmo returns date information in EST but does not provide time zone information.
|
22
23
|
# See https://surveygizmov4.helpgizmo.com/help/article/link/date-and-time-submitted
|
@@ -47,12 +48,20 @@ class RestResponse
|
|
47
48
|
|
48
49
|
# The parsed JSON data of the response
|
49
50
|
def data
|
50
|
-
@
|
51
|
+
@parsed_response['data']
|
51
52
|
end
|
52
53
|
|
53
54
|
# The error message if there is one
|
54
55
|
def message
|
55
|
-
@
|
56
|
+
@parsed_response['message']
|
57
|
+
end
|
58
|
+
|
59
|
+
def current_page
|
60
|
+
@parsed_response['page']
|
61
|
+
end
|
62
|
+
|
63
|
+
def total_pages
|
64
|
+
@parsed_response['total_pages']
|
56
65
|
end
|
57
66
|
|
58
67
|
private
|
data/lib/survey_gizmo/version.rb
CHANGED
data/spec/resource_spec.rb
CHANGED
@@ -36,16 +36,16 @@ describe 'Survey Gizmo Resource' do
|
|
36
36
|
it_should_behave_like 'an API object'
|
37
37
|
it_should_behave_like 'an object with errors'
|
38
38
|
|
39
|
-
context '#
|
39
|
+
context '#filters_to_query_string' do
|
40
40
|
let(:page) { 2 }
|
41
41
|
let(:filters) { { page: page, filters: [{ field: 'istestdata', operator: '<>', value: 1 }] } }
|
42
42
|
|
43
43
|
it 'should generate the correct page request' do
|
44
|
-
expect(SurveyGizmoSpec::ResourceTest.
|
44
|
+
expect(SurveyGizmoSpec::ResourceTest.send(:filters_to_query_string, { page: page })).to eq("?page=#{page}")
|
45
45
|
end
|
46
46
|
|
47
47
|
it 'should generate the correct filter fragment' do
|
48
|
-
expect(SurveyGizmoSpec::ResourceTest.
|
48
|
+
expect(SurveyGizmoSpec::ResourceTest.send(:filters_to_query_string, filters)).to eq("?filter%5Bfield%5D%5B0%5D=istestdata&filter%5Boperator%5D%5B0%5D=%3C%3E&filter%5Bvalue%5D%5B0%5D=1&page=#{page}")
|
49
49
|
end
|
50
50
|
end
|
51
51
|
end
|
@@ -72,10 +72,10 @@ describe 'Survey Gizmo Resource' do
|
|
72
72
|
|
73
73
|
describe SurveyGizmo::API::Question do
|
74
74
|
let(:base_params) { {survey_id: 1234, page_id: 1} }
|
75
|
-
let(:create_attributes) { base_params.merge(title: 'Spec Question', type: 'radio', properties: {'required' => true, 'option_sort' => false}) }
|
75
|
+
let(:create_attributes) { base_params.merge(title: 'Spec Question', type: 'radio', properties: { 'required' => true, 'option_sort' => false }) }
|
76
76
|
let(:update_attributes) { base_params.merge(title: 'Updated') }
|
77
77
|
let(:first_params) { base_params.merge(id: 1) }
|
78
|
-
let(:get_attributes) { create_attributes.merge(id: 1) }
|
78
|
+
let(:get_attributes) { create_attributes.merge(id: 1).reject { |k, v| k == :properties } }
|
79
79
|
let(:uri_paths) {
|
80
80
|
{ :get => '/survey/1234/surveyquestion/1',
|
81
81
|
:create => '/survey/1234/surveypage/1/surveyquestion',
|
@@ -96,7 +96,7 @@ describe 'Survey Gizmo Resource' do
|
|
96
96
|
end
|
97
97
|
|
98
98
|
it 'should have no subquestions' do
|
99
|
-
expect(described_class.new
|
99
|
+
expect(described_class.new.sub_questions).to eq([])
|
100
100
|
end
|
101
101
|
|
102
102
|
it 'should find the survey' do
|
@@ -107,7 +107,8 @@ describe 'Survey Gizmo Resource' do
|
|
107
107
|
|
108
108
|
context 'with subquestions' do
|
109
109
|
let(:parent_id) { 33 }
|
110
|
-
let(:question_with_subquestions) { described_class.new(id: parent_id, survey_id: 1234, sub_question_skus: [1, 2])}
|
110
|
+
let(:question_with_subquestions) { described_class.new(id: parent_id, survey_id: 1234, sub_question_skus: [1, 2]) }
|
111
|
+
|
111
112
|
it 'should have 2 subquestions and they should have the right parent question' do
|
112
113
|
stub_request(:get, /#{@base}/).to_return(json_response(true, get_attributes))
|
113
114
|
expect(question_with_subquestions.sub_questions.size).to eq(2)
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: survey-gizmo-ruby
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 4.
|
4
|
+
version: 4.1.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Kabari Hendrick
|
@@ -11,7 +11,7 @@ authors:
|
|
11
11
|
autorequire:
|
12
12
|
bindir: bin
|
13
13
|
cert_chain: []
|
14
|
-
date: 2015-
|
14
|
+
date: 2015-12-18 00:00:00.000000000 Z
|
15
15
|
dependencies:
|
16
16
|
- !ruby/object:Gem::Dependency
|
17
17
|
name: activesupport
|