aspose_slides_cloud 1.0.3 → 19.9.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (203) hide show
  1. checksums.yaml +5 -5
  2. data/.gitignore +1 -0
  3. data/Gemfile +7 -0
  4. data/LICENSE +2 -3
  5. data/README.md +7 -39
  6. data/Rakefile +8 -0
  7. data/TestData/TemplateCV.pptx +0 -0
  8. data/TestData/TemplatingCVDataWithBase64.xml +23 -0
  9. data/TestData/placeholders.pptx +0 -0
  10. data/TestData/test-unprotected.ppt +0 -0
  11. data/TestData/test.ppt +0 -0
  12. data/aspose_slides_cloud.gemspec +42 -14
  13. data/lib/aspose_slides_cloud.rb +183 -78
  14. data/lib/aspose_slides_cloud/api/slides_api.rb +6906 -2256
  15. data/lib/aspose_slides_cloud/api/slides_api_requests.rb +3067 -0
  16. data/lib/aspose_slides_cloud/api_client.rb +273 -183
  17. data/lib/aspose_slides_cloud/api_error.rb +29 -5
  18. data/lib/aspose_slides_cloud/configuration.rb +93 -81
  19. data/lib/aspose_slides_cloud/models/add_layout_slide.rb +261 -0
  20. data/lib/aspose_slides_cloud/models/add_master_slide.rb +276 -0
  21. data/lib/aspose_slides_cloud/models/add_shape.rb +256 -0
  22. data/lib/aspose_slides_cloud/models/add_slide.rb +286 -0
  23. data/lib/aspose_slides_cloud/models/api_info.rb +205 -0
  24. data/lib/aspose_slides_cloud/models/arrow_head_properties.rb +257 -22
  25. data/lib/aspose_slides_cloud/models/audio_frame.rb +573 -0
  26. data/lib/aspose_slides_cloud/models/axes.rb +225 -0
  27. data/lib/aspose_slides_cloud/models/axis.rb +847 -0
  28. data/lib/aspose_slides_cloud/models/base64_input_file.rb +256 -0
  29. data/lib/aspose_slides_cloud/models/blur_effect.rb +215 -0
  30. data/lib/aspose_slides_cloud/models/bubble_chart_data_point.rb +230 -0
  31. data/lib/aspose_slides_cloud/models/bubble_series.rb +463 -0
  32. data/lib/aspose_slides_cloud/models/chart.rb +543 -0
  33. data/lib/aspose_slides_cloud/models/chart_title.rb +210 -0
  34. data/lib/aspose_slides_cloud/models/chart_wall.rb +279 -0
  35. data/lib/aspose_slides_cloud/models/color_scheme.rb +258 -84
  36. data/lib/aspose_slides_cloud/models/connector.rb +487 -0
  37. data/lib/aspose_slides_cloud/models/custom_dash_pattern.rb +171 -13
  38. data/lib/aspose_slides_cloud/models/disc_usage.rb +215 -0
  39. data/lib/aspose_slides_cloud/models/document.rb +222 -46
  40. data/lib/aspose_slides_cloud/models/document_properties.rb +188 -36
  41. data/lib/aspose_slides_cloud/models/document_property.rb +209 -48
  42. data/lib/aspose_slides_cloud/models/document_replace_result.rb +272 -0
  43. data/lib/aspose_slides_cloud/models/effect.rb +412 -0
  44. data/lib/aspose_slides_cloud/models/effect_format.rb +265 -0
  45. data/lib/aspose_slides_cloud/models/error.rb +225 -0
  46. data/lib/aspose_slides_cloud/models/error_details.rb +210 -0
  47. data/lib/aspose_slides_cloud/models/export_format.rb +59 -0
  48. data/lib/aspose_slides_cloud/models/export_options.rb +194 -0
  49. data/lib/aspose_slides_cloud/models/file_version.rb +270 -0
  50. data/lib/aspose_slides_cloud/models/file_versions.rb +197 -0
  51. data/lib/aspose_slides_cloud/models/files_list.rb +197 -0
  52. data/lib/aspose_slides_cloud/models/files_upload_result.rb +209 -0
  53. data/lib/aspose_slides_cloud/models/fill_format.rb +204 -13
  54. data/lib/aspose_slides_cloud/models/fill_overlay_effect.rb +234 -0
  55. data/lib/aspose_slides_cloud/models/font_scheme.rb +204 -48
  56. data/lib/aspose_slides_cloud/models/font_set.rb +184 -22
  57. data/lib/aspose_slides_cloud/models/format_scheme.rb +210 -52
  58. data/lib/aspose_slides_cloud/models/geometry_shape.rb +439 -0
  59. data/lib/aspose_slides_cloud/models/glow_effect.rb +210 -0
  60. data/lib/aspose_slides_cloud/models/gradient_fill.rb +359 -0
  61. data/lib/aspose_slides_cloud/models/gradient_fill_stop.rb +210 -0
  62. data/lib/aspose_slides_cloud/models/graphical_object.rb +422 -0
  63. data/lib/aspose_slides_cloud/models/group_shape.rb +422 -0
  64. data/lib/aspose_slides_cloud/models/html_export_options.rb +392 -25
  65. data/lib/aspose_slides_cloud/models/i_shape_export_options.rb +195 -0
  66. data/lib/aspose_slides_cloud/models/image.rb +216 -42
  67. data/lib/aspose_slides_cloud/models/image_export_format.rb +43 -0
  68. data/lib/aspose_slides_cloud/models/image_export_options.rb +298 -0
  69. data/lib/aspose_slides_cloud/models/images.rb +188 -36
  70. data/lib/aspose_slides_cloud/models/inner_shadow_effect.rb +240 -0
  71. data/lib/aspose_slides_cloud/models/input.rb +215 -0
  72. data/lib/aspose_slides_cloud/models/input_file.rb +238 -0
  73. data/lib/aspose_slides_cloud/models/interactive_sequence.rb +212 -0
  74. data/lib/aspose_slides_cloud/models/layout_slide.rb +288 -0
  75. data/lib/aspose_slides_cloud/models/layout_slides.rb +219 -0
  76. data/lib/aspose_slides_cloud/models/legend.rb +339 -0
  77. data/lib/aspose_slides_cloud/models/line_format.rb +349 -54
  78. data/lib/aspose_slides_cloud/models/master_slide.rb +241 -0
  79. data/lib/aspose_slides_cloud/models/master_slides.rb +219 -0
  80. data/lib/aspose_slides_cloud/models/merge.rb +248 -0
  81. data/lib/aspose_slides_cloud/models/merging_source.rb +207 -0
  82. data/lib/aspose_slides_cloud/models/no_fill.rb +236 -0
  83. data/lib/aspose_slides_cloud/models/notes_slide.rb +227 -0
  84. data/lib/aspose_slides_cloud/models/notes_slide_export_format.rb +43 -0
  85. data/lib/aspose_slides_cloud/models/object_exist.rb +215 -0
  86. data/lib/aspose_slides_cloud/models/ole_object_frame.rb +447 -0
  87. data/lib/aspose_slides_cloud/models/one_value_chart_data_point.rb +200 -0
  88. data/lib/aspose_slides_cloud/models/one_value_series.rb +463 -0
  89. data/lib/aspose_slides_cloud/models/ordered_merge_request.rb +171 -13
  90. data/lib/aspose_slides_cloud/models/outer_shadow_effect.rb +240 -0
  91. data/lib/aspose_slides_cloud/models/output_file.rb +228 -0
  92. data/lib/aspose_slides_cloud/models/paragraph.rb +494 -34
  93. data/lib/aspose_slides_cloud/models/paragraphs.rb +187 -35
  94. data/lib/aspose_slides_cloud/models/path_input_file.rb +266 -0
  95. data/lib/aspose_slides_cloud/models/path_output_file.rb +256 -0
  96. data/lib/aspose_slides_cloud/models/pattern_fill.rb +283 -0
  97. data/lib/aspose_slides_cloud/models/pdf_export_options.rb +467 -49
  98. data/lib/aspose_slides_cloud/models/picture_fill.rb +368 -0
  99. data/lib/aspose_slides_cloud/models/picture_frame.rb +459 -0
  100. data/lib/aspose_slides_cloud/models/pipeline.rb +207 -0
  101. data/lib/aspose_slides_cloud/models/placeholder.rb +294 -56
  102. data/lib/aspose_slides_cloud/models/placeholders.rb +188 -36
  103. data/lib/aspose_slides_cloud/models/plot_area.rb +324 -0
  104. data/lib/aspose_slides_cloud/models/portion.rb +564 -46
  105. data/lib/aspose_slides_cloud/models/portions.rb +219 -0
  106. data/lib/aspose_slides_cloud/models/pptx_export_options.rb +246 -0
  107. data/lib/aspose_slides_cloud/models/presentation_to_merge.rb +188 -18
  108. data/lib/aspose_slides_cloud/models/presentations_merge_request.rb +185 -15
  109. data/lib/aspose_slides_cloud/models/preset_shadow_effect.rb +274 -0
  110. data/lib/aspose_slides_cloud/models/reflection_effect.rb +429 -0
  111. data/lib/aspose_slides_cloud/models/remove_shape.rb +246 -0
  112. data/lib/aspose_slides_cloud/models/remove_slide.rb +251 -0
  113. data/lib/aspose_slides_cloud/models/reorder_slide.rb +266 -0
  114. data/lib/aspose_slides_cloud/models/replace_text.rb +286 -0
  115. data/lib/aspose_slides_cloud/models/request_input_file.rb +261 -0
  116. data/lib/aspose_slides_cloud/models/reset_slide.rb +251 -0
  117. data/lib/aspose_slides_cloud/models/resource_base.rb +207 -0
  118. data/lib/aspose_slides_cloud/models/resource_uri.rb +190 -26
  119. data/lib/aspose_slides_cloud/models/resource_uri_element.rb +171 -13
  120. data/lib/aspose_slides_cloud/models/response_output_file.rb +236 -0
  121. data/lib/aspose_slides_cloud/models/save.rb +283 -0
  122. data/lib/aspose_slides_cloud/models/save_shape.rb +293 -0
  123. data/lib/aspose_slides_cloud/models/save_slide.rb +318 -0
  124. data/lib/aspose_slides_cloud/models/scale_type.rb +41 -0
  125. data/lib/aspose_slides_cloud/models/scatter_chart_data_point.rb +215 -0
  126. data/lib/aspose_slides_cloud/models/scatter_series.rb +463 -0
  127. data/lib/aspose_slides_cloud/models/series.rb +424 -0
  128. data/lib/aspose_slides_cloud/models/series_marker.rb +279 -0
  129. data/lib/aspose_slides_cloud/models/shape.rb +398 -100
  130. data/lib/aspose_slides_cloud/models/shape_base.rb +406 -0
  131. data/lib/aspose_slides_cloud/models/shape_export_format.rb +44 -0
  132. data/lib/aspose_slides_cloud/models/shape_image_export_options.rb +274 -0
  133. data/lib/aspose_slides_cloud/models/shape_thumbnail_bounds.rb +41 -0
  134. data/lib/aspose_slides_cloud/models/shapes.rb +219 -0
  135. data/lib/aspose_slides_cloud/models/size_type.rb +55 -0
  136. data/lib/aspose_slides_cloud/models/slide.rb +277 -66
  137. data/lib/aspose_slides_cloud/models/slide_animation.rb +231 -0
  138. data/lib/aspose_slides_cloud/models/slide_background.rb +245 -42
  139. data/lib/aspose_slides_cloud/models/slide_comment.rb +198 -24
  140. data/lib/aspose_slides_cloud/models/slide_comments.rb +188 -36
  141. data/lib/aspose_slides_cloud/models/slide_export_format.rb +58 -0
  142. data/lib/aspose_slides_cloud/models/slide_replace_result.rb +347 -0
  143. data/lib/aspose_slides_cloud/models/slides.rb +188 -36
  144. data/lib/aspose_slides_cloud/models/smart_art.rb +530 -0
  145. data/lib/aspose_slides_cloud/models/smart_art_node.rb +281 -0
  146. data/lib/aspose_slides_cloud/models/smart_art_shape.rb +422 -0
  147. data/lib/aspose_slides_cloud/models/soft_edge_effect.rb +200 -0
  148. data/lib/aspose_slides_cloud/models/solid_fill.rb +246 -0
  149. data/lib/aspose_slides_cloud/models/split_document_result.rb +188 -36
  150. data/lib/aspose_slides_cloud/models/storage_exist.rb +200 -0
  151. data/lib/aspose_slides_cloud/models/storage_file.rb +245 -0
  152. data/lib/aspose_slides_cloud/models/svg_export_options.rb +378 -0
  153. data/lib/aspose_slides_cloud/models/swf_export_options.rb +528 -0
  154. data/lib/aspose_slides_cloud/models/table.rb +578 -0
  155. data/lib/aspose_slides_cloud/models/table_cell.rb +431 -0
  156. data/lib/aspose_slides_cloud/models/table_column.rb +200 -0
  157. data/lib/aspose_slides_cloud/models/table_row.rb +227 -0
  158. data/lib/aspose_slides_cloud/models/task.rb +228 -0
  159. data/lib/aspose_slides_cloud/models/text_item.rb +178 -18
  160. data/lib/aspose_slides_cloud/models/text_items.rb +188 -36
  161. data/lib/aspose_slides_cloud/models/theme.rb +210 -52
  162. data/lib/aspose_slides_cloud/models/tiff_export_options.rb +385 -40
  163. data/lib/aspose_slides_cloud/models/update_background.rb +258 -0
  164. data/lib/aspose_slides_cloud/models/update_shape.rb +256 -0
  165. data/lib/aspose_slides_cloud/models/video_frame.rb +543 -0
  166. data/lib/aspose_slides_cloud/models/xps_export_options.rb +242 -0
  167. data/lib/aspose_slides_cloud/version.rb +23 -1
  168. data/spec/api/slides_api_spec.rb +24188 -0
  169. data/spec/extra/extra_spec.rb +84 -0
  170. data/spec/spec_helper.rb +122 -0
  171. data/spec/spec_utils.rb +154 -0
  172. data/testConfig.json +7 -0
  173. data/testRules.json +333 -0
  174. metadata +273 -61
  175. data/lib/aspose_slides_cloud/models/base_object.rb +0 -86
  176. data/lib/aspose_slides_cloud/models/base_response.rb +0 -53
  177. data/lib/aspose_slides_cloud/models/color.rb +0 -29
  178. data/lib/aspose_slides_cloud/models/color_scheme_response.rb +0 -61
  179. data/lib/aspose_slides_cloud/models/common_response.rb +0 -53
  180. data/lib/aspose_slides_cloud/models/document_properties_response.rb +0 -61
  181. data/lib/aspose_slides_cloud/models/document_property_response.rb +0 -61
  182. data/lib/aspose_slides_cloud/models/document_response.rb +0 -61
  183. data/lib/aspose_slides_cloud/models/font_scheme_response.rb +0 -61
  184. data/lib/aspose_slides_cloud/models/format_scheme_response.rb +0 -61
  185. data/lib/aspose_slides_cloud/models/images_response.rb +0 -61
  186. data/lib/aspose_slides_cloud/models/new_shape_response.rb +0 -61
  187. data/lib/aspose_slides_cloud/models/paragraph_portion_response.rb +0 -61
  188. data/lib/aspose_slides_cloud/models/placeholder_response.rb +0 -61
  189. data/lib/aspose_slides_cloud/models/placeholders_response.rb +0 -61
  190. data/lib/aspose_slides_cloud/models/presentation_string_replace_response.rb +0 -69
  191. data/lib/aspose_slides_cloud/models/shape_list.rb +0 -67
  192. data/lib/aspose_slides_cloud/models/shape_paragraph_response.rb +0 -61
  193. data/lib/aspose_slides_cloud/models/shape_paragraphs_response.rb +0 -61
  194. data/lib/aspose_slides_cloud/models/shape_response.rb +0 -61
  195. data/lib/aspose_slides_cloud/models/slide_background_response.rb +0 -61
  196. data/lib/aspose_slides_cloud/models/slide_comments_response.rb +0 -61
  197. data/lib/aspose_slides_cloud/models/slide_list_response.rb +0 -61
  198. data/lib/aspose_slides_cloud/models/slide_response.rb +0 -61
  199. data/lib/aspose_slides_cloud/models/slide_string_replace_response.rb +0 -69
  200. data/lib/aspose_slides_cloud/models/split_document_response.rb +0 -61
  201. data/lib/aspose_slides_cloud/models/text_items_response.rb +0 -61
  202. data/lib/aspose_slides_cloud/models/theme_response.rb +0 -61
  203. data/test/slides_tests.rb +0 -580
