surveymonkey 0.3.0 → 0.4.0

Sign up to get free protection for your applications and to get access to all the features.
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