docraptor 1.1.0 → 1.2.0beta1

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.
@@ -1,3 +1,15 @@
1
+ =begin
2
+ #DocRaptor v1
3
+
4
+ #A native client library for the DocRaptor HTML to PDF/XLS service.
5
+
6
+ OpenAPI spec version: 1.0.0
7
+
8
+ Generated by: https://github.com/swagger-api/swagger-codegen.git
9
+ Swagger Codegen version: 2.2.3
10
+
11
+ =end
12
+
1
13
  require 'date'
2
14
  require 'json'
3
15
  require 'logger'
@@ -15,6 +27,8 @@ module DocRaptor
15
27
  # @return [Hash]
16
28
  attr_accessor :default_headers
17
29
 
30
+ # Initializes the ApiClient
31
+ # @option config [Configuration] Configuration for initializing the object, default to Configuration.default
18
32
  def initialize(config = Configuration.default)
19
33
  @config = config
20
34
  @user_agent = "ruby-swagger-#{VERSION}"
@@ -41,10 +55,18 @@ module DocRaptor
41
55
  end
42
56
 
43
57
  unless response.success?
44
- fail ApiError.new(:code => response.code,
45
- :response_headers => response.headers,
46
- :response_body => response.body),
47
- response.status_message
58
+ if response.timed_out?
59
+ fail ApiError.new('Connection timed out')
60
+ elsif response.code == 0
61
+ # Errors from libcurl will be made visible here
62
+ fail ApiError.new(:code => 0,
63
+ :message => response.return_message)
64
+ else
65
+ fail ApiError.new(:code => response.code,
66
+ :response_headers => response.headers,
67
+ :response_body => response.body),
68
+ response.status_message
69
+ end
48
70
  end
49
71
 
50
72
  if opts[:return_type]
@@ -55,6 +77,15 @@ module DocRaptor
55
77
  return data, response.code, response.headers
56
78
  end
57
79
 
80
+ # Builds the HTTP request
81
+ #
82
+ # @param [String] http_method HTTP method/verb (e.g. POST)
83
+ # @param [String] path URL path (e.g. /account/new)
84
+ # @option opts [Hash] :header_params Header parameters
85
+ # @option opts [Hash] :query_params Query parameters
86
+ # @option opts [Hash] :form_params Query parameters
87
+ # @option opts [Object] :body HTTP body (JSON/XML)
88
+ # @return [Typhoeus::Request] A Typhoeus Request
58
89
  def build_request(http_method, path, opts = {})
59
90
  url = build_request_url(path)
60
91
  http_method = http_method.to_sym.downcase
@@ -63,21 +94,25 @@ module DocRaptor
63
94
  query_params = opts[:query_params] || {}
64
95
  form_params = opts[:form_params] || {}
65
96
 
66
-
67
97
  update_params_for_auth! header_params, query_params, opts[:auth_names]
68
98
 
99
+ # set ssl_verifyhosts option based on @config.verify_ssl_host (true/false)
100
+ _verify_ssl_host = @config.verify_ssl_host ? 2 : 0
69
101
 
70
102
  req_opts = {
71
103
  :method => http_method,
72
104
  :headers => header_params,
73
105
  :params => query_params,
106
+ :params_encoding => @config.params_encoding,
74
107
  :timeout => @config.timeout,
75
108
  :ssl_verifypeer => @config.verify_ssl,
109
+ :ssl_verifyhost => _verify_ssl_host,
76
110
  :sslcert => @config.cert_file,
77
111
  :sslkey => @config.key_file,
78
112
  :verbose => @config.debugging
79
113
  }
80
114
 
115
+ # set custom cert, if provided
81
116
  req_opts[:cainfo] = @config.ssl_ca_cert if @config.ssl_ca_cert
82
117
 
83
118
  if [:post, :patch, :put, :delete].include?(http_method)
@@ -88,7 +123,9 @@ module DocRaptor
88
123
  end