@@ -1,162 +1,226 @@
1
+ =begin
2
+ Copyright (c) 2019 Aspose Pty Ltd
3
+
4
+ Permission is hereby granted, free of charge, to any person obtaining a copy
5
+ of this software and associated documentation files (the "Software"), to deal
6
+ in the Software without restriction, including without limitation the rights
7
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
8
+ copies of the Software, and to permit persons to whom the Software is
9
+ furnished to do so, subject to the following conditions:
10
+
11
+ The above copyright notice and this permission notice shall be included in all
12
+ copies or substantial portions of the Software.
13
+
14
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
15
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
16
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
17
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
18
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
19
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
20
+ SOFTWARE.
21
+ =end
22
+
1
23
  require 'date'
2
24
  require 'json'
3
25
  require 'logger'
4
26
  require 'tempfile'
5
- require 'typhoeus'
27
+ require 'faraday'
6
28
  require 'uri'
7
- require 'openssl'
8
- require 'base64'
9
- require 'rexml/document'
10
29
 
11
30
  module AsposeSlidesCloud
12
31
  class ApiClient
13
-
14
- include AsposeStorageCloud
15
-
16
- attr_accessor :host
32
+ # The Configuration object holding settings to be used in the API client.
33
+ attr_accessor :config
17
34
 
