docspring 1.4.1 → 2.0.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.
Files changed (243) hide show
  1. checksums.yaml +4 -4
  2. data/.gitlab-ci.yml +26 -0
  3. data/.openapi-generator/FILES +220 -0
  4. data/.openapi-generator/VERSION +1 -1
  5. data/.rubocop.yml +6 -12
  6. data/.travis.yml +11 -0
  7. data/CHANGELOG.md +5 -0
  8. data/Gemfile +5 -1
  9. data/Gemfile.lock +85 -48
  10. data/README.md +43 -18
  11. data/docs/AddFieldsData.md +13 -3
  12. data/docs/AddFieldsTemplateResponse.md +17 -5
  13. data/docs/AuthenticationError.md +15 -4
  14. data/docs/AuthenticationSuccessResponse.md +13 -3
  15. data/docs/CombinePdfsData.md +23 -8
  16. data/docs/CombinedSubmission.md +37 -13
  17. data/docs/CombinedSubmissionAction.md +23 -8
  18. data/docs/CombinedSubmissionData.md +21 -7
  19. data/docs/CopyTemplateData.md +15 -4
  20. data/docs/CreateCombinedSubmissionResponse.md +17 -5
  21. data/docs/CreateCustomFileData.md +13 -3
  22. data/docs/CreateCustomFileResponse.md +17 -5
  23. data/docs/CreateFolderAttributes.md +20 -0
  24. data/docs/CreateFolderData.md +13 -3
  25. data/docs/CreateHtmlTemplateData.md +13 -3
  26. data/docs/CreateSubmissionBatchResponse.md +21 -7
  27. data/docs/CreateSubmissionBatchSubmissionsResponse.md +17 -5
  28. data/docs/CreateSubmissionData.md +36 -0
  29. data/docs/CreateSubmissionDataRequestData.md +37 -15
  30. data/docs/CreateSubmissionDataRequestEventRequest.md +24 -0
  31. data/docs/CreateSubmissionDataRequestEventResponse.md +22 -0
  32. data/docs/CreateSubmissionDataRequestTokenResponse.md +17 -5
  33. data/docs/CreateSubmissionResponse.md +17 -5
  34. data/docs/CreateTemplateFromUploadData.md +13 -3
  35. data/docs/DataRequestToken.md +24 -0
  36. data/docs/DeleteTemplateResponse.md +20 -0
  37. data/docs/ErrorResponse.md +20 -0
  38. data/docs/Folder.md +19 -6
  39. data/docs/FullTemplate.md +94 -0
  40. data/docs/HtmlTemplateData.md +51 -19
  41. data/docs/HtmlTemplateDataWebhookOptions.md +18 -0
  42. data/docs/InvalidRequest.md +15 -4
  43. data/docs/InvalidRequestSingleError.md +20 -0
  44. data/docs/ListSubmissionsResponse.md +17 -5
  45. data/docs/MoveFolderData.md +13 -3
  46. data/docs/MoveTemplateData.md +13 -3
  47. data/docs/PDFApi.md +1598 -523
  48. data/docs/PendingTemplate.md +45 -19
  49. data/docs/PreviewPdfResponse.md +20 -0
  50. data/docs/PublishTemplateVersion404Response.md +20 -0
  51. data/docs/PublishTemplateVersion422Response.md +20 -0
  52. data/docs/PublishTemplateVersionResponse.md +20 -0
  53. data/docs/PublishTemplateVersionResponseResult.md +24 -0
  54. data/docs/PublishVersionData.md +20 -0
  55. data/docs/RenameFolderData.md +13 -3
  56. data/docs/RestoreTemplateVersionResponse.md +18 -0
  57. data/docs/RestoreVersionData.md +18 -0
  58. data/docs/Submission.md +49 -21
  59. data/docs/SubmissionAction.md +23 -8
  60. data/docs/SubmissionBatch.md +29 -11
  61. data/docs/SubmissionBatchData.md +21 -6
  62. data/docs/SubmissionData.md +23 -10
  63. data/docs/SubmissionDataBatchRequest.md +25 -8
  64. data/docs/SubmissionDataRequest.md +53 -22
  65. data/docs/SubmissionDataRequestEvent.md +30 -0
  66. data/docs/Template.md +51 -22
  67. data/docs/TemplateData.md +49 -18
  68. data/docs/TemplateDefaults.md +22 -0
  69. data/docs/TemplateDocument.md +22 -0
  70. data/docs/TemplateDocumentMetadata.md +22 -0
  71. data/docs/TemplateSchema.md +34 -0
  72. data/docs/UpdateDataRequestResponse.md +17 -5
  73. data/docs/UpdateSubmissionDataRequestData.md +37 -15
  74. data/docs/UpdateTemplateData.md +13 -3
  75. data/docs/UpdateTemplateResponse.md +15 -4
  76. data/docs/UploadPresign.md +24 -0
  77. data/docs/UploadTemplateData.md +53 -20
  78. data/docspring.gemspec +14 -11
  79. data/git_push.sh +11 -9
  80. data/lib/docspring/api/pdf_api.rb +1344 -539
  81. data/lib/docspring/api_client.rb +106 -98
  82. data/lib/docspring/api_error.rb +22 -2
  83. data/lib/docspring/configuration.rb +127 -16
  84. data/lib/docspring/models/add_fields_data.rb +59 -26
  85. data/lib/docspring/models/add_fields_template_response.rb +81 -43
  86. data/lib/docspring/models/authentication_error.rb +62 -29
  87. data/lib/docspring/models/authentication_success_response.rb +66 -28
  88. data/lib/docspring/models/combine_pdfs_data.rb +65 -32
  89. data/lib/docspring/models/combined_submission.rb +165 -75
  90. data/lib/docspring/models/combined_submission_action.rb +83 -39
  91. data/lib/docspring/models/combined_submission_data.rb +63 -30
  92. data/lib/docspring/models/copy_template_data.rb +59 -26
  93. data/lib/docspring/models/create_combined_submission_response.rb +86 -41
  94. data/lib/docspring/models/create_custom_file_data.rb +58 -25
  95. data/lib/docspring/models/create_custom_file_response.rb +86 -41
  96. data/lib/docspring/models/create_folder_attributes.rb +230 -0
  97. data/lib/docspring/models/create_folder_data.rb +59 -26
  98. data/lib/docspring/models/create_html_template_data.rb +58 -25
  99. data/lib/docspring/models/create_submission_batch_response.rb +104 -52
  100. data/lib/docspring/models/create_submission_batch_submissions_response.rb +79 -41
  101. data/lib/docspring/models/create_submission_data.rb +304 -0
  102. data/lib/docspring/models/create_submission_data_request_data.rb +139 -90
  103. data/lib/docspring/models/create_submission_data_request_event_request.rb +297 -0
  104. data/lib/docspring/models/create_submission_data_request_event_response.rb +282 -0
  105. data/lib/docspring/models/create_submission_data_request_token_response.rb +85 -40
  106. data/lib/docspring/models/create_submission_response.rb +86 -41
  107. data/lib/docspring/models/create_template_from_upload_data.rb +58 -25
  108. data/lib/docspring/models/{custom_file.rb → data_request_token.rb} +110 -33
  109. data/lib/docspring/models/delete_template_response.rb +266 -0
  110. data/lib/docspring/models/{error.rb → error_response.rb} +65 -30
  111. data/lib/docspring/models/folder.rb +78 -46
  112. data/lib/docspring/models/{template1.rb → full_template.rb} +476 -240
  113. data/lib/docspring/models/html_template_data.rb +180 -110
  114. data/lib/docspring/models/{folders_folder.rb → html_template_data_webhook_options.rb} +63 -41
  115. data/lib/docspring/models/invalid_request.rb +64 -29
  116. data/lib/docspring/models/invalid_request_single_error.rb +271 -0
  117. data/lib/docspring/models/list_submissions_response.rb +87 -39
  118. data/lib/docspring/models/move_folder_data.rb +56 -25
  119. data/lib/docspring/models/move_template_data.rb +58 -25
  120. data/lib/docspring/models/pending_template.rb +221 -118
  121. data/lib/docspring/models/preview_pdf_response.rb +264 -0
  122. data/lib/docspring/models/publish_template_version404_response.rb +271 -0
  123. data/lib/docspring/models/publish_template_version422_response.rb +273 -0
  124. data/lib/docspring/models/publish_template_version_response.rb +271 -0
  125. data/lib/docspring/models/publish_template_version_response_result.rb +263 -0
  126. data/lib/docspring/models/publish_version_data.rb +230 -0
  127. data/lib/docspring/models/rename_folder_data.rb +58 -25
  128. data/lib/docspring/models/restore_template_version_response.rb +255 -0
  129. data/lib/docspring/models/{create_submission_data_request_token_response_token.rb → restore_version_data.rb} +69 -58
  130. data/lib/docspring/models/submission.rb +98 -49
  131. data/lib/docspring/models/submission_action.rb +83 -39
  132. data/lib/docspring/models/submission_batch.rb +158 -75
  133. data/lib/docspring/models/submission_batch_data.rb +74 -30
  134. data/lib/docspring/models/submission_data.rb +65 -50
  135. data/lib/docspring/models/submission_data_batch_request.rb +100 -49
  136. data/lib/docspring/models/submission_data_request.rb +123 -54
  137. data/lib/docspring/models/submission_data_request_event.rb +309 -0
  138. data/lib/docspring/models/template.rb +267 -132
  139. data/lib/docspring/models/template_data.rb +173 -105
  140. data/lib/docspring/models/{template1_defaults.rb → template_defaults.rb} +77 -29
  141. data/lib/docspring/models/{upload_template_data_document.rb → template_document.rb} +91 -39
  142. data/lib/docspring/models/{upload_template_data_document_metadata.rb → template_document_metadata.rb} +94 -42
  143. data/lib/docspring/models/template_schema.rb +288 -0
  144. data/lib/docspring/models/update_data_request_response.rb +86 -41
  145. data/lib/docspring/models/update_submission_data_request_data.rb +82 -43
  146. data/lib/docspring/models/update_template_data.rb +58 -25
  147. data/lib/docspring/models/update_template_response.rb +79 -41
  148. data/lib/docspring/models/upload_presign.rb +296 -0
  149. data/lib/docspring/models/upload_template_data.rb +186 -116
  150. data/lib/docspring/version.rb +3 -3
  151. data/lib/docspring.rb +29 -12
  152. data/spec/api/client_integration_spec.rb +26 -19
  153. data/spec/api/pdf_api_integration_spec.rb +21 -19
  154. data/spec/api/pdf_api_spec_original.skipped.rb +427 -118
  155. data/spec/models/add_fields_data_spec.rb +8 -13
  156. data/spec/models/add_fields_template_response_spec.rb +16 -21
  157. data/spec/models/authentication_error_spec.rb +10 -15
  158. data/spec/models/authentication_success_response_spec.rb +9 -14
  159. data/spec/models/combine_pdfs_data_spec.rb +13 -18
  160. data/spec/models/combined_submission_action_spec.rb +16 -21
  161. data/spec/models/combined_submission_data_spec.rb +12 -17
  162. data/spec/models/combined_submission_spec.rb +42 -35
  163. data/spec/models/copy_template_data_spec.rb +9 -14
  164. data/spec/models/create_combined_submission_response_spec.rb +16 -21
  165. data/spec/models/create_custom_file_data_spec.rb +8 -13
  166. data/spec/models/create_custom_file_response_spec.rb +16 -21
  167. data/spec/models/create_folder_attributes_spec.rb +42 -0
  168. data/spec/models/create_folder_data_spec.rb +8 -13
  169. data/spec/models/create_html_template_data_spec.rb +8 -13
  170. data/spec/models/create_submission_batch_response_spec.rb +21 -26
  171. data/spec/models/create_submission_batch_submissions_response_spec.rb +16 -21
  172. data/spec/models/create_submission_data_request_data_spec.rb +33 -38
  173. data/spec/models/create_submission_data_request_event_request_spec.rb +62 -0
  174. data/spec/models/create_submission_data_request_event_response_spec.rb +52 -0
  175. data/spec/models/create_submission_data_request_token_response_spec.rb +15 -20
  176. data/spec/models/create_submission_data_spec.rb +90 -0
  177. data/spec/models/create_submission_response_spec.rb +16 -21
  178. data/spec/models/create_template_from_upload_data_spec.rb +8 -13
  179. data/spec/models/data_request_token_spec.rb +54 -0
  180. data/spec/models/delete_template_response_spec.rb +46 -0
  181. data/spec/models/error_response_spec.rb +46 -0
  182. data/spec/models/folder_spec.rb +15 -20
  183. data/spec/models/full_template_spec.rb +268 -0
  184. data/spec/models/html_template_data_spec.rb +62 -49
  185. data/spec/models/html_template_data_webhook_options_spec.rb +36 -0
  186. data/spec/models/invalid_request_single_error_spec.rb +46 -0
  187. data/spec/models/invalid_request_spec.rb +10 -15
  188. data/spec/models/list_submissions_response_spec.rb +13 -18
  189. data/spec/models/move_folder_data_spec.rb +8 -13
  190. data/spec/models/move_template_data_spec.rb +8 -13
  191. data/spec/models/pending_template_spec.rb +45 -50
  192. data/spec/models/preview_pdf_response_spec.rb +46 -0
  193. data/spec/models/publish_template_version404_response_spec.rb +46 -0
  194. data/spec/models/publish_template_version422_response_spec.rb +46 -0
  195. data/spec/models/publish_template_version_response_result_spec.rb +54 -0
  196. data/spec/models/publish_template_version_response_spec.rb +46 -0
  197. data/spec/models/publish_version_data_spec.rb +42 -0
  198. data/spec/models/rename_folder_data_spec.rb +8 -13
  199. data/spec/models/restore_template_version_response_spec.rb +40 -0
  200. data/spec/models/restore_version_data_spec.rb +36 -0
  201. data/spec/models/submission_action_spec.rb +16 -21
  202. data/spec/models/submission_batch_data_spec.rb +17 -16
  203. data/spec/models/submission_batch_spec.rb +29 -34
  204. data/spec/models/submission_data_batch_request_spec.rb +24 -23
  205. data/spec/models/submission_data_request_event_spec.rb +72 -0
  206. data/spec/models/submission_data_request_spec.rb +36 -35
  207. data/spec/models/submission_data_spec.rb +13 -30
  208. data/spec/models/submission_spec.rb +27 -32
  209. data/spec/models/template_data_spec.rb +59 -46
  210. data/spec/models/template_defaults_spec.rb +48 -0
  211. data/spec/models/template_document_metadata_spec.rb +52 -0
  212. data/spec/models/template_document_spec.rb +52 -0
  213. data/spec/models/template_schema_spec.rb +84 -0
  214. data/spec/models/template_spec.rb +50 -55
  215. data/spec/models/update_data_request_response_spec.rb +16 -21
  216. data/spec/models/update_submission_data_request_data_spec.rb +22 -27
  217. data/spec/models/update_template_data_spec.rb +8 -13
  218. data/spec/models/update_template_response_spec.rb +14 -19
  219. data/spec/models/upload_presign_spec.rb +58 -0
  220. data/spec/models/upload_template_data_spec.rb +64 -51
  221. data/spec/spec_helper.rb +5 -5
  222. metadata +108 -132
  223. data/docs/CreateSubmissionDataRequestTokenResponseToken.md +0 -11
  224. data/docs/CustomFile.md +0 -9
  225. data/docs/Error.md +0 -9
  226. data/docs/FoldersFolder.md +0 -9
  227. data/docs/Template1.md +0 -46
  228. data/docs/Template1Defaults.md +0 -10
  229. data/docs/TemplatestemplateIdaddFieldsFields.md +0 -92
  230. data/docs/UploadTemplateDataDocument.md +0 -10
  231. data/docs/UploadTemplateDataDocumentMetadata.md +0 -10
  232. data/lib/docspring/models/templatestemplate_idadd_fields_fields.rb +0 -1306
  233. data/spec/api_client_spec.rb +0 -226
  234. data/spec/configuration_spec.rb +0 -53
  235. data/spec/models/create_submission_data_request_token_response_token_spec.rb +0 -59
  236. data/spec/models/custom_file_spec.rb +0 -47
  237. data/spec/models/error_spec.rb +0 -51
  238. data/spec/models/folders_folder_spec.rb +0 -47
  239. data/spec/models/template1_defaults_spec.rb +0 -53
  240. data/spec/models/template1_spec.rb +0 -273
  241. data/spec/models/templatestemplate_idadd_fields_fields_spec.rb +0 -589
  242. data/spec/models/upload_template_data_document_metadata_spec.rb +0 -57
  243. data/spec/models/upload_template_data_document_spec.rb +0 -57