89
124
  end
90
125
 
91
- Typhoeus::Request.new(url, req_opts)
126
+ request = Typhoeus::Request.new(url, req_opts)
127
+ download_file(request) if opts[:return_type] == 'File'
128
+ request
92
129
  end
93
130
 
94
131
  # Check if the given MIME is a JSON MIME.
@@ -96,23 +133,29 @@ module DocRaptor
96
133
  # application/json
97
134
  # application/json; charset=UTF8
98
135
  # APPLICATION/JSON
136
+ # */*
137
+ # @param [String] mime MIME
138
+ # @return [Boolean] True if the MIME is application/json
99
139
  def json_mime?(mime)
100
- !!(mime =~ /\Aapplication\/json(;.*)?\z/i)
140
+ (mime == "*/*") || !(mime =~ /Application\/.*json(?!p)(;.*)?/i).nil?
101
141
  end
102
142
 
103
143
  # Deserialize the response to the given return type.
104
144
  #
145
+ # @param [Response] response HTTP response
105
146
  # @param [String] return_type some examples: "User", "Array[User]", "Hash[String,Integer]"
106
147
  def deserialize(response, return_type)
107
148
  body = response.body
149
+
150
+ # handle file downloading - return the File instance processed in request callbacks
151
+ # note that response body is empty when the file is written in chunks in request on_body callback
152
+ return @tempfile if return_type == 'File'
153
+
108
154
  return nil if body.nil? || body.empty?
109
155
 
110
156
  # return response body directly for String return type
111
157
  return body if return_type == 'String'
112
158
 
113
- # handle file downloading - save response body into a tmp file and return the File instance
114
- return download_file(response) if return_type == 'File'
115
-
116
159
  # ensuring a default content type
117
160
  content_type = response.headers['Content-Type'] || 'application/json'
118
161
 
@@ -132,6 +175,9 @@ module DocRaptor
132
175
  end
133
176
 
134
177
  # Convert data to the given return type.
178
+ # @param [Object] data Data to be converted
179
+ # @param [String] return_type Return type
180
+ # @return [Mixed] Data in a particular type
135
181
  def convert_to_type(data, return_type)
136
182
  return nil if data.nil?
137
183
  case return_type
@@ -172,30 +218,38 @@ module DocRaptor
172
218
 
173
219
  # Save response body into a file in (the defined) temporary folder, using the filename
174
220
  # from the "Content-Disposition" header if provided, otherwise a random filename.
221
+ # The response body is written to the file in chunks in order to handle files which
222
+ # size is larger than maximum Ruby String or even larger than the maximum memory a Ruby
223
+ # process can use.
175
224
  #
176
225
  # @see Configuration#temp_folder_path
177
- # @return [Tempfile] the file downloaded
178
- def download_file(response)
179
- content_disposition = response.headers['Content-Disposition']
180
- if content_disposition
181
- filename = content_disposition[/filename=['"]?([^'"\s]+)['"]?/, 1]
182
- prefix = sanitize_filename(filename)
183
- else
184
- prefix = 'download-'
185
- end
186
- prefix = prefix + '-' unless prefix.end_with?('-')
187
-
226
+ def download_file(request)
188
227
  tempfile = nil
