surveymonkey 0.3.0 → 0.4.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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 6e1ba04b72f387956b57379112fcc3d0b2af52bc
4
- data.tar.gz: 646d1fbe102a8c982f8bf6d360e602dd790577bb
3
+ metadata.gz: f76a9537a7930fbe4e0cb07df9a37ae6f0af006b
4
+ data.tar.gz: 40359b7c3c9f074de14439a927ab2487e12ea158
5
5
  SHA512:
6
- metadata.gz: 84eb3f064ff7f5538fb07c0d542616a88e60230360d6f56bdfcd6f7716adbae616bc035e1472fb693dcc9959372047e617f58b17a21e7f7807fcc5aaf915b29c
7
- data.tar.gz: 93123b3ba30cf464513bd35f603fe1b93bcf3d19f5add1e7db5f8475cdf0637d51757ece7bdf774f91197aae3237590aa3a6c0a70618b6e7b1c68f7b12b9cc08
6
+ metadata.gz: daa7736f969950a13f79936f0047d712110e113bea725503da70629b4b3f651b5a732d042d31107dcb6cf4109c3f784eb254903814be6af60731b370e3fe4578
7
+ data.tar.gz: 50840782d00d245888fd066e80f9f5c6fab6a9cd00ad949281d3a68b2da71dbbf698176a8c88da38e24f41386bfc3f0a0a56c0e82182c273bd144a7548481dac
data/lib/surveymonkey.rb CHANGED
@@ -1,7 +1,9 @@
1
+ require "deep_merge"
1
2
  require "logging"
2
3
 
3
4
  require "surveymonkey/version"
4
5
  require "surveymonkey/logging"
6
+ require "surveymonkey/error"
5
7
  require "surveymonkey/request"
6
8
 
7
9
  ##
@@ -12,6 +14,21 @@ module Surveymonkey
12
14
  class << self
13
15
  # Constants
14
16
 
17
+ ##
18
+ # Default page size for paginated API requests
19
+
20
+ DefaultPageSize = 1000
21
+
22
+ ##
23
+ # API methods that support pagination
24
+
25
+ PaginatedMethods = {
26
+ :get_survey_list => 'surveys',
27
+ :get_collector_list => 'collectors',
28
+ :get_respondent_list => 'respondents',
29
+ :get_template_list => 'templates',
30
+ }
31
+
15
32
  # Public methods
16
33
 
17
34
  ##
@@ -21,29 +38,112 @@ module Surveymonkey
21
38
 
22
39
  def method_missing(method_name, *args)
23
40
  begin
24
- $log.debug(sprintf("%s: %s\n", __method__, 'enter'))
41
+ $log.debug sprintf("%s: %s\n", __method__, 'enter')
25
42
 
26
- method_params = Hash(Array(args).shift) || {}
27
- $log.debug(sprintf("%s: method_params: %s\n", __method__, method_params.inspect))
43
+ the_args = Hash(Array(args).shift) || {}
28
44
 
29
- request = Surveymonkey::Request.new(method_name.to_s, method_params)
30
- response = request.execute
31
- response
45
+ # extract page_size if passed in args
46
+ page_size = the_args.delete('page_size') { |key| DefaultPageSize }.to_i
47
+ $log.debug sprintf("%s: page_size: %i\n", __method__, page_size)
48
+
49
+ method_params = the_args
50
+ $log.debug sprintf("%s: method_params: %s\n", __method__, method_params.inspect)
51
+
52
+ # is this a paginated method?
53
+ pagination_field = PaginatedMethods.fetch(method_name, nil)
54
+ if pagination_field
55
+ $log.info sprintf("calling method '%s' with pagination, page size %i", method_name, page_size)
56
+ paginate_request(method_name, pagination_field, page_size, method_params)
57
+ else
58
+ $log.info sprintf("calling method '%s' without pagination", method_name)
59
+ Surveymonkey::Request.new(method_name.to_s, method_params).execute
60
+ end
32
61
 
33
62
  rescue TypeError => e
34
- $log.fatal(sprintf("%s: method parameters must be a hash\n", __method__))
63
+ $log.fatal sprintf("%s: method parameters must be a hash\n", __method__)
35
64
  exit 1
65
+
36
66
  rescue KeyError => e
37
- $log.fatal(sprintf("%s: method '%s' not implemented\n", __method__, method_name.to_s))
67
+ $log.fatal sprintf("%s: method '%s' not implemented\n", __method__, method_name.to_s)
38
68
  exit 1
69
+
39
70
  rescue StandardError => e