@@ -3,10 +3,10 @@
3
3
 
4
4
  #DocSpring is a service that helps you fill out and sign PDF templates.
5
5
 
6
- OpenAPI spec version: v1
6
+ The version of the OpenAPI document: v1
7
7
 
8
8
  Generated by: https://openapi-generator.tech
9
- OpenAPI Generator version: 3.3.0
9
+ Generator version: 7.11.0
10
10
 
11
11
  =end
12
12
 
@@ -14,8 +14,9 @@ require 'date'
14
14
  require 'json'
15
15
  require 'logger'
16
16
  require 'tempfile'
17
+ require 'time'
17
18
  require 'typhoeus'
18
- require 'uri'
19
+
19
20
 
20
21
  module DocSpring
21
22
  class ApiClient
@@ -44,10 +45,11 @@ module DocSpring
44
45
 
45
46
  # Call an API with given options.
46
47
  #
47
- # @return [Array<(Object, Fixnum, Hash)>] an array of 3 elements:
48
- # the data deserialized from response body (could be nil), response status code and response headers.
48
+ # @return [Array<(Object, Integer, Hash)>] an array of 3 elements:
49
+ # the data deserialized from response body (may be a Tempfile or nil), response status code and response headers.
49
50
  def call_api(http_method, path, opts = {})