189
- encoding = response.body.encoding
190
- Tempfile.open(prefix, @config.temp_folder_path, encoding: encoding) do |file|
191
- file.write(response.body)
192
- tempfile = file
228
+ encoding = nil
229
+ request.on_headers do |response|
230
+ content_disposition = response.headers['Content-Disposition']
231
+ if content_disposition and content_disposition =~ /filename=/i
232
+ filename = content_disposition[/filename=['"]?([^'"\s]+)['"]?/, 1]
233
+ prefix = sanitize_filename(filename)
234
+ else
235
+ prefix = 'download-'
236
+ end
237
+ prefix = prefix + '-' unless prefix.end_with?('-')
238
+ encoding = response.body.encoding
239
+ tempfile = Tempfile.open(prefix, @config.temp_folder_path, encoding: encoding)
240
+ @tempfile = tempfile
241
+ end
242
+ request.on_body do |chunk|
243
+ chunk.force_encoding(encoding)
244
+ tempfile.write(chunk)
245
+ end
246
+ request.on_complete do |response|
247
+ tempfile.close
248
+ @config.logger.info "Temp file written to #{tempfile.path}, please copy the file to a proper folder "\
249
+ "with e.g. `FileUtils.cp(tempfile.path, '/new/file/path')` otherwise the temp file "\
250
+ "will be deleted automatically with GC. It's also recommended to delete the temp file "\
251
+ "explicitly with `tempfile.delete`"
193
252
  end
194
- @config.logger.info "Temp file written to #{tempfile.path}, please copy the file to a proper folder "\
195
- "with e.g. `FileUtils.cp(tempfile.path, '/new/file/path')` otherwise the temp file "\
196
- "will be deleted automatically with GC. It's also recommended to delete the temp file "\
197
- "explicitly with `tempfile.delete`"
198
- tempfile
199
253
  end
200
254
 
201
255
  # Sanitize filename by removing path.
@@ -204,7 +258,7 @@ module DocRaptor
204
258
  # @param [String] filename the filename to be sanitized
205
259
  # @return [String] the sanitized filename
206
260
  def sanitize_filename(filename)
207
- filename.gsub /.*[\/\\]/, ''
261
+ filename.gsub(/.*[\/\\]/, '')
208
262
  end
209
263
 
210
264
  def build_request_url(path)
@@ -213,6 +267,12 @@ module DocRaptor
213
267
  URI.encode(@config.base_url + path)
214
268
  end
215
269
 
270
+ # Builds the HTTP request body
271
+ #
272
+ # @param [Hash] header_params Header parameters
273
+ # @param [Hash] form_params Query parameters
274
+ # @param [Object] body HTTP body (JSON/XML)
275
+ # @return [String] HTTP body data in the form of string
216
276
  def build_request_body(header_params, form_params, body)
217
277
  # http form
218
278
  if header_params['Content-Type'] == 'application/x-www-form-urlencoded' ||
@@ -236,6 +296,10 @@ module DocRaptor
236
296
  end
237
297
 
238
298
  # Update hearder and query params based on authentication settings.
299
+ #
300
+ # @param [Hash] header_params Header parameters
301
+ # @param [Hash] query_params Query parameters
302
+ # @param [String] auth_names Authentication scheme name
239
303
  def update_params_for_auth!(header_params, query_params, auth_names)
240
304
  Array(auth_names).each do |auth_name|
241
305
  auth_setting = @config.auth_settings[auth_name]
@@ -248,6 +312,9 @@ module DocRaptor
248
312
  end
249
313
  end
250
314
 
315
+ # Sets user agent in HTTP header
316
+ #
317
+ # @param [String] user_agent User agent (e.g. swagger-codegen/ruby/1.0.0)
251
318
  def user_agent=(user_agent)
252
319
  @user_agent = user_agent
253
320
  @default_headers['User-Agent'] = @user_agent
@@ -279,13 +346,13 @@ module DocRaptor
279
346
  # @return [String] JSON string representation of the object
280
347
  def object_to_http_body(model)
281
348
  return model if model.nil? || model.is_a?(String)
282
- _body = nil
349
+ local_body = nil
283
350
  if model.is_a?(Array)
284
- _body = model.map{|m| object_to_hash(m) }
351
+ local_body = model.map{|m| object_to_hash(m) }
285
352
  else
286
- _body = object_to_hash(model)
353
+ local_body = object_to_hash(model)
287
354
  end
288
- _body.to_json
355
+ local_body.to_json
289
356
  end
290
357
 
291
358
  # Convert object(non-array) to hash.