18
35
  # Defines the headers to be used in HTTP requests of all API calls by default.
19
36
  #
20
37
  # @return [Hash]
21
38
  attr_accessor :default_headers
22
39
 
23
- # Stores the HTTP response from the last API call using this API client.
24
- attr_accessor :last_response
25
-
26
- def initialize(host = nil)
27
- @host = host || Configuration.base_url
28
- @format = 'json'
29
- @user_agent = "ruby-swagger-#{VERSION}"
30
- @default_headers = {
31
- 'Content-Type' => "application/#{@format.downcase}",
32
- 'User-Agent' => @user_agent
33
- }
40
+ # Initializes the ApiClient
41
+ # @option config [Configuration] Configuration for initializing the object, default to Configuration.default
42
+ def initialize(config = Configuration.default)
43
+ @config = config
44
+ end
45
+
46
+ def self.default
47
+ @@default ||= ApiClient.new
34
48
  end
35
49
 
50
+ # Call an API with given options.
51
+ #
52
+ # @return [Array<(Object, Fixnum, Hash)>] an array of 3 elements:
53
+ # the data deserialized from response body (could be nil), response status code and response headers.
36
54
  def call_api(http_method, path, opts = {})
37
- request = build_request(http_method, path, opts)
38
- response = request.run
55
+ response = call_api_method(http_method, path, opts)
56
+ if @config.debugging
57
+ @config.logger.debug "HTTP response\nHeaders: #{response.headers}\nStatus: #{response.status}\nBody: #{response.body}\n"
58
+ end
39
59
 