50
51
  request = build_request(http_method, path, opts)
52
+ tempfile = download_file(request) if opts[:return_type] == 'File'
51
53
  response = request.run
52
54
 
53
55
  if @config.debugging
@@ -62,6 +64,8 @@ module DocSpring
62
64
  fail ApiError.new(:code => 0,
63
65
  :message => response.return_message)
64
66
  else
67
+ # <--------------- BEGIN DOCSPRING CUSTOMIZATION ----------------->
68
+ # Description: Custom error handling for API responses
65
69
  exception_message = nil
66
70
  response_json = JSON.parse(response.body) rescue nil
67
71
  if response_json.is_a? Hash
@@ -83,10 +87,13 @@ module DocSpring
83
87
  :response_headers => response.headers,
84
88
  :response_body => response.body),
85
89
  exception_message
90
+ # <--------------- END DOCSPRING CUSTOMIZATION ----------------->
86
91
  end
87
92
  end
88
93
 
89
- if opts[:return_type]
94
+ if opts[:return_type] == 'File'
95
+ data = tempfile
96
+ elsif opts[:return_type]
90
97
  data = deserialize(response, opts[:return_type])
91
98
  else
92
99
  data = nil
@@ -104,12 +111,13 @@ module DocSpring
104
111
  # @option opts [Object] :body HTTP body (JSON/XML)