@@ -1,3 +1,15 @@
1
+ =begin
2
+ #DocRaptor v1
3
+
4
+ #A native client library for the DocRaptor HTML to PDF/XLS service.
5
+
6
+ OpenAPI spec version: 1.0.0
7
+
8
+ Generated by: https://github.com/swagger-api/swagger-codegen.git
9
+ Swagger Codegen version: 2.2.3
10
+
11
+ =end
12
+
1
13
  module DocRaptor
2
14
  class ApiError < StandardError
3
15
  attr_reader :code, :response_headers, :response_body
@@ -9,12 +21,14 @@ module DocRaptor
9
21
  # ApiError.new(:code => 404, :message => "Not Found")
10
22
  def initialize(arg = nil)
11
23
  if arg.is_a? Hash
24
+ if arg.key?(:message) || arg.key?('message')
25
+ super(arg[:message] || arg['message'])
26
+ else
27
+ super arg
28
+ end
29
+
12
30
  arg.each do |k, v|
13
- if k.to_s == 'message'
14
- super v
15
- else
16
- instance_variable_set "@#{k}", v
17
- end
31
+ instance_variable_set "@#{k}", v
18
32
  end
19
33
  else
20
34
  super arg
@@ -1,3 +1,15 @@
1
+ =begin
2
+ #DocRaptor v1
3
+
4
+ #A native client library for the DocRaptor HTML to PDF/XLS service.
5
+
6
+ OpenAPI spec version: 1.0.0
7
+
8
+ Generated by: https://github.com/swagger-api/swagger-codegen.git
9
+ Swagger Codegen version: 2.2.3
10
+
11
+ =end
12
+
1
13
  require 'uri'
2
14
 
3
15
  module DocRaptor
@@ -64,7 +76,12 @@ module DocRaptor
64
76
  # Default to 0 (never times out).
65
77
  attr_accessor :timeout
66
78
 
67
- ### TLS/SSL
79
+ # Set this to false to skip client side validation in the operation.
80
+ # Default to true.
81
+ # @return [true, false]
82
+ attr_accessor :client_side_validation
83
+
84
+ ### TLS/SSL setting
68
85
  # Set this to false to skip verifying SSL certificate when calling API from https server.
69
86
  # Default to true.
70
87
  #
@@ -73,6 +90,16 @@ module DocRaptor
73
90
  # @return [true, false]
74
91
  attr_accessor :verify_ssl
75
92
 
93
+ ### TLS/SSL setting
94
+ # Set this to false to skip verifying SSL host name
95
+ # Default to true.
96
+ #
97
+ # @note Do NOT set it to false in production code, otherwise you would face multiple types of cryptographic attacks.
98
+ #
99
+ # @return [true, false]
100
+ attr_accessor :verify_ssl_host
101
+
102
+ ### TLS/SSL setting
76
103
  # Set this to customize the certificate file to verify the peer.
77
104
  #
78
105
  # @return [String] the path to the certificate file
@@ -81,12 +108,21 @@ module DocRaptor
81
108
  # https://github.com/typhoeus/typhoeus/blob/master/lib/typhoeus/easy_factory.rb#L145
82
109
  attr_accessor :ssl_ca_cert
83
110
 
111
+ ### TLS/SSL setting
84
112
  # Client certificate file (for client certificate)
85
113
  attr_accessor :cert_file
86
114
 
115
+ ### TLS/SSL setting
87
116
  # Client private key file (for client certificate)
88
117
  attr_accessor :key_file
89
118
 
119
+ # Set this to customize parameters encoding of array parameter with multi collectionFormat.
120
+ # Default to nil.
121
+ #
122
+ # @see The params_encoding option of Ethon. Related source code:
123
+ # https://github.com/typhoeus/ethon/blob/master/lib/ethon/easy/queryable.rb#L96
124
+ attr_accessor :params_encoding
125
+
90
126
  attr_accessor :inject_format
