ms_rest2 0.7.6

Sign up to get free protection for your applications and to get access to all the features.
@@ -0,0 +1,483 @@
1
+ # encoding: utf-8
2
+ # Copyright (c) Microsoft Corporation. All rights reserved.
3
+ # Licensed under the MIT License. See License.txt in the project root for license information.
4
+
5
+ module MsRest
6
+ # Base module for Ruby serialization and deserialization.
7
+ #
8
+ # Provides methods to serialize Ruby object into Ruby Hash and
9
+ # to deserialize Ruby Hash into Ruby object.
10
+ module Serialization
11
+ #
12
+ # Deserialize the response from the server using the mapper.
13
+ #
14
+ # @param mapper [Hash] Ruby Hash object to represent expected structure of the response_body.
15
+ # @param response_body [Hash] Ruby Hash object to deserialize.
16
+ # @param object_name [String] Name of the deserialized object.
17
+ #
18
+ def deserialize(mapper, response_body)
19
+ build_serializer.deserialize(mapper, response_body)
20
+ end
21
+
22
+ #
23
+ # Serialize the Ruby object into Ruby Hash to send it to the server using the mapper.
24
+ #
25
+ # @param mapper [Hash] Ruby Hash object to represent expected structure of the object.
26
+ # @param object [Object] Ruby object to serialize.
27
+ # @param object_name [String] Name of the serialized object.
28
+ #
29
+ def serialize(mapper, object)
30
+ build_serializer.serialize(mapper, object)
31
+ end
32
+
33
+ private
34
+
35
+ #
36
+ # Builds serializer
37
+ #
38
+ def build_serializer
39
+ Serialization.new(self)
40
+ end
41
+
42
+ #
43
+ # Class to handle serialization & deserialization.
44
+ #
45
+ class Serialization
46
+ def initialize(context)
47
+ @context = context
48
+ end
49
+
50
+ #
51
+ # Deserialize the response from the server using the mapper.
52
+ #
53
+ # @param mapper [Hash] Ruby Hash object to represent expected structure of the response_body.
54
+ # @param response_body [Hash] Ruby Hash object to deserialize.
55
+ # @param object_name [String] Name of the deserialized object.
56
+ #
57
+ def deserialize(mapper, response_body)
58
+ return response_body if response_body.nil?
59
+
60
+ object_name = mapper[:serialized_name]
61
+ mapper_type = mapper[:type][:name]
62
+
63
+ if !mapper_type.match(/^(Number|Double|ByteArray|Boolean|Date|DateTime|DateTimeRfc1123|TimeSpan|UnixTime|Enum|String|Object|Stream)$/i).nil?
64
+ payload = deserialize_primary_type(mapper, response_body)
65
+ elsif !mapper_type.match(/^Dictionary$/i).nil?
66
+ payload = deserialize_dictionary_type(mapper, response_body, object_name)
67
+ elsif !mapper_type.match(/^Composite$/i).nil?
68
+ payload = deserialize_composite_type(mapper, response_body, object_name)
69
+ elsif !mapper_type.match(/^Sequence$/i).nil?
70
+ payload = deserialize_sequence_type(mapper, response_body, object_name)
71
+ else
72
+ payload = ""
73
+ end
74
+
75
+ payload = mapper[:default_value] if mapper[:is_constant]
76
+
77
+ payload
78
+ end
79
+
80
+ #
81
+ # Deserialize the response of known primary type from the server using the mapper.
82
+ #
83
+ # @param mapper [Hash] Ruby Hash object to represent expected structure of the response_body.
84
+ # @param response_body [Hash] Ruby Hash object to deserialize.
85
+ #
86
+ def deserialize_primary_type(mapper, response_body)
87
+ result = ""
88
+ case mapper[:type][:name]
89
+ when 'Number'
90
+ result = Integer(response_body) unless response_body.to_s.empty?
91
+ when 'Double'
92
+ result = Float(response_body) unless response_body.to_s.empty?
93
+ when 'ByteArray'
94
+ result = Base64.strict_decode64(response_body).unpack('C*') unless response_body.to_s.empty?
95
+ when 'String', 'Boolean', 'Object', 'Stream', 'TimeSpan'
96
+ result = response_body
97
+ when 'Enum'
98
+ unless response_body.nil?
99
+ unless enum_is_valid(mapper, response_body)
100
+ warn "Enum does not contain #{response_body}, but was received from the server."
101
+ end
102
+ end
103
+ result = response_body
104
+ when 'Date'
105
+ unless response_body.to_s.empty?
106
+ result = Timeliness.parse(response_body, :strict => true)
107
+ fail DeserializationError.new('Error occured in deserializing the response_body', nil, nil, response_body) if result.nil?
108
+ result = ::Date.parse(result.to_s)
109
+ end
110
+ when 'DateTime', 'DateTimeRfc1123'
111
+ result = DateTime.parse(response_body) unless response_body.to_s.empty?
112
+ when 'UnixTime'
113
+ result = DateTime.strptime(response_body.to_s, '%s') unless response_body.to_s.empty?
114
+ else
115
+ result
116
+ end
117
+ result
118
+ end
119
+
120
+ #
121
+ # Deserialize the response of dictionary type from the server using the mapper.
122
+ #
123
+ # @param mapper [Hash] Ruby Hash object to represent expected structure of the response_body.
124
+ # @param response_body [Hash] Ruby Hash object to deserialize.
125
+ # @param object_name [String] Name of the deserialized object.
126
+ #
127
+ def deserialize_dictionary_type(mapper, response_body, object_name)
128
+ if mapper[:type][:value].nil? || !mapper[:type][:value].is_a?(Hash)
129
+ fail DeserializationError.new("'value' metadata for a dictionary type must be defined in the mapper and it must be of type Hash in #{object_name}", nil, nil, response_body)
130
+ end
131
+
132
+ result = Hash.new
133
+ response_body.each do |key, val|
134
+ result[key] = deserialize(mapper[:type][:value], val)
135
+ end
136
+ result
137
+ end
138
+
139
+ #
140
+ # Deserialize the response of composite type from the server using the mapper.
141
+ #
142
+ # @param mapper [Hash] Ruby Hash object to represent expected structure of the response_body.
143
+ # @param response_body [Hash] Ruby Hash object to deserialize.
144
+ # @param object_name [String] Name of the deserialized object.
145
+ #
146
+ def deserialize_composite_type(mapper, response_body, object_name)
147
+ if mapper[:type][:class_name].nil?
148
+ fail DeserializationError.new("'class_name' metadata for a composite type must be defined in the mapper and it must be of type Hash in #{object_name}", nil, nil, response_body)
149
+ end
150
+
151
+ if !mapper[:type][:polymorphic_discriminator].nil?
152
+ # Handle polymorphic types
153
+ parent_class = get_model(mapper[:type][:class_name])
154
+ discriminator = parent_class.class_eval("@@discriminatorMap")
155
+ model_name = response_body["#{mapper[:type][:polymorphic_discriminator]}"]
156
+ # In case we do not find model from response body then use the class defined in mapper
157
+ model_name = mapper[:type][:class_name] if model_name.nil? || model_name.empty?
158
+ model_class = get_model(discriminator[model_name])
159
+ else
160
+ model_class = get_model(mapper[:type][:class_name])
161
+ end
162
+
163
+ result = model_class.new
164
+
165
+ model_mapper = model_class.mapper()
166
+ model_props = model_mapper[:type][:model_properties]
167
+
168
+ unless model_props.nil?
169
+ model_props.each do |key, val|
170
+ sub_response_body = nil
171
+ unless val[:serialized_name].to_s.include? '.'
172
+ sub_response_body = response_body[val[:serialized_name].to_s]
173
+ else
174
+ # Flattened properties will be dicovered at deeper level in payload but must be deserialized to higher levels in model class
175
+ sub_response_body = response_body
176
+ levels = split_serialized_name(val[:serialized_name].to_s)
177
+ levels.each { |level| sub_response_body = sub_response_body.nil? ? nil : sub_response_body[level.to_s] }
178
+ end
179
+
180
+ result.instance_variable_set("@#{key}", deserialize(val, sub_response_body)) unless sub_response_body.nil?
181
+ end
182
+ end
183
+ result
184
+ end
185
+
186
+ #
187
+ # Deserialize the response of sequence type from the server using the mapper.
188
+ #
189
+ # @param mapper [Hash] Ruby Hash object to represent expected structure of the response_body.
190
+ # @param response_body [Hash] Ruby Hash object to deserialize.
191
+ # @param object_name [String] Name of the deserialized object.
192
+ #
193
+ def deserialize_sequence_type(mapper, response_body, object_name)
194
+ if mapper[:type][:element].nil? || !mapper[:type][:element].is_a?(Hash)
195
+ fail DeserializationError.new("'element' metadata for a sequence type must be defined in the mapper and it must be of type Hash in #{object_name}", nil, nil, response_body)
196
+ end
197
+
198
+ return response_body if response_body.nil?
199
+
200
+ result = []
201
+ response_body.each do |element|
202
+ result.push(deserialize(mapper[:type][:element], element))
203
+ end
204
+
205
+ result
206
+ end
207
+
208
+ #
209
+ # Serialize the Ruby object into Ruby Hash to send it to the server using the mapper.
210
+ #
211
+ # @param mapper [Hash] Ruby Hash object to represent expected structure of the object.
212
+ # @param object [Object] Ruby object to serialize.
213
+ # @param object_name [String] Name of the serialized object.
214
+ #
215
+ def serialize(mapper, object)
216
+ object_name = mapper[:serialized_name]
217
+
218
+ # Set defaults
219
+ unless mapper[:default_value].nil?
220
+ object = mapper[:default_value] if object.nil?
221
+ end
222
+ object = mapper[:default_value] if mapper[:is_constant]
223
+
224
+ validate_constraints(mapper, object, object_name)
225
+
226
+ if !mapper[:required] && object.nil?
227
+ return object
228
+ end
229
+
230
+ payload = Hash.new
231
+ mapper_type = mapper[:type][:name]
232
+ if !mapper_type.match(/^(Number|Double|ByteArray|Boolean|Date|DateTime|DateTimeRfc1123|TimeSpan|UnixTime|Enum|String|Object|Stream)$/i).nil?
233
+ payload = serialize_primary_type(mapper, object)
234
+ elsif !mapper_type.match(/^Dictionary$/i).nil?
235
+ payload = serialize_dictionary_type(mapper, object, object_name)
236
+ elsif !mapper_type.match(/^Composite$/i).nil?
237
+ payload = serialize_composite_type(mapper, object, object_name)
238
+ elsif !mapper_type.match(/^Sequence$/i).nil?
239
+ payload = serialize_sequence_type(mapper, object, object_name)
240
+ end
241
+ payload
242
+ end
243
+
244
+ def validate_constraints(mapper, object, object_name)
245
+ if(mapper[:client_side_validation])
246
+ # Throw if required & non-constant object is nil
247
+ if mapper[:required] && object.nil? && !mapper[:is_constant]
248
+ fail ValidationError, "#{object_name} is required and cannot be nil"
249
+ end
250
+
251
+ if(mapper[:constraints])
252
+ mapper[:constraints].each do |constraint_name, constraint_value|
253
+ case constraint_name.to_s.downcase
254
+ when 'exclusivemaximum'
255
+ fail ValidationError, "#{object_name} with value '#{object}' should satisfy the constraint 'ExclusiveMaximum': '#{constraint_value}'" if !object.nil? && object >= constraint_value
256
+ when 'exclusiveminimum'
257
+ fail ValidationError, "#{object_name} with value '#{object}' should satisfy the constraint 'ExclusiveMinimum': '#{constraint_value}'" if !object.nil? && object <= constraint_value
258
+ when 'inclusivemaximum'
259
+ fail ValidationError, "#{object_name} with value '#{object}' should satisfy the constraint 'InclusiveMaximum': '#{constraint_value}'" if !object.nil? && object > constraint_value
260
+ when 'inclusiveminimum'
261
+ fail ValidationError, "#{object_name} with value '#{object}' should satisfy the constraint 'InclusiveMinimum': '#{constraint_value}'" if !object.nil? && object < constraint_value
262
+ when 'maxitems'
263
+ fail ValidationError, "#{object_name} with value '#{object}' should satisfy the constraint 'MaxItems': '#{constraint_value}'" if !object.nil? && object.length > constraint_value
264
+ when 'minitems'
265
+ fail ValidationError, "#{object_name} with value '#{object}' should satisfy the constraint 'MinItems': '#{constraint_value}'" if !object.nil? && object.length < constraint_value
266
+ when 'maxlength'
267
+ fail ValidationError, "#{object_name} with value '#{object}' should satisfy the constraint 'MaxLength': '#{constraint_value}'" if !object.nil? && object.length > constraint_value
268
+ when 'minlength'
269
+ fail ValidationError, "#{object_name} with value '#{object}' should satisfy the constraint 'MinLength': '#{constraint_value}'" if !object.nil? && object.length < constraint_value
270
+ when 'multipleof'
271
+ fail ValidationError, "#{object_name} with value '#{object}' should satisfy the constraint 'MultipleOf': '#{constraint_value}'" if !object.nil? && object % constraint_value != 0
272
+ when 'pattern'
273
+ fail ValidationError, "#{object_name} with value '#{object}' should satisfy the constraint 'Pattern': '#{constraint_value}'" if !object.nil? && object.match(Regexp.new "^#{constraint_value}$").nil?
274
+ when 'uniqueitems'
275
+ fail ValidationError, "#{object_name} with value '#{object}' should satisfy the constraint 'UniqueItems': '#{constraint_value}'" if !object.nil? && object.length != object.uniq.length
276
+ end
277
+ end
278
+ end
279
+ end
280
+ end
281
+
282
+ #
283
+ # Serialize the Ruby object of known primary type into Ruby Hash to send it to the server using the mapper.
284
+ #
285
+ # @param mapper [Hash] Ruby Hash object to represent expected structure of the object.
286
+ # @param object [Object] Ruby object to serialize.
287
+ #
288
+ def serialize_primary_type(mapper, object)
289
+ mapper_type = mapper[:type][:name]
290
+ payload = nil
291
+ case mapper_type
292
+ when 'Number', 'Double', 'String', 'Date', 'TimeSpan', 'Boolean', 'Object', 'Stream'
293
+ payload = object != nil ? object : nil
294
+ when 'Enum'
295
+ unless object.nil?
296
+ unless enum_is_valid(mapper, object)
297
+ fail ValidationError, "Enum #{mapper[:type][:module]} does not contain #{object.to_s}, but trying to send it to the server."
298
+ end
299
+ end
300
+ payload = object != nil ? object : nil
301
+ when 'ByteArray'
302
+ payload = Base64.strict_encode64(object.pack('c*'))
303
+ when 'DateTime'
304
+ payload = object.new_offset(0).strftime('%FT%TZ')
305
+ when 'DateTimeRfc1123'
306
+ payload = object.new_offset(0).strftime('%a, %d %b %Y %H:%M:%S GMT')
307
+ when 'UnixTime'
308
+ payload = object.new_offset(0).strftime('%s') unless object.nil?
309
+ end
310
+ payload
311
+ end
312
+
313
+ #
314
+ # Serialize the Ruby object of dictionary type into Ruby Hash to send it to the server using the mapper.
315
+ #
316
+ # @param mapper [Hash] Ruby Hash object to represent expected structure of the object.
317
+ # @param object [Object] Ruby object to serialize.
318
+ # @param object_name [String] Name of the serialized object.
319
+ #
320
+ def serialize_dictionary_type(mapper, object, object_name)
321
+ unless object.is_a?(Hash)
322
+ fail DeserializationError.new("#{object_name} must be of type Hash", nil, nil, object)
323
+ end
324
+
325
+ unless mapper[:type][:value].nil? || mapper[:type][:value].is_a?(Hash)
326
+ fail DeserializationError.new("'value' metadata for a dictionary type must be defined in the mapper and it must be of type Hash in #{object_name}", nil, nil, object)
327
+ end
328
+
329
+ payload = Hash.new
330
+ object.each do |key, value|
331
+ if !value.nil? && value.respond_to?(:validate)
332
+ value.validate
333
+ end
334
+
335
+ payload[key] = serialize(mapper[:type][:value], value)
336
+ end
337
+ payload
338
+ end
339
+
340
+ #
341
+ # Serialize the Ruby object of composite type into Ruby Hash to send it to the server using the mapper.
342
+ #
343
+ # @param mapper [Hash] Ruby Hash object to represent expected structure of the object.
344
+ # @param object [Object] Ruby object to serialize.
345
+ # @param object_name [String] Name of the serialized object.
346
+ #
347
+ def serialize_composite_type(mapper, object, object_name)
348
+ if !mapper[:type][:polymorphic_discriminator].nil?
349
+ # Handle polymorphic types
350
+ model_name = object.class.to_s.split('::')[-1]
351
+ model_class = get_model(model_name)
352
+ else
353
+ model_class = get_model(mapper[:type][:class_name])
354
+ end
355
+
356
+ payload = Hash.new
357
+ model_mapper = model_class.mapper()
358
+ model_props = model_mapper[:type][:model_properties]
359
+
360
+ unless model_props.nil?
361
+ model_props.each do |key, value|
362
+ begin
363
+ instance_variable = object.instance_variable_get("@#{key}")
364
+ rescue NameError
365
+ warn("Instance variable '#{key}' is expected on '#{object.class}'.")
366
+ end
367
+
368
+ if !instance_variable.nil? && instance_variable.respond_to?(:validate)
369
+ instance_variable.validate
370
+ end
371
+
372
+ # Read only properties should not be sent on wire
373
+ if !model_props[key][:read_only].nil? && model_props[key][:read_only]
374
+ next
375
+ end
376
+
377
+ sub_payload = serialize(value, instance_variable)
378
+
379
+ unless value[:serialized_name].to_s.include? '.'
380
+ payload[value[:serialized_name].to_s] = sub_payload unless sub_payload.nil?
381
+ else
382
+ # Flattened properties will be discovered at higher levels in model class but must be serialized to deeper level in payload
383
+ levels = split_serialized_name(value[:serialized_name].to_s)
384
+ last_level = levels.pop
385
+ temp_payload = payload
386
+ levels.each do |level|
387
+ temp_payload[level] = Hash.new unless temp_payload.key?(level)
388
+ temp_payload = temp_payload[level]
389
+ end
390
+ temp_payload[last_level] = sub_payload unless sub_payload.nil?
391
+ end
392
+ end
393
+ end
394
+ payload
395
+ end
396
+
397
+ #
398
+ # Serialize the Ruby object of sequence type into Ruby Hash to send it to the server using the mapper.
399
+ #
400
+ # @param mapper [Hash] Ruby Hash object to represent expected structure of the object.
401
+ # @param object [Object] Ruby object to serialize.
402
+ # @param object_name [String] Name of the serialized object.
403
+ #
404
+ def serialize_sequence_type(mapper, object, object_name)
405
+ unless object.is_a?(Array)
406
+ fail DeserializationError.new("#{object_name} must be of type of Array", nil, nil, object)
407
+ end
408
+
409
+ unless mapper[:type][:element].nil? || mapper[:type][:element].is_a?(Hash)
410
+ fail DeserializationError.new("'element' metadata for a sequence type must be defined in the mapper and it must be of type Hash in #{object_name}", nil, nil, object)
411
+ end
412
+
413
+ payload = Array.new
414
+ object.each do |element|
415
+ if !element.nil? && element.respond_to?(:validate)
416
+ element.validate
417
+ end
418
+ payload.push(serialize(mapper[:type][:element], element))
419
+ end
420
+ payload
421
+ end
422
+
423
+ #
424
+ # Retrieves model of the model_name
425
+ #
426
+ # @param model_name [String] Name of the model to retrieve.
427
+ #
428
+ def get_model(model_name)
429
+ begin
430
+ consts = @context.class.to_s.split('::')
431
+ end_index = 0
432
+ if consts.any?{ |const| const == 'Models' }
433
+ # context is a model class
434
+ end_index = -2
435
+ else
436
+ # context is a service, so find the model class
437
+ end_index = -1
438
+ end
439
+ Object.const_get(consts[0...end_index].join('::') + "::Models::#{model_name}")
440
+ rescue
441
+ Object.const_get("MsRestAzure::#{model_name}")
442
+ end
443
+ end
444
+
445
+ #
446
+ # Checks whether given enum_value is valid for the mapper or not
447
+ #
448
+ # @param mapper [Hash] Ruby Hash object containing meta data
449
+ # @param enum_value [String] Enum value to validate
450
+ #
451
+ def enum_is_valid(mapper, enum_value)
452
+ if enum_value.is_a?(String) && !enum_value.empty?
453
+ model = get_model(mapper[:type][:module])
454
+ model.constants.any? { |e| model.const_get(e).to_s.downcase == enum_value.downcase }
455
+ else
456
+ false
457
+ end
458
+ end
459
+
460
+ # Splits serialized_name with '.' to compute levels of object hierarchy
461
+ #
462
+ # @param serialized_name [String] Name to split
463
+ #
464
+ def split_serialized_name(serialized_name)
465
+ result = Array.new
466
+ element = ''
467
+
468
+ levels = serialized_name.to_s.split('.')
469
+ levels.each do |level|
470
+ unless level.match(/.*\\$/).nil?
471
+ # Flattened properties will be discovered at different levels in model class and response body
472
+ element = "#{element}#{level.gsub!('\\','')}."
473
+ else
474
+ element = "#{element}#{level}"
475
+ result.push(element) unless element.empty?
476
+ element = ''
477
+ end
478
+ end
479
+ result
480
+ end
481
+ end
482
+ end
483
+ end
@@ -0,0 +1,115 @@
1
+ # encoding: utf-8
2
+ # Copyright (c) Microsoft Corporation. All rights reserved.
3
+ # Licensed under the MIT License. See License.txt in the project root for license information.
4
+
5
+ module MsRest
6
+ #
7
+ # Class which represents a point of access to the REST API.
8
+ #
9
+ class ServiceClient
10
+
11
+ # @return [MsRest::ServiceClientCredentials] the credentials object.
12
+ attr_accessor :credentials
13
+
14
+ # @return [Hash{String=>String}] default middlewares configuration for requests.
15
+ attr_accessor :middlewares
16
+
17
+ # @return [Hash{String=>String}] default request headers for requests.
18
+ attr_accessor :request_headers
19
+
20
+ # @return [Array] strings to be appended to the user agent in the request
21
+ attr_accessor :user_agent_extended
22
+
23
+ #
24
+ # Creates and initialize new instance of the ServiceClient class.
25
+ #
26
+ # @param credentials [MsRest::ServiceClientCredentials] credentials to authorize
27
+ # HTTP requests made by the service client.
28
+ # @param options additional parameters for the HTTP request (not implemented yet).
29
+ #
30
+ def initialize(credentials = nil, options = nil)
31
+ @credentials = credentials
32
+ @request_headers = {}
33
+ @middlewares = {middlewares: [[MsRest::RetryPolicyMiddleware, times: 3, retry: 0.02], [:cookie_jar]]}
34
+ @user_agent_extended = []
35
+ @user_agent_extended.push("ms_rest/#{MsRest::VERSION}")
36
+ end
37
+
38
+ #
39
+ # @param base_url [String] the base url for the request.
40
+ # @param method [Symbol] with any of the following values :get, :put, :post, :patch, :delete.
41
+ # @param path [String] the path, relative to {base_url}.
42
+ # @param options [Hash{String=>String}] specifying any request options like :credentials, :body, etc.
43
+ # @return [Concurrent::Promise] Promise object which holds the HTTP response.
44
+ #
45
+ def make_request_async(base_url, method, path, options = {})
46
+ options = @middlewares.merge(options)
47
+ options[:credentials] = options[:credentials] || @credentials
48
+ options[:user_agent_extended] = @user_agent_extended
49
+ request = MsRest::HttpOperationRequest.new(base_url, path, method, options)
50
+ promise = request.run_promise do |req|
51
+ options[:credentials].sign_request(req) unless options[:credentials].nil?
52
+ end
53
+ promise = promise.then do |http_response|
54
+ response_content = http_response.body.to_s.empty? ? nil : http_response.body
55
+ # Create response
56
+ create_response(request, http_response, response_content)
57
+ end
58
+ promise.execute
59
+ end
60
+
61
+ #
62
+ # Add additional information into User-Agent header.
63
+ # @param [String] additional_user_agent_information additional product information for user agent string.
64
+ #
65
+ # Example:
66
+ # recommended format is Product/[version]
67
+ # please refer https://github.com/Azure/azure-sdk-for-ruby/issues/517 for more information.
68
+ #
69
+ # add_user_agent_information('fog-azure-rm/0.2.0')
70
+ #
71
+ def add_user_agent_information(additional_user_agent_information)
72
+ @user_agent_extended.push(additional_user_agent_information)
73
+ end
74
+
75
+ private
76
+ #
77
+ # Retrieves a new instance of the HttpOperationResponse class.
78
+ # @param [MsRest::HttpOperationRequest] request the HTTP request object.
79
+ # @param [Faraday::Response] response the HTTP response object.
80
+ # @param [String] body the HTTP response body.
81
+ # @return [MsRest::HttpOperationResponse] the operation response.
82
+ #
83
+ def create_response(request, http_response, body = nil)
84
+ HttpOperationResponse.new(request, http_response, body)
85
+ end
86
+ end
87
+
88
+ #
89
+ # Hash of SSL options for Faraday connection. Default is nil.
90
+ #
91
+ @@ssl_options = {}
92
+
93
+ #
94
+ # Stores the SSL options to be used for Faraday connections.
95
+ # ==== Examples
96
+ # MsRest.use_ssl_cert # => Uses bundled certificate for all the connections
97
+ # MsRest.use_ssl_cert({:ca_file => "path_to_ca_file"}) # => Uses supplied certificate for all the connections
98
+ #
99
+ # @param ssl_options [Hash] Hash of SSL options for Faraday connection. It defaults to the bundled certificate.
100
+ #
101
+ def self.use_ssl_cert(ssl_options = nil)
102
+ if ssl_options.nil?
103
+ @@ssl_options = {:ca_file => File.expand_path(File.join(File.dirname(__FILE__), '../..', 'ca-cert.pem')) }
104
+ else
105
+ @@ssl_options = ssl_options
106
+ end
107
+ end
108
+
109
+ #
110
+ # @return [Hash] Hash of SSL options to be used for Faraday connection.
111
+ #
112
+ def self.ssl_options
113
+ @@ssl_options
114
+ end
115
+ end
@@ -0,0 +1,11 @@
1
+ # encoding: utf-8
2
+ # Copyright (c) Microsoft Corporation. All rights reserved.
3
+ # Licensed under the MIT License. See License.txt in the project root for license information.
4
+
5
+ module MsRest
6
+ #
7
+ # Class which represents an error meaning that invalid Model object was created by user or provided from server.
8
+ #
9
+ class ValidationError < RestError
10
+ end
11
+ end
@@ -0,0 +1,7 @@
1
+ # encoding: utf-8
2
+ # Copyright (c) Microsoft Corporation. All rights reserved.
3
+ # Licensed under the MIT License. See License.txt in the project root for license information.
4
+
5
+ module MsRest
6
+ VERSION = '0.7.6'
7
+ end
data/lib/ms_rest.rb ADDED
@@ -0,0 +1,29 @@
1
+ # encoding: utf-8
2
+ # Copyright (c) Microsoft Corporation. All rights reserved.
3
+ # Licensed under the MIT License. See License.txt in the project root for license information.
4
+
5
+ require 'base64'
6
+ require 'openssl'
7
+ require 'faraday'
8
+ require 'timeliness'
9
+ require 'ms_rest/version'
10
+
11
+ require 'ms_rest/credentials/token_provider'
12
+ require 'ms_rest/credentials/string_token_provider'
13
+ require 'ms_rest/credentials/service_client_credentials'
14
+ require 'ms_rest/credentials/basic_authentication_credentials'
15
+ require 'ms_rest/credentials/token_credentials'
16
+
17
+ require 'ms_rest/rest_error.rb'
18
+ require 'ms_rest/deserialization_error.rb'
19
+ require 'ms_rest/validation_error.rb'
20
+ require 'ms_rest/serialization.rb'
21
+ require 'ms_rest/http_operation_response'
22
+ require 'ms_rest/http_operation_request'
23
+ require 'ms_rest/http_operation_error'
24
+ require 'ms_rest/retry_policy_middleware'
25
+ require 'ms_rest/service_client'
26
+ require 'ms_rest/jsonable'
27
+
28
+ module MsRest end
29
+ module MsRest::Serialization end