105
112
  # @return [Typhoeus::Request] A Typhoeus Request
106
113
  def build_request(http_method, path, opts = {})
107
- url = build_request_url(path)
114
+ url = build_request_url(path, opts)
108
115
  http_method = http_method.to_sym.downcase
109
116
 
110
117
  header_params = @default_headers.merge(opts[:header_params] || {})
111
118
  query_params = opts[:query_params] || {}
112
119
  form_params = opts[:form_params] || {}
120
+ follow_location = opts[:follow_location] || true
113
121
 
114
122
  update_params_for_auth! header_params, query_params, opts[:auth_names]
115
123
 
@@ -126,7 +134,8 @@ module DocSpring
126
134
  :ssl_verifyhost => _verify_ssl_host,
127
135
  :sslcert => @config.cert_file,
128
136
  :sslkey => @config.key_file,
129
- :verbose => @config.debugging
137
+ :verbose => @config.debugging,
138
+ :followlocation => follow_location
130
139
  }
131
140
 
132
141
  # set custom cert, if provided
@@ -140,9 +149,78 @@ module DocSpring
140
149
  end
141
150
  end
142
151
 
143
- request = Typhoeus::Request.new(url, req_opts)
144
- download_file(request) if opts[:return_type] == 'File'
145
- request
152
+ Typhoeus::Request.new(url, req_opts)
153
+ end
154
+
155
+ # Builds the HTTP request body
156
+ #
157
+ # @param [Hash] header_params Header parameters
158
+ # @param [Hash] form_params Query parameters
159
+ # @param [Object] body HTTP body (JSON/XML)
160
+ # @return [String] HTTP body data in the form of string
161
+ def build_request_body(header_params, form_params, body)
162
+ # http form
163
+ if header_params['Content-Type'] == 'application/x-www-form-urlencoded' ||
164
+ header_params['Content-Type'] == 'multipart/form-data'
165
+ data = {}
166
+ form_params.each do |key, value|
167
+ case value
168
+ when ::File, ::Array, nil
169
+ # let typhoeus handle File, Array and nil parameters
170
+ data[key] = value
171
+ else
172
+ data[key] = value.to_s
173
+ end
174
+ end
175
+ elsif body
176
+ data = body.is_a?(String) ? body : body.to_json
177
+ else
178
+ data = nil
179
+ end
180
+ data
181
+ end
182
+
183
+ # Save response body into a file in (the defined) temporary folder, using the filename
184
+ # from the "Content-Disposition" header if provided, otherwise a random filename.
185
+ # The response body is written to the file in chunks in order to handle files which
186
+ # size is larger than maximum Ruby String or even larger than the maximum memory a Ruby
187
+ # process can use.
188
+ #
189
+ # @see Configuration#temp_folder_path
190
+ #
191
+ # @return [Tempfile] the tempfile generated
192
+ def download_file(request)
193
+ tempfile = nil
194
+ encoding = nil
195
+ request.on_headers do |response|
196
+ content_disposition = response.headers['Content-Disposition']
197
+ if content_disposition && content_disposition =~ /filename=/i
198
+ filename = content_disposition[/filename=['"]?([^'"\s]+)['"]?/, 1]
199
+ prefix = sanitize_filename(filename)
200
+ else
201
+ prefix = 'download-'
202
+ end
203
+ prefix = prefix + '-' unless prefix.end_with?('-')
204
+ encoding = response.body.encoding
205
+ tempfile = Tempfile.open(prefix, @config.temp_folder_path, encoding: encoding)
206
+ end
207
+ request.on_body do |chunk|
208
+ chunk.force_encoding(encoding)
209
+ tempfile.write(chunk)
210
+ end
211
+ # run the request to ensure the tempfile is created successfully before returning it
212
+ request.run
213
+ if tempfile
214
+ tempfile.close
215
+ @config.logger.info "Temp file written to #{tempfile.path}, please copy the file to a proper folder "\
216
+ "with e.g. `FileUtils.cp(tempfile.path, '/new/file/path')` otherwise the temp file "\
217
+ "will be deleted automatically with GC. It's also recommended to delete the temp file "\
218
+ "explicitly with `tempfile.delete`"
219
+ else
220
+ fail ApiError.new("Failed to create the tempfile based on the HTTP response from the server: #{request.inspect}")
221
+ end
222
+
223
+ tempfile
146
224
  end