91
127
 
92
128
  attr_accessor :force_ending_format
@@ -98,7 +134,10 @@ module DocRaptor
98
134
  @api_key = {}
99
135
  @api_key_prefix = {}
100
136
  @timeout = 0
137
+ @client_side_validation = true
101
138
  @verify_ssl = true
139
+ @verify_ssl_host = true
140
+ @params_encoding = nil
102
141
  @cert_file = nil
103
142
  @key_file = nil
104
143
  @debugging = false
@@ -1,16 +1,28 @@
1
+ =begin
2
+ #DocRaptor v1
3
+
4
+ #A native client library for the DocRaptor HTML to PDF/XLS service.
5
+
6
+ OpenAPI spec version: 1.0.0
7
+
8
+ Generated by: https://github.com/swagger-api/swagger-codegen.git
9
+ Swagger Codegen version: 2.2.3
10
+
11
+ =end
12
+
1
13
  require 'date'
2
14
 
3
15
  module DocRaptor
16
+
4
17
  class AsyncDoc
5
18
  # The identifier used to get the status of the document using the status api.
6
19
  attr_accessor :status_id
7
20
 
21
+
8
22
  # Attribute mapping from ruby-style variable name to JSON key.
9
23
  def self.attribute_map
10
24
  {
11
-
12
25
  :'status_id' => :'status_id'
13
-
14
26
  }
15
27
  end
16
28
 
@@ -18,24 +30,38 @@ module DocRaptor
18
30
  def self.swagger_types
19
31
  {
20
32
  :'status_id' => :'String'
21
-
22
33
  }
23
34
  end
24
35
 
36
+ # Initializes the object
37
+ # @param [Hash] attributes Model attributes in the form of hash
25
38
  def initialize(attributes = {})
26
39
  return unless attributes.is_a?(Hash)
27
40
 
28
41
  # convert string to symbol for hash key
29
- attributes = attributes.inject({}){|memo,(k,v)| memo[k.to_sym] = v; memo}
30
-
42
+ attributes = attributes.each_with_object({}){|(k,v), h| h[k.to_sym] = v}
31
43
 
32
- if attributes[:'status_id']
44
+ if attributes.has_key?(:'status_id')
33
45
  self.status_id = attributes[:'status_id']
34
46
  end
35
47
 
36
48
  end
37
49
 
38
- # Check equality by comparing each attribute.
50
+ # Show invalid properties with the reasons. Usually used together with valid?
51
+ # @return Array for valid properies with the reasons
52
+ def list_invalid_properties
53
+ invalid_properties = Array.new
54
+ return invalid_properties
55
+ end
56
+
57
+ # Check to see if the all the properties in the model are valid
58
+ # @return true if the model is valid
59
+ def valid?
60
+ return true
61
+ end
62
+
63
+ # Checks equality by comparing each attribute.
64
+ # @param [Object] Object to be compared
39
65
  def ==(o)
40
66
  return true if self.equal?(o)
41
67
  self.class == o.class &&
@@ -43,35 +69,41 @@ module DocRaptor
43
69
  end
44
70
 
45
71
  # @see the `==` method
72
+ # @param [Object] Object to be compared
46
73
  def eql?(o)
47
74
  self == o
48
75
  end
49
76
 
50
- # Calculate hash code according to all attributes.
77
+ # Calculates hash code according to all attributes.
78
+ # @return [Fixnum] Hash code
51
79
  def hash
52
80
  [status_id].hash
53
81
  end
54
82
 
55
- # build the object from hash
83
+ # Builds the object from hash
84
+ # @param [Hash] attributes Model attributes in the form of hash
85
+ # @return [Object] Returns the model itself
56
86
  def build_from_hash(attributes)
57
87
  return nil unless attributes.is_a?(Hash)
58
88
  self.class.swagger_types.each_pair do |key, type|
