survey-gizmo-ruby 4.0.0 → 4.1.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.
- 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
|