147
225
 
148
226
  # Check if the given MIME is a JSON MIME.
@@ -154,24 +232,19 @@ module DocSpring
154
232
  # @param [String] mime MIME
155
233
  # @return [Boolean] True if the MIME is application/json
156
234
  def json_mime?(mime)
157
- (mime == '*/*') || !(mime =~ /Application\/.*json(?!p)(;.*)?/i).nil?
235
+ (mime == '*/*') || !(mime =~ /^Application\/.*json(?!p)(;.*)?/i).nil?
158
236
  end
159
237
 
160
238
  # Deserialize the response to the given return type.
161
239
  #
162
240
  # @param [Response] response HTTP response
163
- # @param [String] return_type some examples: "User", "Array[User]", "Hash[String,Integer]"
241
+ # @param [String] return_type some examples: "User", "Array<User>", "Hash<String, Integer>"
164
242
  def deserialize(response, return_type)
165
243
  body = response.body
166
-
167
- # handle file downloading - return the File instance processed in request callbacks
168
- # note that response body is empty when the file is written in chunks in request on_body callback
169
- return @tempfile if return_type == 'File'
170
-
171
244
  return nil if body.nil? || body.empty?
172
245
 
173
246
  # return response body directly for String return type
174
- return body if return_type == 'String'
247
+ return body.to_s if return_type == 'String'
175
248
 
176
249
  # ensuring a default content type
177
250
  content_type = response.headers['Content-Type'] || 'application/json'
@@ -181,7 +254,7 @@ module DocSpring
181
254
  begin
182
255
  data = JSON.parse("[#{body}]", :symbolize_names => true)[0]
183
256
  rescue JSON::ParserError => e
184
- if %w(String Date DateTime).include?(return_type)
257
+ if %w(String Date Time).include?(return_type)
185
258
  data = body
186
259
  else
187
260
  raise e
@@ -204,11 +277,11 @@ module DocSpring
204
277
  data.to_i
205
278
  when 'Float'
206
279
  data.to_f
207
- when 'BOOLEAN'
280
+ when 'Boolean'
208
281
  data == true
209
- when 'DateTime'
282
+ when 'Time'
210
283
  # parse date time (expecting ISO 8601 format)
211
- DateTime.parse data
284
+ Time.parse data
212
285
  when 'Date'
213
286
  # parse date time (expecting ISO 8601 format)
214
287
  Date.parse data
@@ -226,46 +299,9 @@ module DocSpring
226
299
  data.each { |k, v| hash[k] = convert_to_type(v, sub_type) }
227
300
  end
228
301
  else