40
- # record as last response
41
- @last_response = response
60
+ if response.status == 401 and @config.access_token
61
+ @config.access_token = nil
62
+ return repeat_call_api(http_method, path, opts)
63
+ end
64
+
65
+ return process_response(response, opts)
66
+ end
42
67
 
43
- if Configuration.debugging
44
- Configuration.logger.debug "HTTP response body ~BEGIN~\n#{response.body}\n~END~\n"
68
+ # Call an API with given options.
69
+ #
70
+ # @return [Array<(Object, Fixnum, Hash)>] an array of 3 elements:
71
+ # the data deserialized from response body (could be nil), response status code and response headers.
72
+ def repeat_call_api(http_method, path, opts = {})
73
+ response = call_api_method(http_method, path, opts)
74
+ if @config.debugging
75
+ @config.logger.debug "HTTP response\nHeaders: #{response.headers}\nStatus: #{response.status}\nBody: #{response.body}\n"
45
76
  end
46
77
 
78
+ return process_response(response, opts)
79
+ end
80
+
81
+ # Call an API with given options.
82
+ #
83
+ # @return [Array<(Object, Fixnum, Hash)>] an array of 3 elements:
84
+ # the data deserialized from response body (could be nil), response status code and response headers.
85
+ def process_response(response, opts)
47
86
  unless response.success?