40
- $log.error(sprintf("%s: %s\n", __method__, e.message))
41
- raise
71
+ $log.error sprintf("%s: %s\n", __method__, e.message)
72
+ raise e
73
+
42
74
  end
43
75
  end
44
76
 
45
77
  # Private methods
46
78
  private
47
79
 
80
+ ##
81
+ # Execute a series of requests, collating the results.
82
+
83
+ def paginate_request(api_method, field, page_size = 1000, method_params = {}) # :nodoc:
84
+ begin
85
+ $log.debug sprintf("%s: enter", __method__)
86
+
87
+ current_page = 1
88
+ num_results = page_size
89
+ final_response = {}
90
+ results = []
91
+
92
+ $log.info sprintf("%s: requesting pages of %i items", __method__, page_size)
93
+
94
+ while num_results >= page_size
95
+
96
+ method_params.merge!({'page' => current_page})
97
+ method_params.merge!({'page_size' => page_size})
98
+
99
+ $log.debug sprintf("requesting %s: %s", api_method, method_params.inspect)
100
+
101
+ response = execute_request(api_method.to_sym, method_params)
102
+
103
+ page_results = response.fetch('data', {}).fetch(field, [])
104
+
105
+ $log.info sprintf("%s returned batch of %i results", api_method, page_results.length)
106
+
107
+ results.concat(page_results)
108
+
109
+ $log.info sprintf("%i total results collected from %s", results.length, api_method)
110
+
111
+ num_results = page_results.length
112
+
113
+ current_page = current_page.next
114
+
115
+ final_response.deep_merge!(response)
116
+ end
117
+
118
+ final_response['data'].store(field, results.uniq)
119
+
120
+ final_response
121
+
122
+ rescue Surveymonkey::Error => e
123
+ $log.error sprintf("SurveyMonkey API error: %s", e.message)
124
+ raise e
125
+
126
+ rescue StandardError => e
127
+ $log.error(sprintf("%s: %s\n", __method__, e.message))
128
+ raise e
129
+
130
+ end
131
+ end
132
+
133
+ ##
134
+ # Execute a single API request.
135
+ def execute_request(method_name, method_params = {}) # :nodoc:
136
+ begin
137
+ $log.debug sprintf("%s: %s %s", __method__, method_name.to_s, method_params.inspect)
138
+
139
+ Surveymonkey::Request.new(method_name.to_s, {'method_params' => method_params}).execute
140
+
141
+ rescue StandardError => e
142
+ $log.error sprintf("%s: %s\n", __method__, e.message)
143
+ raise e
144
+
145
+ end
146
+ end
147
+
48
148
  end
49
149
  end
@@ -2,5 +2,5 @@
2
2
  # Specify the version of the surveymonkey gem.
3
3
 
4
4
  module Surveymonkey
5
- VERSION = "0.3.0"
5
+ VERSION = "0.4.0"
6
6
  end
data/surveymonkey.gemspec CHANGED
@@ -28,6 +28,7 @@ Gem::Specification.new do |spec|
28
28
  spec.add_development_dependency "rspec", "~> 2.4"
29
29
  spec.add_development_dependency "rubygems-tasks", "~> 0.2"
30
30
 
31
+ spec.add_runtime_dependency "deep_merge", "~> 1"
31
32
  spec.add_runtime_dependency "httparty", "~> 0.13"
32
33
  spec.add_runtime_dependency "json", "~> 1.8"
33
34
  spec.add_runtime_dependency "logging", "~> 2"
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: surveymonkey
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.3.0
4
+ version: 0.4.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Steve Huff
8
8
  autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2015-05-13 00:00:00.000000000 Z
11
+ date: 2015-05-26 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: bundler
@@ -94,6 +94,20 @@ dependencies:
94
94
  - - ~>
95
95
  - !ruby/object:Gem::Version
96
96
  version: '0.2'
97
+ - !ruby/object:Gem::Dependency
98
+ name: deep_merge
99
+ requirement: !ruby/object:Gem::Requirement
100
+ requirements:
101
+ - - ~>
102
+ - !ruby/object:Gem::Version
103
+ version: '1'
104
+ type: :runtime
105
+ prerelease: false
106
+ version_requirements: !ruby/object:Gem::Requirement
107
+ requirements:
108
+ - - ~>
109
+ - !ruby/object:Gem::Version
110
+ version: '1'
97
111
  - !ruby/object:Gem::Dependency
98
112
  name: httparty
99
113
  requirement: !ruby/object:Gem::Requirement