229
- # models, e.g. Pet
230
- DocSpring.const_get(return_type).new.tap do |model|
231
- model.build_from_hash data
232
- end
233
- end
234
- end
235
-
236
- # Save response body into a file in (the defined) temporary folder, using the filename
237
- # from the "Content-Disposition" header if provided, otherwise a random filename.
238
- # The response body is written to the file in chunks in order to handle files which
239
- # size is larger than maximum Ruby String or even larger than the maximum memory a Ruby
240
- # process can use.
241
- #
242
- # @see Configuration#temp_folder_path
243
- def download_file(request)
244
- tempfile = nil
245
- encoding = nil
246
- request.on_headers do |response|
247
- content_disposition = response.headers['Content-Disposition']
248
- if content_disposition && content_disposition =~ /filename=/i
249
- filename = content_disposition[/filename=['"]?([^'"\s]+)['"]?/, 1]
250
- prefix = sanitize_filename(filename)
251
- else
252
- prefix = 'download-'
253
- end
254
- prefix = prefix + '-' unless prefix.end_with?('-')
255
- encoding = response.body.encoding
256
- tempfile = Tempfile.open(prefix, @config.temp_folder_path, encoding: encoding)
257
- @tempfile = tempfile
258
- end
259
- request.on_body do |chunk|
260
- chunk.force_encoding(encoding)
261
- tempfile.write(chunk)
262
- end
263
- request.on_complete do |response|
264
- tempfile.close if tempfile
265
- @config.logger.info "Temp file written to #{tempfile.path}, please copy the file to a proper folder "\
266
- "with e.g. `FileUtils.cp(tempfile.path, '/new/file/path')` otherwise the temp file "\
267
- "will be deleted automatically with GC. It's also recommended to delete the temp file "\
268
- "explicitly with `tempfile.delete`"
302
+ # models (e.g. Pet) or oneOf
303
+ klass = DocSpring.const_get(return_type)
304
+ klass.respond_to?(:openapi_one_of) ? klass.build(data) : klass.build_from_hash(data)
269
305
  end
270
306
  end
271
307
 
@@ -275,44 +311,16 @@ module DocSpring
275
311
  # @param [String] filename the filename to be sanitized
276
312
  # @return [String] the sanitized filename
277
313
  def sanitize_filename(filename)
278
- filename.gsub(/.*[\/\\]/, '')
314
+ filename.split(/[\/\\]/).last
279
315
  end
280
316
 
281
- def build_request_url(path)
317
+ def build_request_url(path, opts = {})
282
318
  # Add leading and trailing slashes to path
283
319
  path = "/#{path}".gsub(/\/+/, '/')
284
- @config.base_url + path
285
- end
286
-
287
- # Builds the HTTP request body
288
- #
289
- # @param [Hash] header_params Header parameters
290
- # @param [Hash] form_params Query parameters
291
- # @param [Object] body HTTP body (JSON/XML)
292
- # @return [String] HTTP body data in the form of string
293
- def build_request_body(header_params, form_params, body)
294
- # http form
295
- if header_params['Content-Type'] == 'application/x-www-form-urlencoded' ||
296
- header_params['Content-Type'] == 'multipart/form-data'
297
- data = {}
298
- form_params.each do |key, value|
299
- case value
300
- when ::File, ::Array, nil
301
- # let typhoeus handle File, Array and nil parameters
302
- data[key] = value
303
- else
304
- data[key] = value.to_s
305
- end
306
- end
307
- elsif body
308
- data = body.is_a?(String) ? body : body.to_json
309
- else
310
- data = nil
311
- end
312
- data
320
+ @config.base_url(opts[:operation]) + path
313
321
  end
314
322
 
315
- # Update hearder and query params based on authentication settings.
323
+ # Update header and query params based on authentication settings.
316
324
  #
317
325
  # @param [Hash] header_params Header parameters
318
326
  # @param [Hash] query_params Query parameters
@@ -324,7 +332,7 @@ module DocSpring
324
332
  case auth_setting[:in]
325
333
  when 'header' then header_params[auth_setting[:key]] = auth_setting[:value]
326
334
  when 'query' then query_params[auth_setting[:key]] = auth_setting[:value]
327
- else fail ArgumentError, 'Authentication token must be in `query` of `header`'
335
+ else fail ArgumentError, 'Authentication token must be in `query` or `header`'
328
336
  end
329
337
  end
330
338
  end
@@ -351,8 +359,8 @@ module DocSpring
351
359
  # @param [Array] content_types array for Content-Type
352
360
  # @return [String] the Content-Type header (e.g. application/json)
353
361
  def select_header_content_type(content_types)
354
- # use application/json by default
355
- return 'application/json' if content_types.nil? || content_types.empty?
362
+ # return nil by default
363
+ return if content_types.nil? || content_types.empty?
356
364
  # use JSON when present, otherwise use the first one
357
365
  json_content_type = content_types.find { |s| json_mime?(s) }
358
366
  json_content_type || content_types.first
@@ -3,10 +3,10 @@
3
3
 
4
4
  #DocSpring is a service that helps you fill out and sign PDF templates.
5
5
 
6
- OpenAPI spec version: v1
6
+ The version of the OpenAPI document: v1
7
7
 
8
8
  Generated by: https://openapi-generator.tech
9
- OpenAPI Generator version: 3.3.0
9
+ Generator version: 7.11.0
10
10
 
11
11
  =end
12
12
 
@@ -32,7 +32,27 @@ module DocSpring
32
32
  end
33
33
  else
34
34
  super arg
35
+ @message = arg
35
36
  end
36
37
  end
38
+
39
+ # Override to_s to display a friendly error message
40
+ def to_s
41
+ message
42
+ end
43
+
44
+ def message
45
+ if @message.nil?
46
+ msg = "Error message: the server returns an error"
47
+ else
48
+ msg = @message
49
+ end
50
+
51
+ msg += "\nHTTP status code: #{code}" if code
52
+ msg += "\nResponse headers: #{response_headers}" if response_headers
53
+ msg += "\nResponse body: #{response_body}" if response_body
54
+
55
+ msg
56
+ end
37
57
  end
38
58
  end
@@ -3,18 +3,19 @@
3
3
 
4
4
  #DocSpring is a service that helps you fill out and sign PDF templates.
5
5
 
6
- OpenAPI spec version: v1
6
+ The version of the OpenAPI document: v1
7
7
 
