mux_ruby 1.9.0 → 2.1.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 (277) hide show
  1. checksums.yaml +4 -4
  2. data/Gemfile +3 -1
  3. data/Gemfile.lock +26 -37
  4. data/README.md +37 -13
  5. data/docs/AbridgedVideoView.md +33 -13
  6. data/docs/Asset.md +59 -26
  7. data/docs/AssetErrors.md +15 -4
  8. data/docs/AssetMaster.md +15 -4
  9. data/docs/AssetNonStandardInputReasons.md +29 -11
  10. data/docs/AssetRecordingTimes.md +15 -4
  11. data/docs/AssetResponse.md +13 -3
  12. data/docs/AssetStaticRenditions.md +15 -4
  13. data/docs/AssetStaticRenditionsFiles.md +23 -8
  14. data/docs/AssetsApi.md +396 -163
  15. data/docs/BreakdownValue.md +21 -7
  16. data/docs/CreateAssetRequest.md +27 -10
  17. data/docs/CreateLiveStreamRequest.md +29 -9
  18. data/docs/CreatePlaybackIDRequest.md +13 -3
  19. data/docs/CreatePlaybackIDResponse.md +13 -3
  20. data/docs/CreateSimulcastTargetRequest.md +17 -5
  21. data/docs/CreateTrackRequest.md +25 -9
  22. data/docs/CreateTrackResponse.md +13 -3
  23. data/docs/CreateUploadRequest.md +19 -6
  24. data/docs/DeliveryReport.md +27 -9
  25. data/docs/DeliveryUsageApi.md +41 -23
  26. data/docs/DimensionValue.md +15 -4
  27. data/docs/DimensionsApi.md +72 -34
  28. data/docs/DirectUploadsApi.md +131 -56
  29. data/docs/DisableLiveStreamResponse.md +13 -3
  30. data/docs/EnableLiveStreamResponse.md +13 -3
  31. data/docs/Error.md +27 -10
  32. data/docs/ErrorsApi.md +38 -20
  33. data/docs/ExportDate.md +20 -0
  34. data/docs/ExportFile.md +22 -0
  35. data/docs/ExportsApi.md +99 -12
  36. data/docs/FilterValue.md +15 -4
  37. data/docs/FiltersApi.md +71 -33
  38. data/docs/GetAssetInputInfoResponse.md +13 -3
  39. data/docs/GetAssetOrLiveStreamIdResponse.md +13 -3
  40. data/docs/GetAssetOrLiveStreamIdResponseData.md +17 -5
  41. data/docs/GetAssetOrLiveStreamIdResponseDataObject.md +15 -4
  42. data/docs/GetAssetPlaybackIDResponse.md +13 -3
  43. data/docs/GetMetricTimeseriesDataResponse.md +17 -5
  44. data/docs/GetOverallValuesResponse.md +17 -5
  45. data/docs/GetRealTimeBreakdownResponse.md +17 -5
  46. data/docs/GetRealTimeHistogramTimeseriesResponse.md +19 -6
  47. data/docs/GetRealTimeHistogramTimeseriesResponseMeta.md +13 -3
  48. data/docs/GetRealTimeTimeseriesResponse.md +17 -5
  49. data/docs/Incident.md +53 -23
  50. data/docs/IncidentBreakdown.md +17 -5
  51. data/docs/IncidentNotification.md +17 -5
  52. data/docs/IncidentNotificationRule.md +21 -7
  53. data/docs/IncidentResponse.md +15 -4
  54. data/docs/IncidentsApi.md +118 -62
  55. data/docs/InputFile.md +15 -4
  56. data/docs/InputInfo.md +15 -4
  57. data/docs/InputSettings.md +31 -12
  58. data/docs/InputSettingsOverlaySettings.md +25 -9
  59. data/docs/InputTrack.md +29 -11
  60. data/docs/Insight.md +23 -8
  61. data/docs/ListAllMetricValuesResponse.md +17 -5
  62. data/docs/ListAssetsResponse.md +13 -3
  63. data/docs/ListBreakdownValuesResponse.md +17 -5
  64. data/docs/ListDeliveryUsageResponse.md +19 -6
  65. data/docs/ListDimensionValuesResponse.md +17 -5
  66. data/docs/ListDimensionsResponse.md +17 -5
  67. data/docs/ListErrorsResponse.md +17 -5
  68. data/docs/ListExportsResponse.md +17 -5
  69. data/docs/ListFilterValuesResponse.md +17 -5
  70. data/docs/ListFiltersResponse.md +17 -5
  71. data/docs/ListFiltersResponseData.md +15 -4
  72. data/docs/ListIncidentsResponse.md +17 -5
  73. data/docs/ListInsightsResponse.md +17 -5
  74. data/docs/ListLiveStreamsResponse.md +13 -3
  75. data/docs/ListRealTimeDimensionsResponse.md +17 -5
  76. data/docs/ListRealTimeDimensionsResponseData.md +15 -4
  77. data/docs/ListRealTimeMetricsResponse.md +17 -5
  78. data/docs/ListRelatedIncidentsResponse.md +17 -5
  79. data/docs/ListSigningKeysResponse.md +13 -3
  80. data/docs/ListUploadsResponse.md +13 -3
  81. data/docs/ListVideoViewExportsResponse.md +22 -0
  82. data/docs/ListVideoViewsResponse.md +17 -5
  83. data/docs/LiveStream.md +41 -15
  84. data/docs/LiveStreamResponse.md +13 -3
  85. data/docs/LiveStreamsApi.md +418 -170
  86. data/docs/Metric.md +21 -7
  87. data/docs/MetricsApi.md +211 -117
  88. data/docs/NotificationRule.md +17 -5
  89. data/docs/OverallValues.md +19 -6
  90. data/docs/PlaybackID.md +15 -4
  91. data/docs/PlaybackIDApi.md +35 -17
  92. data/docs/PlaybackPolicy.md +10 -2
  93. data/docs/RealTimeApi.md +177 -81
  94. data/docs/RealTimeBreakdownValue.md +21 -7
  95. data/docs/RealTimeHistogramTimeseriesBucket.md +15 -4
  96. data/docs/RealTimeHistogramTimeseriesBucketValues.md +15 -4
  97. data/docs/RealTimeHistogramTimeseriesDatapoint.md +25 -9
  98. data/docs/RealTimeTimeseriesDatapoint.md +17 -5
  99. data/docs/Score.md +23 -8
  100. data/docs/SignalLiveStreamCompleteResponse.md +13 -3
  101. data/docs/SigningKey.md +17 -5
  102. data/docs/SigningKeyResponse.md +13 -3
  103. data/docs/SimulcastTarget.md +21 -7
  104. data/docs/SimulcastTargetResponse.md +13 -3
  105. data/docs/Track.md +37 -15
  106. data/docs/URLSigningKeysApi.md +130 -54
  107. data/docs/UpdateAssetMP4SupportRequest.md +13 -3
  108. data/docs/UpdateAssetMasterAccessRequest.md +13 -3
  109. data/docs/Upload.md +29 -11
  110. data/docs/UploadError.md +15 -4
  111. data/docs/UploadResponse.md +13 -3
  112. data/docs/VideoView.md +251 -114
  113. data/docs/VideoViewEvent.md +19 -6
  114. data/docs/VideoViewResponse.md +15 -4
  115. data/docs/VideoViewsApi.md +78 -41
  116. data/gen/.gitignore +7 -0
  117. data/gen/Makefile +31 -0
  118. data/gen/generator-config.json +11 -0
  119. data/gen/openapitools.json +7 -0
  120. data/gen/package.json +17 -0
  121. data/gen/templates/Gemfile.mustache +11 -0
  122. data/gen/templates/README.mustache +158 -0
  123. data/gen/templates/Rakefile.mustache +10 -0
  124. data/gen/templates/api.mustache +206 -0
  125. data/gen/templates/api_client.mustache +264 -0
  126. data/gen/templates/api_client_faraday_partial.mustache +138 -0
  127. data/gen/templates/api_client_spec.mustache +220 -0
  128. data/gen/templates/api_client_typhoeus_partial.mustache +183 -0
  129. data/gen/templates/api_doc.mustache +118 -0
  130. data/gen/templates/api_error.mustache +67 -0
  131. data/gen/templates/api_info.mustache +12 -0
  132. data/gen/templates/api_test.mustache +47 -0
  133. data/gen/templates/base_object.mustache +120 -0
  134. data/gen/templates/configuration.mustache +349 -0
  135. data/gen/templates/configuration_spec.mustache +34 -0
  136. data/gen/templates/configuration_tls_faraday_partial.mustache +29 -0
  137. data/gen/templates/configuration_tls_typhoeus_partial.mustache +34 -0
  138. data/gen/templates/gem.mustache +40 -0
  139. data/gen/templates/gemspec.mustache +35 -0
  140. data/gen/templates/gitignore.mustache +39 -0
  141. data/gen/templates/model.mustache +26 -0
  142. data/gen/templates/model_doc.mustache +12 -0
  143. data/gen/templates/model_test.mustache +77 -0
  144. data/gen/templates/partial_model_enum_class.mustache +20 -0
  145. data/gen/templates/partial_model_generic.mustache +371 -0
  146. data/gen/templates/partial_model_generic_doc.mustache +28 -0
  147. data/gen/templates/partial_oneof_module.mustache +137 -0
  148. data/gen/templates/partial_oneof_module_doc.mustache +92 -0
  149. data/gen/templates/rspec.mustache +2 -0
  150. data/gen/templates/rubocop.mustache +148 -0
  151. data/gen/templates/spec_helper.mustache +103 -0
  152. data/gen/templates/version.mustache +7 -0
  153. data/gen/yarn.lock +1878 -0
  154. data/lib/mux_ruby/api/assets_api.rb +293 -156
  155. data/lib/mux_ruby/api/delivery_usage_api.rb +32 -16
  156. data/lib/mux_ruby/api/dimensions_api.rb +55 -29
  157. data/lib/mux_ruby/api/direct_uploads_api.rb +90 -44
  158. data/lib/mux_ruby/api/errors_api.rb +34 -18
  159. data/lib/mux_ruby/api/exports_api.rb +86 -13
  160. data/lib/mux_ruby/api/filters_api.rb +53 -27
  161. data/lib/mux_ruby/api/incidents_api.rb +94 -52
  162. data/lib/mux_ruby/api/live_streams_api.rb +299 -157
  163. data/lib/mux_ruby/api/metrics_api.rb +193 -122
  164. data/lib/mux_ruby/api/playback_id_api.rb +33 -17
  165. data/lib/mux_ruby/api/real_time_api.rb +149 -87
  166. data/lib/mux_ruby/api/url_signing_keys_api.rb +95 -48
  167. data/lib/mux_ruby/api/video_views_api.rb +60 -33
  168. data/lib/mux_ruby/api_client.rb +94 -79
  169. data/lib/mux_ruby/api_error.rb +35 -7
  170. data/lib/mux_ruby/configuration.rb +50 -14
  171. data/lib/mux_ruby/models/abridged_video_view.rb +58 -24
  172. data/lib/mux_ruby/models/asset.rb +100 -63
  173. data/lib/mux_ruby/models/asset_errors.rb +50 -15
  174. data/lib/mux_ruby/models/asset_master.rb +52 -17
  175. data/lib/mux_ruby/models/asset_non_standard_input_reasons.rb +70 -35
  176. data/lib/mux_ruby/models/asset_recording_times.rb +50 -16
  177. data/lib/mux_ruby/models/asset_response.rb +48 -14
  178. data/lib/mux_ruby/models/asset_static_renditions.rb +53 -17
  179. data/lib/mux_ruby/models/asset_static_renditions_files.rb +58 -23
  180. data/lib/mux_ruby/models/breakdown_value.rb +52 -18
  181. data/lib/mux_ruby/models/create_asset_request.rb +64 -30
  182. data/lib/mux_ruby/models/create_live_stream_request.rb +78 -23
  183. data/lib/mux_ruby/models/create_playback_id_request.rb +48 -14
  184. data/lib/mux_ruby/models/create_playback_id_response.rb +48 -14
  185. data/lib/mux_ruby/models/create_simulcast_target_request.rb +50 -16
  186. data/lib/mux_ruby/models/create_track_request.rb +60 -26
  187. data/lib/mux_ruby/models/create_track_response.rb +48 -14
  188. data/lib/mux_ruby/models/create_upload_request.rb +52 -18
  189. data/lib/mux_ruby/models/delivery_report.rb +106 -21
  190. data/lib/mux_ruby/models/dimension_value.rb +49 -15
  191. data/lib/mux_ruby/models/disable_live_stream_response.rb +48 -14
  192. data/lib/mux_ruby/models/enable_live_stream_response.rb +48 -14
  193. data/lib/mux_ruby/models/error.rb +63 -21
  194. data/lib/mux_ruby/models/export_date.rb +229 -0
  195. data/lib/mux_ruby/models/export_file.rb +236 -0
  196. data/lib/mux_ruby/models/filter_value.rb +49 -15
  197. data/lib/mux_ruby/models/get_asset_input_info_response.rb +48 -14
  198. data/lib/mux_ruby/models/get_asset_or_live_stream_id_response.rb +48 -14
  199. data/lib/mux_ruby/models/get_asset_or_live_stream_id_response_data.rb +50 -16
  200. data/lib/mux_ruby/models/get_asset_or_live_stream_id_response_data_object.rb +51 -17
  201. data/lib/mux_ruby/models/get_asset_playback_id_response.rb +48 -14
  202. data/lib/mux_ruby/models/get_metric_timeseries_data_response.rb +50 -16
  203. data/lib/mux_ruby/models/get_overall_values_response.rb +50 -16
  204. data/lib/mux_ruby/models/get_real_time_breakdown_response.rb +50 -16
  205. data/lib/mux_ruby/models/get_real_time_histogram_timeseries_response.rb +51 -17
  206. data/lib/mux_ruby/models/get_real_time_histogram_timeseries_response_meta.rb +48 -14
  207. data/lib/mux_ruby/models/get_real_time_timeseries_response.rb +50 -16
  208. data/lib/mux_ruby/models/incident.rb +68 -34
  209. data/lib/mux_ruby/models/incident_breakdown.rb +50 -16
  210. data/lib/mux_ruby/models/incident_notification.rb +50 -16
  211. data/lib/mux_ruby/models/incident_notification_rule.rb +52 -18
  212. data/lib/mux_ruby/models/incident_response.rb +49 -15
  213. data/lib/mux_ruby/models/input_file.rb +49 -15
  214. data/lib/mux_ruby/models/input_info.rb +49 -15
  215. data/lib/mux_ruby/models/input_settings.rb +64 -30
  216. data/lib/mux_ruby/models/input_settings_overlay_settings.rb +58 -24
  217. data/lib/mux_ruby/models/input_track.rb +56 -22
  218. data/lib/mux_ruby/models/insight.rb +53 -19
  219. data/lib/mux_ruby/models/list_all_metric_values_response.rb +50 -16
  220. data/lib/mux_ruby/models/list_assets_response.rb +48 -14
  221. data/lib/mux_ruby/models/list_breakdown_values_response.rb +50 -16
  222. data/lib/mux_ruby/models/list_delivery_usage_response.rb +51 -17
  223. data/lib/mux_ruby/models/list_dimension_values_response.rb +50 -16
  224. data/lib/mux_ruby/models/list_dimensions_response.rb +50 -16
  225. data/lib/mux_ruby/models/list_errors_response.rb +50 -16
  226. data/lib/mux_ruby/models/list_exports_response.rb +50 -16
  227. data/lib/mux_ruby/models/list_filter_values_response.rb +50 -16
  228. data/lib/mux_ruby/models/list_filters_response.rb +50 -16
  229. data/lib/mux_ruby/models/list_filters_response_data.rb +49 -15
  230. data/lib/mux_ruby/models/list_incidents_response.rb +50 -16
  231. data/lib/mux_ruby/models/list_insights_response.rb +50 -16
  232. data/lib/mux_ruby/models/list_live_streams_response.rb +48 -14
  233. data/lib/mux_ruby/models/list_real_time_dimensions_response.rb +50 -16
  234. data/lib/mux_ruby/models/list_real_time_dimensions_response_data.rb +49 -15
  235. data/lib/mux_ruby/models/list_real_time_metrics_response.rb +50 -16
  236. data/lib/mux_ruby/models/list_related_incidents_response.rb +50 -16
  237. data/lib/mux_ruby/models/list_signing_keys_response.rb +48 -14
  238. data/lib/mux_ruby/models/list_uploads_response.rb +48 -14
  239. data/lib/mux_ruby/models/list_video_view_exports_response.rb +240 -0
  240. data/lib/mux_ruby/models/list_video_views_response.rb +50 -16
  241. data/lib/mux_ruby/models/live_stream.rb +131 -29
  242. data/lib/mux_ruby/models/live_stream_response.rb +48 -14
  243. data/lib/mux_ruby/models/metric.rb +52 -18
  244. data/lib/mux_ruby/models/notification_rule.rb +50 -16
  245. data/lib/mux_ruby/models/overall_values.rb +51 -17
  246. data/lib/mux_ruby/models/playback_id.rb +49 -15
  247. data/lib/mux_ruby/models/playback_policy.rb +12 -6
  248. data/lib/mux_ruby/models/real_time_breakdown_value.rb +52 -18
  249. data/lib/mux_ruby/models/real_time_histogram_timeseries_bucket.rb +50 -16
  250. data/lib/mux_ruby/models/real_time_histogram_timeseries_bucket_values.rb +49 -15
  251. data/lib/mux_ruby/models/real_time_histogram_timeseries_datapoint.rb +54 -20
  252. data/lib/mux_ruby/models/real_time_timeseries_datapoint.rb +50 -16
  253. data/lib/mux_ruby/models/score.rb +53 -19
  254. data/lib/mux_ruby/models/signal_live_stream_complete_response.rb +48 -14
  255. data/lib/mux_ruby/models/signing_key.rb +53 -16
  256. data/lib/mux_ruby/models/signing_key_response.rb +48 -14
  257. data/lib/mux_ruby/models/simulcast_target.rb +54 -20
  258. data/lib/mux_ruby/models/simulcast_target_response.rb +48 -14
  259. data/lib/mux_ruby/models/track.rb +67 -33
  260. data/lib/mux_ruby/models/update_asset_master_access_request.rb +50 -16
  261. data/lib/mux_ruby/models/update_asset_mp4_support_request.rb +50 -16
  262. data/lib/mux_ruby/models/upload.rb +61 -25
  263. data/lib/mux_ruby/models/upload_error.rb +51 -15
  264. data/lib/mux_ruby/models/upload_response.rb +48 -14
  265. data/lib/mux_ruby/models/video_view.rb +242 -136
  266. data/lib/mux_ruby/models/video_view_event.rb +51 -17
  267. data/lib/mux_ruby/models/video_view_response.rb +49 -15
  268. data/lib/mux_ruby/version.rb +10 -3
  269. data/lib/mux_ruby.rb +12 -2
  270. data/mux_ruby.gemspec +15 -17
  271. data/spec/api_client_spec.rb +10 -3
  272. data/spec/configuration_spec.rb +9 -2
  273. data/spec/models/export_date_spec.rb +40 -0
  274. data/spec/models/export_file_spec.rb +46 -0
  275. data/spec/models/list_video_view_exports_response_spec.rb +46 -0
  276. data/spec/spec_helper.rb +9 -2
  277. metadata +149 -240