48
- fail ApiError.new(:code => response.code,
49
- :response_headers => response.headers,
50
- :response_body => response.body),
51
- response.status_message
87
+ if response.status == 0
88
+ # Errors from libcurl will be made visible here
89
+ fail ApiError.new(:code => 0,
90
+ :message => response.return_message)
91
+ else
92
+ fail ApiError.new(:code => response.status,
93
+ :response_headers => response.headers,
94
+ :response_body => response.body),
95
+ response.reason_phrase
96
+ end
52
97
  end
53
98
 
54
99
  if opts[:return_type]
55
- deserialize(response, opts[:return_type])
100
+ data = deserialize(response, opts[:return_type])
56
101
  else
57
- nil
102
+ data = nil
58
103
  end
59
- end
60
104
 
61
- def build_request(http_method, path, opts = {})
62
- url = build_request_url(path)
63
- http_method = http_method.to_sym.downcase
64
-
65
- header_params = @default_headers.merge(opts[:header_params] || {})
66
- query_params = {}
67
- form_params = opts[:form_params] || {}
105
+ return data, response.status, response.headers
106
+ end
68
107
 
69
- req_opts = {
70
- :method => http_method,
71
- :headers => header_params,
72
- :params => query_params,
73
- :ssl_verifypeer => Configuration.verify_ssl,
74
- :sslcert => Configuration.cert_file,
75
- :sslkey => Configuration.key_file,
76
- :cainfo => Configuration.ssl_ca_cert,
77
- :verbose => Configuration.debugging
78
- }
79
-
80
- if [:post, :patch, :put, :delete].include?(http_method)
81
- req_body = build_request_body(header_params, form_params, opts[:body])
82
- req_opts.update :body => req_body
83
- if Configuration.debugging
84
- Configuration.logger.debug "HTTP request body param ~BEGIN~\n#{req_body}\n~END~\n"
108
+ # Call an API with given options.
109
+ #
110
+ # @return [Array<(Object, Fixnum, Hash)>] an array of 3 elements:
111
+ # the data deserialized from response body (could be nil), response status code and response headers.
112
+ def call_api_method(http_method, path, opts = {})
113
+ connection = Faraday.new(:url => @config.base_path)
114
+ case http_method
115
+ when :GET
116
+ response = connection.get do |req|
117
+ build_request(req, http_method, path, opts)
118
+ end
119
+ when :POST
120
+ response = connection.post do |req|
121
+ build_request(req, http_method, path, opts)
122
+ end
123
+ when :PUT
124
+ response = connection.put do |req|
125
+ build_request(req, http_method, path, opts)
126
+ end
127
+ when :DELETE
128
+ response = connection.delete do |req|
129
+ build_request(req, http_method, path, opts)
85
130
  end
86
131
  end
87
-
88
- url = sign(url, opts[:query_params])
89
- puts url
90
- Typhoeus::Request.new(url, req_opts)
132
+ response
133
+ end
91
134
 
135
+ # Builds the HTTP request
136
+ #
137
+ # @param [String] http_method HTTP method/verb (e.g. POST)
138
+ # @param [String] path URL path (e.g. /account/new)
139
+ # @option opts [Hash] :header_params Header parameters
140
+ # @option opts [Hash] :query_params Query parameters
141
+ # @option opts [Hash] :form_params Query parameters
142
+ # @option opts [Object] :body HTTP body (JSON/XML)
143
+ # @return [Typhoeus::Request] A Typhoeus Request
144
+ def build_request(req, http_method, path, opts = {})
145
+ opts[:query_params].each_key do |key|
146
+ if opts[:query_params][key].kind_of?(Array)
147
+ opts[:query_params][key] = opts[:query_params][key].join[","]
148
+ end
149
+ end
150
+ req.url path.sub(/^\/+/, '')
151
+ req.headers = opts[:header_params]
152
+ req.params = opts[:query_params]
153
+ form_params = opts[:form_params] || {}
154
+ req.body = build_request_body(req.headers, form_params, opts[:body], opts[:files])
155
+ if @config.debugging
156
+ @config.logger.debug "HTTP request\nMethod: #{req.method}\nPath: #{req.path}\nParams: #{req.params}\nHeaders: #{req.headers}\nBody: #{req.body}\n"
157
+ end
158
+ set_headers(req.headers)
92
159
  end