8
8
  Generated by: https://openapi-generator.tech
9
- OpenAPI Generator version: 3.3.0
9
+ Generator version: 7.11.0
10
10
 
11
11
  =end
12
12
 
13
- require 'uri'
14
-
15
13
  module DocSpring
16
14
  class Configuration
15
+ # <--------------- BEGIN DOCSPRING CUSTOMIZATION ----------------->
16
+ # Description: Add SCHEME_REGEX constant to extract scheme from host
17
17
  SCHEME_REGEX = /^(https?):\/\//
18
+ # <--------------- END DOCSPRING CUSTOMIZATION ----------------->
18
19
 
19
20
  # Defines url scheme
20
21
  attr_accessor :scheme
@@ -25,6 +26,18 @@ module DocSpring
25
26
  # Defines url base path
26
27
  attr_accessor :base_path
27
28
 
29
+ # Define server configuration index
30
+ attr_accessor :server_index
31
+
32
+ # Define server operation configuration index
33
+ attr_accessor :server_operation_index
34
+
35
+ # Default server variables
36
+ attr_accessor :server_variables
37
+
38
+ # Default server operation variables
39
+ attr_accessor :server_operation_variables
40
+
28
41
  # Defines API keys used with API Key authentications.
29
42
  #
30
43
  # @return [Hash] key: parameter name, value: parameter value (API key)
@@ -41,14 +54,16 @@ module DocSpring
41
54
  # config.api_key_prefix['api_key'] = 'Token'
42
55
  attr_accessor :api_key_prefix
43
56
 
57
+ # <--------------- BEGIN DOCSPRING CUSTOMIZATION ----------------->
58
+ # Description: Note that we also add a getter/setter for api_token_id and api_token_secret,
59
+ # aliases for username and password.
60
+ # <--------------- END DOCSPRING CUSTOMIZATION ----------------->
44
61
  # Defines the username used with HTTP basic authentication.
45
- # (DocSpring override: We also add a getter/setter for api_token_id)
46
62
  #
47
63
  # @return [String]
48
64
  attr_accessor :username
49
65
 
50
66
  # Defines the password used with HTTP basic authentication.
51
- # (DocSpring override: We also add a getter/setter for api_token_secret)
52
67
  #
53
68
  # @return [String]
54
69
  attr_accessor :password
@@ -56,6 +71,16 @@ module DocSpring
56
71
  # Defines the access token (Bearer) used with OAuth2.
57
72
  attr_accessor :access_token
58
73
 
74
+ # Defines a Proc used to fetch or refresh access tokens (Bearer) used with OAuth2.
75
+ # Overrides the access_token if set
76
+ # @return [Proc]
77
+ attr_accessor :access_token_getter
78
+
79
+ # Set this to return data as binary instead of downloading a temp file. When enabled (set to true)
80
+ # HTTP responses with return type `File` will be returned as a stream of binary data.
81
+ # Default to false.
82
+ attr_accessor :return_binary_data
83
+
59
84
  # Set this to enable/disable debugging. When enabled (set to true), HTTP request/response
60
85
  # details will be logged with `logger.debug` (see the `logger` attribute).
61
86
  # Default to false.
@@ -63,6 +88,14 @@ module DocSpring
63
88
  # @return [true, false]
64
89
  attr_accessor :debugging
65
90
 
91
+ # Set this to ignore operation servers for the API client. This is useful when you need to
92
+ # send requests to a different server than the one specified in the OpenAPI document.
93
+ # Will default to the base url defined in the spec but can be overridden by setting
94
+ # `scheme`, `host`, `base_path` directly.
95
+ # Default to false.
96
+ # @return [true, false]
97
+ attr_accessor :ignore_operation_servers
98
+
66
99
  # Defines the logger used for debugging.
67
100
  # Default to `Rails.logger` (when in Rails) or logging to STDOUT.
68
101
  #
@@ -127,6 +160,7 @@ module DocSpring
127
160
  # https://github.com/typhoeus/ethon/blob/master/lib/ethon/easy/queryable.rb#L96
128
161
  attr_accessor :params_encoding
129
162
 
163
+
130
164
  attr_accessor :inject_format
131
165
 
132
166
  attr_accessor :force_ending_format
@@ -135,27 +169,36 @@ module DocSpring
135
169
  @scheme = 'https'
136
170
  @host = 'api.docspring.com'
137
171
  @base_path = '/api/v1'
172
+ @server_index = nil
173
+ @server_operation_index = {}
174
+ @server_variables = {}
175
+ @server_operation_variables = {}
138
176
  @api_key = {}
139
177
  @api_key_prefix = {}
140
- @timeout = 0
141
178
  @client_side_validation = true
142
179
  @verify_ssl = true
143
180
  @verify_ssl_host = true
144
- @params_encoding = nil
145
181
  @cert_file = nil
146
182
  @key_file = nil
183
+ @timeout = 0
184
+ @params_encoding = nil
147
185
  @debugging = false
186
+ @ignore_operation_servers = false
148
187
  @inject_format = false
149
188
  @force_ending_format = false
150
189
  @logger = defined?(Rails) ? Rails.logger : Logger.new(STDOUT)
151
190
 
152
- # Use ENV variables by default if they are provided.
191
+ # <--------------- BEGIN DOCSPRING CUSTOMIZATION ----------------->
192
+ # Description: Use ENV variables by default if they are provided.
153
193
  @username = ENV['DOCSPRING_TOKEN_ID']
154
194
  @password = ENV['DOCSPRING_TOKEN_SECRET']