@@ -0,0 +1,138 @@
1
+ # Call an API with given options.
2
+ #
3
+ # @return [Array<(Object, Integer, Hash)>] an array of 3 elements:
4
+ # the data deserialized from response body (could be nil), response status code and response headers.
5
+ def call_api(http_method, path, opts = {})
6
+ ssl_options = {
7
+ :ca_file => @config.ssl_ca_file,
8
+ :verify => @config.ssl_verify,
9
+ :verify_mode => @config.ssl_verify_mode,
10
+ :client_cert => @config.ssl_client_cert,
11
+ :client_key => @config.ssl_client_key
12
+ }
13
+
14
+ connection = Faraday.new(:url => config.base_url, :ssl => ssl_options) do |conn|
15
+ conn.basic_auth(config.username, config.password)
16
+ if opts[:header_params]["Content-Type"] == "multipart/form-data"
17
+ conn.request :multipart
18
+ conn.request :url_encoded
19
+ end
20
+ conn.adapter(Faraday.default_adapter)
21
+ end
22
+
23
+ begin
24
+ response = connection.public_send(http_method.to_sym.downcase) do |req|
25
+ build_request(http_method, path, req, opts)
26
+ end
27
+
28
+ if @config.debugging
29
+ @config.logger.debug "HTTP response body ~BEGIN~\n#{response.body}\n~END~\n"
30
+ end
31
+
32
+ unless response.success?
33
+ if response.status == 0
34
+ # Errors from libcurl will be made visible here
35
+ fail ApiError.new(:code => 0,
36
+ :message => response.return_message)
37
+ else
38
+ fail ApiError.new(:code => response.status,
39
+ :response_headers => response.headers,
40
+ :response_body => response.body),
41
+ response.reason_phrase
42
+ end
43
+ end
44
+ rescue Faraday::TimeoutError
45
+ fail ApiError.new('Connection timed out')
46
+ end
47
+
48
+ if opts[:return_type]
49
+ data = deserialize(response, opts[:return_type])
50
+ else
51
+ data = nil
52
+ end
53
+ return data, response.status, response.headers
54
+ end
55
+
56
+ # Builds the HTTP request
57
+ #
58
+ # @param [String] http_method HTTP method/verb (e.g. POST)
59
+ # @param [String] path URL path (e.g. /account/new)
60
+ # @option opts [Hash] :header_params Header parameters
61
+ # @option opts [Hash] :query_params Query parameters
62
+ # @option opts [Hash] :form_params Query parameters
63
+ # @option opts [Object] :body HTTP body (JSON/XML)
64
+ # @return [Typhoeus::Request] A Typhoeus Request
65
+ def build_request(http_method, path, request, opts = {})
66
+ url = build_request_url(path, opts)
67
+ http_method = http_method.to_sym.downcase
68
+
69
+ header_params = @default_headers.merge(opts[:header_params] || {})
70
+ query_params = opts[:query_params] || {}
71
+ form_params = opts[:form_params] || {}
72
+
73
+ update_params_for_auth! header_params, query_params, opts[:auth_names]
74
+
75
+ req_opts = {
76
+ :method => http_method,
77
+ :headers => header_params,
78
+ :params => query_params,
79
+ :params_encoding => @config.params_encoding,
80
+ :timeout => @config.timeout,
81
+ :verbose => @config.debugging
82
+ }
83
+
84
+ if [:post, :patch, :put, :delete].include?(http_method)
85
+ req_body = build_request_body(header_params, form_params, opts[:body])
86
+ req_opts.update :body => req_body
87
+ if @config.debugging
88
+ @config.logger.debug "HTTP request body param ~BEGIN~\n#{req_body}\n~END~\n"
89
+ end
90
+ end
91
+ request.headers = header_params
92
+ request.body = req_body
93
+ request.url url
94
+ request.params = query_params
95
+ download_file(request) if opts[:return_type] == 'File'
96
+ request
97
+ end
98
+
99
+ # Builds the HTTP request body
100
+ #
101
+ # @param [Hash] header_params Header parameters
102
+ # @param [Hash] form_params Query parameters
103
+ # @param [Object] body HTTP body (JSON/XML)
104
+ # @return [String] HTTP body data in the form of string
105
+ def build_request_body(header_params, form_params, body)
106
+ # http form
107
+ if header_params['Content-Type'] == 'application/x-www-form-urlencoded'
108
+ data = URI.encode_www_form(form_params)
109
+ elsif header_params['Content-Type'] == 'multipart/form-data'
110
+ data = {}
111
+ form_params.each do |key, value|
112
+ case value
113
+ when ::File, ::Tempfile
114
+ # TODO hardcode to application/octet-stream, need better way to detect content type
115
+ data[key] = Faraday::UploadIO.new(value.path, 'application/octet-stream', value.path)
116
+ when ::Array, nil
117
+ # let Faraday handle Array and nil parameters
118
+ data[key] = value
119
+ else
120
+ data[key] = value.to_s
121
+ end
122
+ end
123
+ elsif body
124
+ data = body.is_a?(String) ? body : body.to_json
125
+ else
126
+ data = nil
127
+ end
128
+ data
129
+ end
130
+
131
+ def download_file(request)
132
+ @stream = []
133
+
134
+ # handle streaming Responses
135
+ request.options.on_data = Proc.new do |chunk, overall_received_bytes|
136
+ @stream << chunk
137
+ end
138
+ end
@@ -0,0 +1,220 @@
1
+ =begin
2
+ {{> api_info}}
3
+ =end
4
+
5
+ require 'spec_helper'
6
+
7
+ describe {{moduleName}}::ApiClient do
8
+ context 'initialization' do
9
+ context 'URL stuff' do
10
+ context 'host' do
11
+ it 'removes http from host' do
12
+ {{moduleName}}.configure { |c| c.host = 'http://example.com' }
13
+ expect({{moduleName}}::Configuration.default.host).to eq('example.com')
14
+ end
15
+
16
+ it 'removes https from host' do
17
+ {{moduleName}}.configure { |c| c.host = 'https://wookiee.com' }
18
+ expect({{moduleName}}::ApiClient.default.config.host).to eq('wookiee.com')
19
+ end
20
+
21
+ it 'removes trailing path from host' do
22
+ {{moduleName}}.configure { |c| c.host = 'hobo.com/v4' }
23
+ expect({{moduleName}}::Configuration.default.host).to eq('hobo.com')
24
+ end
25
+ end
26
+
27
+ context 'base_path' do
28
+ it "prepends a slash to base_path" do
29
+ {{moduleName}}.configure { |c| c.base_path = 'v4/dog' }
30
+ expect({{moduleName}}::Configuration.default.base_path).to eq('/v4/dog')
31
+ end
32
+
33
+ it "doesn't prepend a slash if one is already there" do
34
+ {{moduleName}}.configure { |c| c.base_path = '/v4/dog' }
35
+ expect({{moduleName}}::Configuration.default.base_path).to eq('/v4/dog')
36
+ end
37
+
38
+ it "ends up as a blank string if nil" do
39
+ {{moduleName}}.configure { |c| c.base_path = nil }
40
+ expect({{moduleName}}::Configuration.default.base_path).to eq('')
41
+ end
42
+ end
43
+ end
44
+ end
45
+
46
+ {{^isFaraday}}
47
+ describe 'params_encoding in #build_request' do
48
+ let(:config) { {{moduleName}}::Configuration.new }
49
+ let(:api_client) { {{moduleName}}::ApiClient.new(config) }
50
+
51
+ it 'defaults to nil' do
52
+ expect({{moduleName}}::Configuration.default.params_encoding).to eq(nil)
53
+ expect(config.params_encoding).to eq(nil)
54
+
55
+ request = api_client.build_request(:get, '/test')
56
+ expect(request.options[:params_encoding]).to eq(nil)
57
+ end
58
+
59
+ it 'can be customized' do
60
+ config.params_encoding = :multi
61
+ request = api_client.build_request(:get, '/test')
62
+ expect(request.options[:params_encoding]).to eq(:multi)
63
+ end
64
+ end
65
+
66
+ describe 'timeout in #build_request' do
67
+ let(:config) { {{moduleName}}::Configuration.new }
68
+ let(:api_client) { {{moduleName}}::ApiClient.new(config) }
69
+
70
+ it 'defaults to 0' do
71
+ expect({{moduleName}}::Configuration.default.timeout).to eq(0)
72
+ expect(config.timeout).to eq(0)
73
+
74
+ request = api_client.build_request(:get, '/test')
75
+ expect(request.options[:timeout]).to eq(0)
76
+ end
77
+
78
+ it 'can be customized' do
79
+ config.timeout = 100
80
+ request = api_client.build_request(:get, '/test')
81
+ expect(request.options[:timeout]).to eq(100)
82
+ end
83
+ end
84
+
85
+ {{/isFaraday}}
86
+ describe '#deserialize' do
87
+ it "handles Array<Integer>" do
88
+ api_client = {{moduleName}}::ApiClient.new
89
+ headers = { 'Content-Type' => 'application/json' }
90
+ response = double('response', headers: headers, body: '[12, 34]')
91
+ data = api_client.deserialize(response, 'Array<Integer>')
92
+ expect(data).to be_instance_of(Array)
93
+ expect(data).to eq([12, 34])
94
+ end
95
+
96
+ it 'handles Array<Array<Integer>>' do
97
+ api_client = {{moduleName}}::ApiClient.new
98
+ headers = { 'Content-Type' => 'application/json' }
99
+ response = double('response', headers: headers, body: '[[12, 34], [56]]')
100
+ data = api_client.deserialize(response, 'Array<Array<Integer>>')
101
+ expect(data).to be_instance_of(Array)
102
+ expect(data).to eq([[12, 34], [56]])
103
+ end
104
+
105
+ it 'handles Hash<String, String>' do
106
+ api_client = {{moduleName}}::ApiClient.new
107
+ headers = { 'Content-Type' => 'application/json' }
108
+ response = double('response', headers: headers, body: '{"message": "Hello"}')
109
+ data = api_client.deserialize(response, 'Hash<String, String>')
110
+ expect(data).to be_instance_of(Hash)
111
+ expect(data).to eq(:message => 'Hello')
112
+ end
113
+ end
114
+
115
+ describe "#object_to_hash" do
116
+ it 'ignores nils and includes empty arrays' do
117
+ # uncomment below to test object_to_hash for model
118
+ # api_client = {{moduleName}}::ApiClient.new
119
+ # _model = {{moduleName}}::ModelName.new
120
+ # update the model attribute below
121
+ # _model.id = 1
122
+ # update the expected value (hash) below
123
+ # expected = {id: 1, name: '', tags: []}
124
+ # expect(api_client.object_to_hash(_model)).to eq(expected)
125
+ end
126
+ end
127
+
128
+ describe '#build_collection_param' do
129
+ let(:param) { ['aa', 'bb', 'cc'] }
130
+ let(:api_client) { {{moduleName}}::ApiClient.new }
131
+
132
+ it 'works for csv' do
133
+ expect(api_client.build_collection_param(param, :csv)).to eq('aa,bb,cc')
134
+ end
135
+
136
+ it 'works for ssv' do
137
+ expect(api_client.build_collection_param(param, :ssv)).to eq('aa bb cc')
138
+ end
139
+
140
+ it 'works for tsv' do
141
+ expect(api_client.build_collection_param(param, :tsv)).to eq("aa\tbb\tcc")
142
+ end
143
+
144
+ it 'works for pipes' do
145
+ expect(api_client.build_collection_param(param, :pipes)).to eq('aa|bb|cc')
146
+ end
147
+
148
+ it 'works for multi' do
149
+ expect(api_client.build_collection_param(param, :multi)).to eq(['aa', 'bb', 'cc'])
150
+ end
151
+
152
+ it 'fails for invalid collection format' do
153
+ expect { api_client.build_collection_param(param, :INVALID) }.to raise_error(RuntimeError, 'unknown collection format: :INVALID')
154
+ end
155
+ end
156
+
157
+ describe '#json_mime?' do
158
+ let(:api_client) { {{moduleName}}::ApiClient.new }
159
+
160
+ it 'works' do
161
+ expect(api_client.json_mime?(nil)).to eq false
162
+ expect(api_client.json_mime?('')).to eq false
163
+
164
+ expect(api_client.json_mime?('application/json')).to eq true
165
+ expect(api_client.json_mime?('application/json; charset=UTF8')).to eq true
166
+ expect(api_client.json_mime?('APPLICATION/JSON')).to eq true
167
+
168
+ expect(api_client.json_mime?('application/xml')).to eq false
169
+ expect(api_client.json_mime?('text/plain')).to eq false
170
+ expect(api_client.json_mime?('application/jsonp')).to eq false
171
+ end
172
+ end
173
+
174
+ describe '#select_header_accept' do
175
+ let(:api_client) { {{moduleName}}::ApiClient.new }
176
+
177
+ it 'works' do
178
+ expect(api_client.select_header_accept(nil)).to be_nil
179
+ expect(api_client.select_header_accept([])).to be_nil
180
+
181
+ expect(api_client.select_header_accept(['application/json'])).to eq('application/json')
182
+ expect(api_client.select_header_accept(['application/xml', 'application/json; charset=UTF8'])).to eq('application/json; charset=UTF8')
183
+ expect(api_client.select_header_accept(['APPLICATION/JSON', 'text/html'])).to eq('APPLICATION/JSON')
184
+
185
+ expect(api_client.select_header_accept(['application/xml'])).to eq('application/xml')
186
+ expect(api_client.select_header_accept(['text/html', 'application/xml'])).to eq('text/html,application/xml')
187
+ end
188
+ end
189
+
190
+ describe '#select_header_content_type' do
191
+ let(:api_client) { {{moduleName}}::ApiClient.new }
192
+
193
+ it 'works' do
194
+ expect(api_client.select_header_content_type(nil)).to eq('application/json')
195
+ expect(api_client.select_header_content_type([])).to eq('application/json')
196
+
197
+ expect(api_client.select_header_content_type(['application/json'])).to eq('application/json')
198
+ expect(api_client.select_header_content_type(['application/xml', 'application/json; charset=UTF8'])).to eq('application/json; charset=UTF8')
199
+ expect(api_client.select_header_content_type(['APPLICATION/JSON', 'text/html'])).to eq('APPLICATION/JSON')
200
+ expect(api_client.select_header_content_type(['application/xml'])).to eq('application/xml')
201
+ expect(api_client.select_header_content_type(['text/plain', 'application/xml'])).to eq('text/plain')
202
+ end
203
+ end
204
+
205
+ describe '#sanitize_filename' do
206
+ let(:api_client) { {{moduleName}}::ApiClient.new }
207
+
208
+ it 'works' do
209
+ expect(api_client.sanitize_filename('sun')).to eq('sun')
210
+ expect(api_client.sanitize_filename('sun.gif')).to eq('sun.gif')
211
+ expect(api_client.sanitize_filename('../sun.gif')).to eq('sun.gif')
212
+ expect(api_client.sanitize_filename('/var/tmp/sun.gif')).to eq('sun.gif')
213
+ expect(api_client.sanitize_filename('./sun.gif')).to eq('sun.gif')
214
+ expect(api_client.sanitize_filename('..\sun.gif')).to eq('sun.gif')
215
+ expect(api_client.sanitize_filename('\var\tmp\sun.gif')).to eq('sun.gif')
216
+ expect(api_client.sanitize_filename('c:\var\tmp\sun.gif')).to eq('sun.gif')
217
+ expect(api_client.sanitize_filename('.\sun.gif')).to eq('sun.gif')
218
+ end
219
+ end
220
+ end
@@ -0,0 +1,183 @@
1
+ # Call an API with given options.
2
+ #
3
+ # @return [Array<(Object, Integer, Hash)>] an array of 3 elements:
4
+ # the data deserialized from response body (could be nil), response status code and response headers.
5
+ def call_api(http_method, path, opts = {})
6
+ request = build_request(http_method, path, opts)
7
+ response = request.run
8
+
9
+ if @config.debugging
10
+ @config.logger.debug "HTTP response body ~BEGIN~\n#{response.body}\n~END~\n"
11
+ end
12
+
13
+ unless response.success?
14
+ if response.timed_out?
15
+ fail ApiError.new('Connection timed out')
16
+ elsif response.code == 0
17
+ # Errors from libcurl will be made visible here
18
+ fail ApiError.new(:code => 0,
19
+ :message => response.return_message)
20
+ elsif response.code == 401
21
+ fail UnauthorizedError.new(:code => response.code,
22
+ :response_headers => response.headers,
23
+ :response_body => response.body,
24
+ :message => response.status_message)
25
+ elsif response.code == 403
26
+ fail ForbiddenError.new(:code => response.code,
27
+ :response_headers => response.headers,
28
+ :response_body => response.body,
29
+ :message => response.status_message)
30
+ elsif response.code == 404
31
+ fail NotFoundError.new(:code => response.code,
32
+ :response_headers => response.headers,
33
+ :response_body => response.body,
34
+ :message => response.status_message)
35
+ elsif response.code == 429
36
+ fail TooManyRequestsError.new(:code => response.code,
37
+ :response_headers => response.headers,
38
+ :response_body => response.body,
39
+ :message => response.status_message)
40
+ elsif response.code.between?(400, 499)
41
+ fail ClientError.new(:code => response.code,
42
+ :response_headers => response.headers,
43
+ :response_body => response.body,
44
+ :message => response.status_message)
45
+ elsif response.code.between?(500, 599)
46
+ fail ServiceError.new(:code => response.code,
47
+ :response_headers => response.headers,
48
+ :response_body => response.body,
49
+ :message => response.status_message)
50
+ else
51
+ fail ApiError.new(:code => response.code,
52
+ :response_headers => response.headers,
53
+ :response_body => response.body,
54
+ :message => response.status_message)
55
+ end
56
+ end
57
+
58
+ if opts[:return_type]
59
+ data = deserialize(response, opts[:return_type])
60
+ else
61
+ data = nil
62
+ end
63
+ return data, response.code, response.headers
64
+ end
65
+
66
+ # Builds the HTTP request
67
+ #
68
+ # @param [String] http_method HTTP method/verb (e.g. POST)
69
+ # @param [String] path URL path (e.g. /account/new)
70
+ # @option opts [Hash] :header_params Header parameters
71
+ # @option opts [Hash] :query_params Query parameters
72
+ # @option opts [Hash] :form_params Query parameters
73
+ # @option opts [Object] :body HTTP body (JSON/XML)
74
+ # @return [Typhoeus::Request] A Typhoeus Request
75
+ def build_request(http_method, path, opts = {})
76
+ url = build_request_url(path, opts)
77
+ http_method = http_method.to_sym.downcase
78
+
79
+ header_params = @default_headers.merge(opts[:header_params] || {})
80
+ query_params = opts[:query_params] || {}
81
+ form_params = opts[:form_params] || {}
82
+
83
+ {{#hasAuthMethods}}
84
+ update_params_for_auth! header_params, query_params, opts[:auth_names]
85
+ {{/hasAuthMethods}}
86
+
87
+ # set ssl_verifyhosts option based on @config.verify_ssl_host (true/false)
88
+ _verify_ssl_host = @config.verify_ssl_host ? 2 : 0
89
+
90
+ req_opts = {
91
+ :method => http_method,
92
+ :headers => header_params,
93
+ :params => query_params,
94
+ :params_encoding => @config.params_encoding,
95
+ :timeout => @config.timeout,
96
+ :ssl_verifypeer => @config.verify_ssl,
97
+ :ssl_verifyhost => _verify_ssl_host,
98
+ :sslcert => @config.cert_file,
99
+ :sslkey => @config.key_file,
100
+ :verbose => @config.debugging
101
+ }
102
+
103
+ # set custom cert, if provided
104
+ req_opts[:cainfo] = @config.ssl_ca_cert if @config.ssl_ca_cert
105
+
106
+ if [:post, :patch, :put, :delete].include?(http_method)
107
+ req_body = build_request_body(header_params, form_params, opts[:body])
108
+ req_opts.update :body => req_body
109
+ if @config.debugging
110
+ @config.logger.debug "HTTP request body param ~BEGIN~\n#{req_body}\n~END~\n"
111
+ end
112
+ end
113
+
114
+ request = Typhoeus::Request.new(url, req_opts)
115
+ download_file(request) if opts[:return_type] == 'File'
116
+ request
117
+ end
118
+
119
+ # Builds the HTTP request body
120
+ #
121
+ # @param [Hash] header_params Header parameters
122
+ # @param [Hash] form_params Query parameters
123
+ # @param [Object] body HTTP body (JSON/XML)
124
+ # @return [String] HTTP body data in the form of string
125
+ def build_request_body(header_params, form_params, body)
126
+ # http form
127
+ if header_params['Content-Type'] == 'application/x-www-form-urlencoded' ||
128
+ header_params['Content-Type'] == 'multipart/form-data'
129
+ data = {}
130
+ form_params.each do |key, value|
131
+ case value
132
+ when ::File, ::Array, nil
133
+ # let typhoeus handle File, Array and nil parameters
134
+ data[key] = value
135
+ else
136
+ data[key] = value.to_s
137
+ end
138
+ end
139
+ elsif body
140
+ data = body.is_a?(String) ? body : body.to_json
141
+ else
142
+ data = nil
143
+ end
144
+ data
145
+ end
146
+
147
+ # Save response body into a file in (the defined) temporary folder, using the filename
148
+ # from the "Content-Disposition" header if provided, otherwise a random filename.
149
+ # The response body is written to the file in chunks in order to handle files which
150
+ # size is larger than maximum Ruby String or even larger than the maximum memory a Ruby
151
+ # process can use.
152
+ #
153
+ # @see Configuration#temp_folder_path
154
+ def download_file(request)
155
+ tempfile = nil
156
+ encoding = nil
157
+ request.on_headers do |response|
158
+ content_disposition = response.headers['Content-Disposition']
159
+ if content_disposition && content_disposition =~ /filename=/i
160
+ filename = content_disposition[/filename=['"]?([^'"\s]+)['"]?/, 1]
161
+ prefix = sanitize_filename(filename)
162
+ else
163
+ prefix = 'download-'
164
+ end
165
+ prefix = prefix + '-' unless prefix.end_with?('-')
166
+ encoding = response.body.encoding
167
+ tempfile = Tempfile.open(prefix, @config.temp_folder_path, encoding: encoding)
168
+ @tempfile = tempfile
169
+ end
170
+ request.on_body do |chunk|
171
+ chunk.force_encoding(encoding)
172
+ tempfile.write(chunk)
173
+ end
174
+ request.on_complete do |response|
175
+ if tempfile
176
+ tempfile.close
177
+ @config.logger.info "Temp file written to #{tempfile.path}, please copy the file to a proper folder "\
178
+ "with e.g. `FileUtils.cp(tempfile.path, '/new/file/path')` otherwise the temp file "\
179
+ "will be deleted automatically with GC. It's also recommended to delete the temp file "\
180
+ "explicitly with `tempfile.delete`"
181
+ end
182
+ end
183
+ end