93
-
94
- # Signs a URI with your appSID and Key.
95
- # * :url describes the URL to sign
96
-
97
- def sign(url, query_params)
98
-
99
- fail "Please set Aspose App key and SID first. You can get App key and App SID from https://cloud.aspose.com" if AsposeApp.app_key.nil? || AsposeApp.app_sid.nil?
100
-
101
- url = url[0..-2] if url[-1].eql? '/'
102
-
103
- unless query_params.empty?
104
- url = "#{url}?"
105
- query_params.each { |key, value|
106
- url = "#{url}#{key}=#{value}&"
107
- }
108
- url = url[0..-2]
160
+
161
+ def set_headers(headers)
162
+ headers['x-aspose-client'] = 'ruby sdk'
163
+ headers['x-aspose-version'] = AsposeSlidesCloud::VERSION
164
+ if @config.timeout > 0
165
+ headers['x-aspose-timeout'] = @config.timeout
109
166
  end
167
+ set_auth_header(headers)
168
+ end
110
169
 
111
- url = URI.escape(url)
112
- parsed_url = URI.parse(url)
113
-
114
- url_to_sign = "#{parsed_url.scheme}://#{parsed_url.host}#{parsed_url.path}"
115
- url_to_sign += "?#{parsed_url.query}" if parsed_url.query
116
- if parsed_url.query
117
- url_to_sign += "&appSID=#{AsposeApp.app_sid}"
118
- else
119
- url_to_sign += "?appSID=#{AsposeApp.app_sid}"
120
- end
121
-
122
- # create a signature using the private key and the URL
123
- raw_signature = OpenSSL::HMAC.digest(OpenSSL::Digest.new('sha1'), AsposeApp.app_key, url_to_sign)
124
-
125
- #Convert raw to encoded string
126
- signature = Base64.strict_encode64(raw_signature).tr('+/', '-_')
127
-
128
- #remove invalid character
129
- signature = signature.gsub(/[=_-]/, '=' => '', '_' => '%2f', '-' => '%2b')
130
-
131
- #Define expression
132
- pat = Regexp.new('%[0-9a-f]{2}')
133
-
134
- #Replace the portion matched to the above pattern to upper case
135
- 6.times do
136
- signature = signature.sub(pat, pat.match(signature).to_s.upcase)
170
+ def set_auth_header(headers)
171
+ unless @config.access_token
172
+ auth_token_response = Faraday.post(
173
+ @config.auth_base_url + '/connect/token',
174
+ { :grant_type => 'client_credentials', 'client_id' => @config.app_sid, 'client_secret' => @config.app_key })
175
+
176
+ unless auth_token_response.success?
177
+ if auth_token_response.status == 0
178
+ # Errors from libcurl will be made visible here
179
+ fail ApiError.new(:code => 0,
180
+ :message => auth_token_response.return_message)
181
+ else
182
+ fail ApiError.new(:code => 401,
183
+ :response_headers => auth_token_response.headers,
184
+ :response_body => auth_token_response.body),
185
+ "unauthorized"
186
+ end
187
+ end
188
+ @config.access_token = JSON.parse("[#{auth_token_response.body}]", :symbolize_names => true)[0][:access_token]
137
189
  end
138
-
139
- # prepend the server and append the signature.
140
- url_to_sign + "&signature=#{signature}"
190
+ headers['Authorization'] = 'Bearer ' + @config.access_token
191
+ end
141
192
 
193
+ # Check if the given MIME is a JSON MIME.
194
+ # JSON MIME examples:
195
+ # application/json
196
+ # application/json; charset=UTF8
197
+ # APPLICATION/JSON
198
+ # */*
199
+ # @param [String] mime MIME
200
+ # @return [Boolean] True if the MIME is application/json
201
+ def json_mime?(mime)
202
+ (mime == '*/*') || !(mime =~ /Application\/.*json(?!p)(;.*)?/i).nil?
142
203
  end
143
204
 
144
205
  # Deserialize the response to the given return type.
145
206
  #
207
+ # @param [Response] response HTTP response
146
208
  # @param [String] return_type some examples: "User", "Array[User]", "Hash[String,Integer]"
147
209
  def deserialize(response, return_type)
148
210
  body = response.body
211
+
212
+ # handle file downloading - return the File instance processed in request callbacks
213
+ # note that response body is empty when the file is written in chunks in request on_body callback
214
+
149
215
  return nil if body.nil? || body.empty?
150
216
 
151
- # handle file downloading - save response body into a tmp file and return the File instance
152
- return download_file(response) if return_type == 'File'
217
+ # return response body directly for String return type
218
+ return body if return_type == 'String' or return_type == 'File'
153
219
 
154
220
  # ensuring a default content type
155
221
  content_type = response.headers['Content-Type'] || 'application/json'
156
222
 