195
+ # <--------------- END DOCSPRING CUSTOMIZATION ----------------->
155
196
 
156
197
  yield(self) if block_given?
157
198
  end
158
199
 
200
+ # <--------------- BEGIN DOCSPRING CUSTOMIZATION ----------------->
201
+ # Description: Add getter/setter for api_token_id and api_token_secret, aliases for username and password
159
202
  def api_token_id=(api_token_id)
160
203
  @username = api_token_id
161
204
  end
@@ -165,7 +208,7 @@ module DocSpring
165
208
  @password = api_token_secret
166
209
  end
167
210
  alias api_token_secret password
168
-
211
+ # <--------------- END DOCSPRING CUSTOMIZATION ----------------->
169
212
 
170
213
  # The default Configuration object.
171
214
  def self.default
@@ -182,10 +225,12 @@ module DocSpring
182
225
  end
183
226
 
184
227
  def host=(host)
185
- # Also set scheme when setting host.
228
+ # <--------------- BEGIN DOCSPRING CUSTOMIZATION ----------------->
229
+ # Decription: Set scheme automatically when setting host from a URL
186
230
  @scheme = host[SCHEME_REGEX, 1] if host.match?(SCHEME_REGEX)
187
231
  # remove http(s):// and anything after a slash
188
232
  @host = host.sub(SCHEME_REGEX, '').split('/').first
233
+ # <--------------- END DOCSPRING CUSTOMIZATION ----------------->
189
234
  end
190
235
 
191
236
  def base_path=(base_path)
@@ -194,20 +239,35 @@ module DocSpring
194
239
  @base_path = '' if @base_path == '/'
195
240
  end
196
241
 
197
- def base_url
198
- "#{scheme}://#{[host, base_path].join('/').gsub(/\/+/, '/')}".sub(/\/+\z/, '')
242
+ # Returns base URL for specified operation based on server settings
243
+ def base_url(operation = nil)
244
+ return "#{scheme}://#{[host, base_path].join('/').gsub(/\/+/, '/')}".sub(/\/+\z/, '') if ignore_operation_servers
245
+ if operation_server_settings.key?(operation) then
246
+ index = server_operation_index.fetch(operation, server_index)
247
+ server_url(index.nil? ? 0 : index, server_operation_variables.fetch(operation, server_variables), operation_server_settings[operation])
248
+ else
249
+ server_index.nil? ? "#{scheme}://#{[host, base_path].join('/').gsub(/\/+/, '/')}".sub(/\/+\z/, '') : server_url(server_index, server_variables, nil)
250
+ end
199
251
  end
200
252
 
201
253
  # Gets API key (with prefix if set).
202
254
  # @param [String] param_name the parameter name of API key auth
203
- def api_key_with_prefix(param_name)
255
+ def api_key_with_prefix(param_name, param_alias = nil)
256
+ key = @api_key[param_name]
257
+ key = @api_key.fetch(param_alias, key) unless param_alias.nil?
204
258
  if @api_key_prefix[param_name]
205
- "#{@api_key_prefix[param_name]} #{@api_key[param_name]}"
259
+ "#{@api_key_prefix[param_name]} #{key}"
206
260
  else
207
- @api_key[param_name]
261
+ key
208
262
  end
209
263
  end
210
264
 
265
+ # Gets access_token using access_token_getter or uses the static access_token
266
+ def access_token_with_refresh
267
+ return access_token if access_token_getter.nil?
268
+ access_token_getter.call
269
+ end
270
+
211
271
  # Gets Basic Auth token string
212
272
  def basic_auth_token
213
273
  'Basic ' + ["#{username}:#{password}"].pack('m').delete("\r\n")
@@ -225,5 +285,56 @@ module DocSpring
225
285
  },
226
286
  }
227
287
  end
288
+
289
+ # Returns an array of Server setting
290
+ def server_settings
291
+ [
292
+ {
293
+ url: "https://api.docspring.com/api/v1",
294
+ description: "No description provided",
295
+ }
296
+ ]
297
+ end
298
+
299
+ def operation_server_settings
300
+ {
301
+ }
302
+ end
303
+
304
+ # Returns URL based on server settings
305
+ #
306
+ # @param index array index of the server settings
307
+ # @param variables hash of variable and the corresponding value
308
+ def server_url(index, variables = {}, servers = nil)
309
+ servers = server_settings if servers == nil
310
+
311
+ # check array index out of bound
312
+ if (index.nil? || index < 0 || index >= servers.size)
313
+ fail ArgumentError, "Invalid index #{index} when selecting the server. Must not be nil and must be less than #{servers.size}"
314
+ end
315
+
316
+ server = servers[index]
317
+ url = server[:url]
318
+
319
+ return url unless server.key? :variables
320
+
321
+ # go through variable and assign a value
322
+ server[:variables].each do |name, variable|
323
+ if variables.key?(name)
324
+ if (!server[:variables][name].key?(:enum_values) || server[:variables][name][:enum_values].include?(variables[name]))
325
+ url.gsub! "{" + name.to_s + "}", variables[name]
326
+ else
327
+ fail ArgumentError, "The variable `#{name}` in the server URL has invalid value #{variables[name]}. Must be #{server[:variables][name][:enum_values]}."
328
+ end
329
+ else
330
+ # use default value
331
+ url.gsub! "{" + name.to_s + "}", server[:variables][name][:default_value]
332
+ end
333
+ end
334
+
335
+ url
336
+ end
337
+
338
+
228
339
  end
229
340
  end