formstack-api 0.0.1 → 0.0.3
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/lib/formstack/api/version.rb +1 -1
- data/lib/formstack/api.rb +169 -1
- data/spec/fs-logo.png +0 -0
- data/spec/support/vcr.rb +34 -7
- data/spec/vcr/Formstack_API/_copy_form/adds_COPY_at_the_end_of_the_form_name.yml +434 -0
- data/spec/vcr/Formstack_API/_create_field/creates_a_field_with_embeded_code.yml +43 -0
- data/spec/vcr/Formstack_API/_create_field/creates_a_text_field.yml +43 -0
- data/spec/vcr/Formstack_API/_delete_submission/deletes_a_submission.yml +142 -0
- data/spec/vcr/Formstack_API/_edit_submission_data/edits_a_submission_succesfully.yml +373 -0
- data/spec/vcr/Formstack_API/_edit_submission_data/raises_an_exception_if_fields_are_non_numeric.yml +66 -0
- data/spec/vcr/Formstack_API/_edit_submission_data/raises_an_exception_when_data_array_and_ids_don_t_match.yml +66 -0
- data/spec/vcr/Formstack_API/_edit_submission_data/raises_an_exception_when_data_array_and_ids_don_t_match_reversed.yml +66 -0
- data/spec/vcr/Formstack_API/_edit_submission_data/raises_an_exception_with_a_bad_timestamp.yml +66 -0
- data/spec/vcr/Formstack_API/_form_submissions/gets_submissions_default.yml +388 -245
- data/spec/vcr/Formstack_API/_form_submissions/raises_an_error_if_page_number_is_not_working.yml +79 -0
- data/spec/vcr/Formstack_API/_form_submissions/returns_data_if_specified.yml +245 -0
- data/spec/vcr/Formstack_API/_form_submissions/returns_no_data_by_default.yml +65 -0
- data/spec/vcr/Formstack_API/_get_submission_details/gets_the_right_submission_from_the_right_form.yml +43 -0
- data/spec/vcr/Formstack_API/_submit_form/creates_a_submission_into_a_form.yml +46 -0
- data/spec/vcr/Formstack_API/_submit_form/uploads_an_image.yml +44 -0
- data/spec/wrapper_spec.rb +217 -20
- metadata +32 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: ad366b35bf42497cc4d1735aeac2b9232523b97e
|
4
|
+
data.tar.gz: 302454bbbe75c49f7be732f234b6be5f19c81b34
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 58bcdfdbea8345d3668b493a7686dc296df7440847e76f97fd5a46384b23c2226c85d3da2455e40c2ef89f1ba13e4e8a15c9e6b0325ca7a666acc9ff17f4320a
|
7
|
+
data.tar.gz: dd1f98dfafda3c1d8765c7bcede742a42a36d79a3c401d0cad1f13ae9c965f9639ff34dd10129088ea46b36b1982e83b9d4ade893181b91ed98333f78e3b1d66
|
data/lib/formstack/api.rb
CHANGED
@@ -8,6 +8,27 @@ module Formstack
|
|
8
8
|
|
9
9
|
include HTTParty
|
10
10
|
|
11
|
+
FIELD_TYPES = [
|
12
|
+
'text',
|
13
|
+
'textarea',
|
14
|
+
'name',
|
15
|
+
'address',
|
16
|
+
'email',
|
17
|
+
'phone',
|
18
|
+
'creditcard',
|
19
|
+
'datetime',
|
20
|
+
'file',
|
21
|
+
'number',
|
22
|
+
'select',
|
23
|
+
'radio',
|
24
|
+
'checkbox',
|
25
|
+
'matrix',
|
26
|
+
'richtext',
|
27
|
+
'embed',
|
28
|
+
'product',
|
29
|
+
'section',
|
30
|
+
]
|
31
|
+
|
11
32
|
def initialize(access_token)
|
12
33
|
@access_token = access_token
|
13
34
|
@api_url = 'https://www.formstack.com/api/v2/'
|
@@ -35,6 +56,10 @@ module Formstack
|
|
35
56
|
response = self.class.get(url, arguments )
|
36
57
|
when 'POST'
|
37
58
|
response = self.class.post(url, arguments )
|
59
|
+
when 'PUT'
|
60
|
+
response = self.class.put(url, arguments )
|
61
|
+
when 'DELETE'
|
62
|
+
response = self.class.delete(url, arguments )
|
38
63
|
end
|
39
64
|
|
40
65
|
if response.code < 200 || response.code >= 300
|
@@ -118,17 +143,160 @@ module Formstack
|
|
118
143
|
'expand_data' => expand_data,
|
119
144
|
}
|
120
145
|
|
146
|
+
arguments.delete('data') unless data
|
147
|
+
arguments.delete('expand_data') unless expand_data
|
148
|
+
|
149
|
+
arguments = API.clean_arguments(arguments)
|
150
|
+
|
121
151
|
search_fields.each_with_index do |field, idx|
|
122
152
|
arguments["search_field_#{idx}"] = search_field_ids[idx]
|
123
153
|
arguments["search_value_#{idx}"] = search_field_values[idx]
|
124
154
|
end
|
125
155
|
|
126
|
-
response = request(end_point, 'GET', arguments)
|
156
|
+
response = request(end_point, 'GET', { body: arguments })
|
127
157
|
response['submissions']
|
128
158
|
end
|
129
159
|
|
160
|
+
def submit_form(form_id,
|
161
|
+
field_ids = [],
|
162
|
+
field_values = [],
|
163
|
+
timestamp = '',
|
164
|
+
user_agent = '',
|
165
|
+
ip_address = '',
|
166
|
+
payment_status = '',
|
167
|
+
read = false)
|
168
|
+
|
169
|
+
arguments = {
|
170
|
+
'timestamp' => timestamp,
|
171
|
+
'user_agent' => user_agent,
|
172
|
+
'remote_addr' => ip_address,
|
173
|
+
'payment_status' => payment_status,
|
174
|
+
'read' => read ? 1 : 0
|
175
|
+
}
|
176
|
+
|
177
|
+
is_numeric?(form_id)
|
178
|
+
|
179
|
+
unless timestamp.empty?
|
180
|
+
begin
|
181
|
+
Time.parse(timestamp)
|
182
|
+
rescue Exception => e
|
183
|
+
raise 'You must use a valid Date/Time string formatted in YYYY-MM-DD HH:MM:SS'
|
184
|
+
end
|
185
|
+
end
|
186
|
+
|
187
|
+
raise 'There must be a one-to-one relationship between Field IDs and their values' unless field_ids.size == field_values.size
|
188
|
+
|
189
|
+
arguments = API.clean_arguments(arguments)
|
190
|
+
arguments = API.add_field_data(arguments, field_ids, field_values)
|
191
|
+
|
192
|
+
response = request("form/#{form_id}/submission.json", 'POST', { body: arguments } )
|
193
|
+
end
|
194
|
+
|
195
|
+
def get_submission_details(submission_id, encryption_password = '')
|
196
|
+
arguments = {}
|
197
|
+
arguments['encryption_password'] = encryption_password unless encryption_password.empty?
|
198
|
+
|
199
|
+
raise 'Submission ID must be numeric' unless submission_id.is_a? Numeric
|
200
|
+
|
201
|
+
response = request("submission/#{submission_id}.json", 'GET', arguments)
|
202
|
+
end
|
203
|
+
|
204
|
+
def edit_submission_data(submission_id,
|
205
|
+
field_ids = [],
|
206
|
+
field_values = [],
|
207
|
+
timestamp = '',
|
208
|
+
user_agent = '',
|
209
|
+
ip_address = '',
|
210
|
+
payment_status = '',
|
211
|
+
read = false)
|
212
|
+
|
213
|
+
arguments = {
|
214
|
+
'timestamp' => timestamp,
|
215
|
+
'user_agent' => user_agent,
|
216
|
+
'remote_addr' => ip_address,
|
217
|
+
'payment_status' => payment_status,
|
218
|
+
'read' => read ? 1 : 0
|
219
|
+
}
|
220
|
+
|
221
|
+
raise 'Submission ID must be numeric' unless submission_id.is_a? Numeric
|
222
|
+
|
223
|
+
unless timestamp.empty?
|
224
|
+
begin
|
225
|
+
Time.parse(timestamp)
|
226
|
+
rescue Exception => e
|
227
|
+
raise 'You must use a valid Date/Time string formatted in YYYY-MM-DD HH:MM:SS'
|
228
|
+
end
|
229
|
+
end
|
230
|
+
|
231
|
+
arguments = API.clean_arguments(arguments)
|
232
|
+
arguments = API.add_field_data(arguments, field_ids, field_values)
|
233
|
+
|
234
|
+
request("submission/#{submission_id}.json", 'PUT', { body: arguments } )
|
235
|
+
end
|
236
|
+
|
237
|
+
def delete_submission(submission_id)
|
238
|
+
raise 'Submission ID must be numeric' unless submission_id.is_a? Numeric
|
239
|
+
|
240
|
+
request("submission/#{submission_id}", 'DELETE' )
|
241
|
+
end
|
242
|
+
|
243
|
+
def create_field(form_id, field_type = '', label = '', hide_label = false,
|
244
|
+
description = '', use_callout = false,
|
245
|
+
field_specific_attributes = [], default_value = '',
|
246
|
+
options = [], options_values = [], required = false,
|
247
|
+
read_only = false, hidden = false, unique = false,
|
248
|
+
column_span = nil, sort = nil)
|
249
|
+
|
250
|
+
is_numeric?(form_id)
|
251
|
+
|
252
|
+
raise 'Provided Field Type is not in the list of known Field types' unless FIELD_TYPES.include? field_type
|
253
|
+
|
254
|
+
arguments = {}
|
255
|
+
|
256
|
+
arguments['field_type'] = field_type
|
257
|
+
arguments['label'] = label unless label.empty?
|
258
|
+
arguments['hide_label'] = 1 if hide_label
|
259
|
+
arguments['description'] = description unless description.empty?
|
260
|
+
arguments['description_callout'] = 1 if use_callout
|
261
|
+
arguments['default_value'] = default_value unless default_value.empty?
|
262
|
+
arguments['options'] = options unless options.empty?
|
263
|
+
arguments['options_values'] = options_values unless options_values.empty?
|
264
|
+
arguments['required'] = 1 if required
|
265
|
+
arguments['read_only'] = 1 if read_only
|
266
|
+
arguments['hidden'] = 1 if hidden
|
267
|
+
arguments['unique'] = 1 if unique
|
268
|
+
arguments['colspan'] = column_span unless column_span.nil?
|
269
|
+
arguments['sort'] = sort unless sort.nil?
|
270
|
+
|
271
|
+
request("form/#{form_id}/field", 'POST', { body: arguments } )
|
272
|
+
end
|
273
|
+
|
130
274
|
private
|
131
275
|
|
276
|
+
def self.add_field_data(arguments, field_ids, field_values)
|
277
|
+
|
278
|
+
if field_ids.empty?
|
279
|
+
raise 'There must be a one-to-one relationship between Field IDs and their values' if field_ids.size != field_values.size
|
280
|
+
end
|
281
|
+
|
282
|
+
field_ids.each_with_index do |id, i|
|
283
|
+
raise 'Field IDs must be numeric' unless id.is_a? Numeric
|
284
|
+
arguments["field_#{field_ids[i]}"] = field_values[i]
|
285
|
+
end
|
286
|
+
|
287
|
+
arguments
|
288
|
+
end
|
289
|
+
|
290
|
+
def self.clean_arguments(args)
|
291
|
+
arguments = {}
|
292
|
+
|
293
|
+
args.each_pair do |key, value|
|
294
|
+
arguments[key] = value unless value == ''
|
295
|
+
end
|
296
|
+
|
297
|
+
arguments
|
298
|
+
end
|
299
|
+
|
132
300
|
def is_numeric?(form_id)
|
133
301
|
unless form_id.is_a? Numeric
|
134
302
|
raise 'Form ID must be numeric'
|
data/spec/fs-logo.png
ADDED
Binary file
|
data/spec/support/vcr.rb
CHANGED
@@ -1,19 +1,46 @@
|
|
1
1
|
require 'vcr'
|
2
2
|
require 'rspec'
|
3
3
|
|
4
|
-
|
5
|
-
|
6
|
-
|
7
|
-
|
8
|
-
|
9
|
-
|
4
|
+
ACCESS_TOKEN = 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'
|
5
|
+
INACCESSIBLE_FORM_ID = 0000001
|
6
|
+
DELETE_SUBMISSION_FORM = 0000000
|
7
|
+
UPLOAD_FORM_ID = 0000000
|
8
|
+
UPLOAD_FIELD_IDS = 00000000
|
9
|
+
LOGO_PATH = File.join(File.dirname(__FILE__), '../fs-logo.png')
|
10
|
+
SUBMIT_FORM_ID = DELETE_SUBMISSION_FORM
|
11
|
+
CREATE_FIELD_FORM_ID = DELETE_SUBMISSION_FORM
|
12
|
+
SUBMISSION_DETAILS_ID = 000000000
|
13
|
+
SUBMISSION_DETAILS_FORM_ID = 0000000
|
14
|
+
EDIT_SUBMISSION_FIELD_ID = 00000000
|
15
|
+
EDIT_SUBMISSION_ARRAY_FIELD_ID = 00000000
|
16
|
+
|
17
|
+
# ACCESS_TOKEN = '982cf05d56baa2f12db45bea51d68968'
|
18
|
+
# INACCESSIBLE_FORM_ID = 1832744
|
19
|
+
# DELETE_SUBMISSION_FORM = 1873710
|
20
|
+
# UPLOAD_FORM_ID = 1875940
|
21
|
+
# UPLOAD_FIELD_IDS = 28762308
|
22
|
+
# LOGO_PATH = File.join(File.dirname(__FILE__), '../fs-logo.png')
|
23
|
+
# SUBMIT_FORM_ID = DELETE_SUBMISSION_FORM
|
24
|
+
# CREATE_FIELD_FORM_ID = DELETE_SUBMISSION_FORM
|
25
|
+
# SUBMISSION_DETAILS_ID = 171938670
|
26
|
+
# SUBMISSION_DETAILS_FORM_ID = 1873710
|
27
|
+
# EDIT_SUBMISSION_FIELD_ID = 28705506
|
28
|
+
# EDIT_SUBMISSION_ARRAY_FIELD_ID = 28705506
|
10
29
|
|
11
30
|
VCR.configure do |c|
|
12
31
|
c.cassette_library_dir = 'spec/vcr'
|
13
32
|
c.hook_into :webmock # or :fakeweb
|
14
33
|
c.filter_sensitive_data('<ACCESS_TOKEN>') { ACCESS_TOKEN }
|
15
|
-
c.filter_sensitive_data('<FORM_ID>') {
|
34
|
+
c.filter_sensitive_data('<FORM_ID>') { SUBMIT_FORM_ID }
|
16
35
|
c.filter_sensitive_data('<INACCESSIBLE_FORM_ID>') { INACCESSIBLE_FORM_ID }
|
36
|
+
c.filter_sensitive_data('<SUBMISSION_DETAILS_ID>') { SUBMISSION_DETAILS_ID }
|
37
|
+
c.filter_sensitive_data('<UPLOAD_FORM_ID>') { UPLOAD_FORM_ID }
|
38
|
+
c.filter_sensitive_data('<UPLOAD_FIELD_IDS>') { UPLOAD_FIELD_IDS }
|
39
|
+
c.filter_sensitive_data('<LOGO_PATH>') { LOGO_PATH }
|
40
|
+
c.filter_sensitive_data('<SUBMISSION_DETAILS_FORM_ID>') { SUBMISSION_DETAILS_FORM_ID }
|
41
|
+
c.filter_sensitive_data('<DELETE_SUBMISSION_FORM>') { DELETE_SUBMISSION_FORM }
|
42
|
+
c.filter_sensitive_data('<EDIT_SUBMISSION_FIELD_ID>') { EDIT_SUBMISSION_FIELD_ID }
|
43
|
+
c.filter_sensitive_data('<EDIT_SUBMISSION_ARRAY_FIELD_ID>') { EDIT_SUBMISSION_ARRAY_FIELD_ID }
|
17
44
|
c.default_cassette_options = { record: :new_episodes }
|
18
45
|
c.configure_rspec_metadata!
|
19
46
|
end
|