157
- unless content_type.start_with?('application/json')
158
- fail "Content-Type is not supported: #{content_type}"
159
- end
223
+ fail "Content-Type is not supported: #{content_type}" unless json_mime?(content_type)
160
224
 
161
225
  begin
162
226
  data = JSON.parse("[#{body}]", :symbolize_names => true)[0]
@@ -172,6 +236,9 @@ module AsposeSlidesCloud
172
236
  end
173
237
 
174
238
  # Convert data to the given return type.
239
+ # @param [Object] data Data to be converted
240
+ # @param [String] return_type Return type
241
+ # @return [Mixed] Data in a particular type
175
242
  def convert_to_type(data, return_type)
176
243
  return nil if data.nil?
177
244
  case return_type
@@ -190,17 +257,17 @@ module AsposeSlidesCloud
190
257
  # parse date time (expecting ISO 8601 format)
191
258
  Date.parse data
192
259
  when 'Object'
193
- # generic object, return directly
260
+ # generic object (usually a Hash), return directly
194
261
  data
195
262
  when /\AArray<(.+)>\z/
196
263
  # e.g. Array<Pet>
197
264
  sub_type = $1
198
- data.map {|item| convert_to_type(item, sub_type) }
265
+ data.map { |item| convert_to_type(item, sub_type) }
199
266
  when /\AHash\<String, (.+)\>\z/
200
267
  # e.g. Hash<String, Integer>
201
268
  sub_type = $1
202
269
  {}.tap do |hash|
203
- data.each {|k, v| hash[k] = convert_to_type(v, sub_type) }
270
+ data.each { |k, v| hash[k] = convert_to_type(v, sub_type) }
204
271
  end
205
272
  else
206
273
  # models, e.g. Pet
@@ -210,62 +277,64 @@ module AsposeSlidesCloud
210
277
  end
211
278
  end
212
279
 
213
- # Save response body into a file in (the defined) temporary folder, using the filename
214
- # from the "Content-Disposition" header if provided, otherwise a random filename.
280
+ # Builds the HTTP request body
215
281
  #
216
- # @see Configuration#temp_folder_path
217
- # @return [File] the file downloaded
218
- def download_file(response)
219
- tmp_file = Tempfile.new '', Configuration.temp_folder_path
220
- content_disposition = response.headers['Content-Disposition']
221
-
222
- if content_disposition
223
- filename = content_disposition[/filename=['"]?([^'"\s]+)['"]?/, 1]
224
- path = File.join File.dirname(tmp_file), filename
282
+ # @param [Hash] header_params Header parameters
283
+ # @param [Hash] form_params Query parameters
284
+ # @param [Object] body HTTP body (JSON/XML)
285
+ # @return [String] HTTP body data in the form of string
286
+ def build_request_body(header_params, form_params, body, files)
287
+ if files and files.length > 0
288
+ boundary = "7d70fb31-0eb9-4846-9ea8-933dfb69d8f1"
289
+ header_params['Content-Type'] = "multipart/form-data; boundary=#{boundary}"
290
+ data = ""
291
+ if body
292
+ put_multipart!(data, boundary, 0, body)
293
+ end
294
+ files.each_with_index do |val, index|
295
+ put_multipart!(data, boundary, index + 1, val)
296
+ end
297
+ data << "\r\n--#{boundary}--\r\n"
298
+ data
225
299
  else
226
- path = tmp_file.path
300
+ header_params['Content-Type'] = 'text/json'
301
+ if body
302
+ data = body.is_a?(String) ? body : body.to_json
303
+ else
304
+ data = nil
305
+ end
227
306
  end
228
- # close and delete temp file
229
- tmp_file.close!
230
-
231
- File.open(path, 'wb') { |file| file.write(response.body) }
232
- Configuration.logger.info "File written to #{path}. Please move the file to a proper "\
233
- "folder for further processing and delete the temp afterwards"
234
- File.new(path)
235
- end
236
-
237
- def build_request_url(path)
238
- # Add leading and trailing slashes to path
239
- path = "/#{path}".gsub(/\/+/, '/')
240
- URI.encode(host + path)
307
+ data
241
308
  end
242
309
 
243
- def build_request_body(header_params, form_params, body)
244
- # http form
245
- if header_params['Content-Type'] == 'application/x-www-form-urlencoded' ||
246
- header_params['Content-Type'] == 'multipart/form-data'
247
-
248
- data = form_params.dup
249
- data.each do |key, value|
250
- if key.eql? "file"
251
- data = value
252
- break
253
- else
254
- data[key] = value.to_s if value && !value.is_a?(File)
255
- end
256
- end
257
- elsif body
258
- data = body.is_a?(String) ? body : body.to_json
259
- else
260
- data = nil
310
+ # Builds the HTTP request body
311
+ #
312
+ # @param [Hash] header_params Header parameters
313
+ # @param [Hash] form_params Query parameters
314
+ # @param [Object] body HTTP body (JSON/XML)
315
+ # @return [String] HTTP body data in the form of string
316
+ def put_multipart!(data, boundary, part_index, part_data)
317
+ data << "\r\n--#{boundary}\r\n"
318
+ if part_index > 0
319
+ data << "Content-Disposition: form-data; name=\"file#{part_index}\";filename=\"null\"\r\n"
320
+ data << "Content-Type: application/octet-stream\r\n"
321
+ elsif
322
+ data << "Content-Disposition: form-data; name=\"data\"\r\n"
323
+ data << "Content-Type: text/json\r\n"
261
324
  end