59
- if type =~ /^Array<(.*)>/i
89
+ if type =~ /\AArray<(.*)>/i
90
+ # check to ensure the input is an array given that the the attribute
91
+ # is documented as an array but the input is not
60
92
  if attributes[self.class.attribute_map[key]].is_a?(Array)
61
93
  self.send("#{key}=", attributes[self.class.attribute_map[key]].map{ |v| _deserialize($1, v) } )
62
- else
63
- #TODO show warning in debug mode
64
94
  end
65
95
  elsif !attributes[self.class.attribute_map[key]].nil?
66
96
  self.send("#{key}=", _deserialize(type, attributes[self.class.attribute_map[key]]))
67
- else
68
- # data not found in attributes(hash), not an issue as the data can be optional
69
- end
97
+ end # or else data not found in attributes(hash), not an issue as the data can be optional
70
98
  end
71
99
 
72
100
  self
73
101
  end
74
102
 
103
+ # Deserializes the data based on type
104
+ # @param string type Data type
105
+ # @param string value Value to be deserialized
106
+ # @return [Object] Deserialized data
75
107
  def _deserialize(type, value)
76
108
  case type.to_sym
77
109
  when :DateTime
@@ -85,7 +117,7 @@ module DocRaptor
85
117
  when :Float
86
118
  value.to_f
87
119
  when :BOOLEAN
88
- if value.to_s =~ /^(true|t|yes|y|1)$/i
120
+ if value.to_s =~ /\A(true|t|yes|y|1)\z/i
89
121
  true
90
122
  else
91
123
  false
@@ -96,7 +128,7 @@ module DocRaptor
96
128
  when /\AArray<(?<inner_type>.+)>\z/
97
129
  inner_type = Regexp.last_match[:inner_type]
98
130
  value.map { |v| _deserialize(inner_type, v) }
99
- when /\AHash<(?<k_type>.+), (?<v_type>.+)>\z/
131
+ when /\AHash<(?<k_type>.+?), (?<v_type>.+)>\z/
100
132
  k_type = Regexp.last_match[:k_type]
101
133
  v_type = Regexp.last_match[:v_type]
102
134
  {}.tap do |hash|
@@ -105,21 +137,25 @@ module DocRaptor
105
137
  end
106
138
  end
107
139
  else # model
108
- _model = DocRaptor.const_get(type).new
109
- _model.build_from_hash(value)
140
+ temp_model = DocRaptor.const_get(type).new
141
+ temp_model.build_from_hash(value)
110
142
  end
111
143
  end
112
144
 
145
+ # Returns the string representation of the object
146
+ # @return [String] String presentation of the object
113
147
  def to_s
114
148
  to_hash.to_s
115
149
  end
116
150
 
117
- # to_body is an alias to to_body (backward compatibility))
151
+ # to_body is an alias to to_hash (backward compatibility)
152
+ # @return [Hash] Returns the object in the form of hash
118
153
  def to_body
119
154
  to_hash
120
155
  end
121
156
 
122
- # return the object in the form of hash
157
+ # Returns the object in the form of hash
158
+ # @return [Hash] Returns the object in the form of hash
123
159
  def to_hash
124
160
  hash = {}
125
161
  self.class.attribute_map.each_pair do |attr, param|
@@ -130,8 +166,10 @@ module DocRaptor
130
166
  hash
131
167
  end
132
168
 
133
- # Method to output non-array value in the form of hash
169
+ # Outputs non-array value in the form of hash
134
170
  # For object, use to_hash. Otherwise, just return the value
171
+ # @param [Object] value Any valid value
172
+ # @return [Hash] Returns the value in the form of hash
135
173
  def _to_hash(value)
136
174
  if value.is_a?(Array)
137
175
  value.compact.map{ |v| _to_hash(v) }
@@ -147,4 +185,5 @@ module DocRaptor
147
185
  end
148
186
 
149
187
  end
188
+
150
189
  end