262
- data
325
+ data << "Content-Length: #{part_data.length}\r\n"
326
+ data << "\r\n"
327
+ data << part_data
263
328
  end
264
329
 
265
330
  # Update hearder and query params based on authentication settings.
331
+ #
332
+ # @param [Hash] header_params Header parameters
333
+ # @param [Hash] query_params Query parameters
334
+ # @param [String] auth_names Authentication scheme name
266
335
  def update_params_for_auth!(header_params, query_params, auth_names)
267
336
  Array(auth_names).each do |auth_name|
268
- auth_setting = Configuration.auth_settings[auth_name]
337
+ auth_setting = @config.auth_settings[auth_name]
269
338
  next unless auth_setting
270
339
  case auth_setting[:in]
271
340
  when 'header' then header_params[auth_setting[:key]] = auth_setting[:value]
@@ -275,49 +344,39 @@ module AsposeSlidesCloud
275
344
  end
276
345
  end
277
346
 
278
- def user_agent=(user_agent)
279
- @user_agent = user_agent
280
- @default_headers['User-Agent'] = @user_agent
281
- end
282
-
283
347
  # Return Accept header based on an array of accepts provided.
284
348
  # @param [Array] accepts array for Accept
285
349
  # @return [String] the Accept header (e.g. application/json)
286
350
  def select_header_accept(accepts)
287
- if accepts.empty?
288
- return
289
- elsif accepts.any?{ |s| s.casecmp('application/json') == 0 }
290
- 'application/json' # look for json data by default
291
- else
292
- accepts.join(',')
293
- end
351
+ return nil if accepts.nil? || accepts.empty?
352
+ # use JSON when present, otherwise use all of the provided
353
+ json_accept = accepts.find { |s| json_mime?(s) }
354
+ json_accept || accepts.join(',')
294
355
  end
295
356
 
296
357
  # Return Content-Type header based on an array of content types provided.
297
358
  # @param [Array] content_types array for Content-Type
298
359
  # @return [String] the Content-Type header (e.g. application/json)
299
360
  def select_header_content_type(content_types)
300
- if content_types.empty?
301
- 'application/json' # use application/json by default
302
- elsif content_types.any?{ |s| s.casecmp('application/json')==0 }
303
- 'application/json' # use application/json if it's included
304
- else
305
- content_types[0] # otherwise, use the first one
306
- end
361
+ # use application/json by default
362
+ return 'application/json' if content_types.nil? || content_types.empty?
363
+ # use JSON when present, otherwise use the first one
364
+ json_content_type = content_types.find { |s| json_mime?(s) }
365
+ json_content_type || content_types.first
307
366
  end
308
367
 
309
368
  # Convert object (array, hash, object, etc) to JSON string.
310
369
  # @param [Object] model object to be converted into JSON string
311
370
  # @return [String] JSON string representation of the object
312
371
  def object_to_http_body(model)
313
- return if model.nil?
314
- _body = nil
372
+ return model if model.nil? || model.is_a?(String)
373
+ local_body = nil
315
374
  if model.is_a?(Array)
316
- _body = model.map{|m| object_to_hash(m) }
375
+ local_body = model.map { |m| object_to_hash(m) }
317
376
  else
318
- _body = object_to_hash(model)
377
+ local_body = object_to_hash(model)
319
378
  end
320
- _body.to_json
379
+ local_body.to_json
321
380
  end
322
381
 
323
382
  # Convert object(non-array) to hash.
@@ -330,7 +389,38 @@ module AsposeSlidesCloud
330
389
  obj
331
390
  end
332
391
  end
333
-
334
-
392
+
393
+ # Convert object(non-array) to hash.
394
+ # @param [Object] obj object to be converted into JSON string
395
+ # @return [String] JSON string representation of the object
396
+ def replace_path_parameter(path, name, value)
397
+ if value == nil
398
+ value = ""
399
+ end
400
+ if value.to_s != ""
401
+ value = "/" + value.to_s
402
+ end
403
+ path.sub('/{' + name + '}', URI::encode(value))
404
+ end
405
+
406
+ # Build parameter value according to the given collection format.
407
+ # @param [String] collection_format one of :csv, :ssv, :tsv, :pipes and :multi
408
+ def build_collection_param(param, collection_format)
409
+ case collection_format
410
+ when :csv
411
+ param.join(',')
412
+ when :ssv
413
+ param.join(' ')
414
+ when :tsv
415
+ param.join("\t")
416
+ when :pipes
417
+ param.join('|')
418
+ when :multi
419
+ # return the array directly as typhoeus will handle it as expected
420
+ param
421
+ else
422
+ fail "unknown collection format: #{collection_format.inspect}"
423
+ end
424
+ end
335
425
  end
336
426
  end