mux_ruby 1.9.0 → 2.0.0.pre.rc.1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (268) hide show
  1. checksums.yaml +4 -4
  2. data/Gemfile +3 -1
  3. data/Gemfile.lock +26 -37
  4. data/README.md +36 -13
  5. data/docs/AbridgedVideoView.md +33 -13
  6. data/docs/Asset.md +57 -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 +387 -160
  15. data/docs/BreakdownValue.md +21 -7
  16. data/docs/CreateAssetRequest.md +27 -10
  17. data/docs/CreateLiveStreamRequest.md +25 -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 +40 -22
  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 +37 -19
  33. data/docs/ExportsApi.md +32 -13
  34. data/docs/FilterValue.md +15 -4
  35. data/docs/FiltersApi.md +71 -33
  36. data/docs/GetAssetInputInfoResponse.md +13 -3
  37. data/docs/GetAssetOrLiveStreamIdResponse.md +13 -3
  38. data/docs/GetAssetOrLiveStreamIdResponseData.md +17 -5
  39. data/docs/GetAssetOrLiveStreamIdResponseDataObject.md +15 -4
  40. data/docs/GetAssetPlaybackIDResponse.md +13 -3
  41. data/docs/GetMetricTimeseriesDataResponse.md +17 -5
  42. data/docs/GetOverallValuesResponse.md +17 -5
  43. data/docs/GetRealTimeBreakdownResponse.md +17 -5
  44. data/docs/GetRealTimeHistogramTimeseriesResponse.md +19 -6
  45. data/docs/GetRealTimeHistogramTimeseriesResponseMeta.md +13 -3
  46. data/docs/GetRealTimeTimeseriesResponse.md +17 -5
  47. data/docs/Incident.md +53 -23
  48. data/docs/IncidentBreakdown.md +17 -5
  49. data/docs/IncidentNotification.md +17 -5
  50. data/docs/IncidentNotificationRule.md +21 -7
  51. data/docs/IncidentResponse.md +15 -4
  52. data/docs/IncidentsApi.md +115 -59
  53. data/docs/InputFile.md +15 -4
  54. data/docs/InputInfo.md +15 -4
  55. data/docs/InputSettings.md +31 -12
  56. data/docs/InputSettingsOverlaySettings.md +25 -9
  57. data/docs/InputTrack.md +29 -11
  58. data/docs/Insight.md +23 -8
  59. data/docs/ListAllMetricValuesResponse.md +17 -5
  60. data/docs/ListAssetsResponse.md +13 -3
  61. data/docs/ListBreakdownValuesResponse.md +17 -5
  62. data/docs/ListDeliveryUsageResponse.md +19 -6
  63. data/docs/ListDimensionValuesResponse.md +17 -5
  64. data/docs/ListDimensionsResponse.md +17 -5
  65. data/docs/ListErrorsResponse.md +17 -5
  66. data/docs/ListExportsResponse.md +17 -5
  67. data/docs/ListFilterValuesResponse.md +17 -5
  68. data/docs/ListFiltersResponse.md +17 -5
  69. data/docs/ListFiltersResponseData.md +15 -4
  70. data/docs/ListIncidentsResponse.md +17 -5
  71. data/docs/ListInsightsResponse.md +17 -5
  72. data/docs/ListLiveStreamsResponse.md +13 -3
  73. data/docs/ListRealTimeDimensionsResponse.md +17 -5
  74. data/docs/ListRealTimeDimensionsResponseData.md +15 -4
  75. data/docs/ListRealTimeMetricsResponse.md +17 -5
  76. data/docs/ListRelatedIncidentsResponse.md +17 -5
  77. data/docs/ListSigningKeysResponse.md +13 -3
  78. data/docs/ListUploadsResponse.md +13 -3
  79. data/docs/ListVideoViewsResponse.md +17 -5
  80. data/docs/LiveStream.md +37 -15
  81. data/docs/LiveStreamResponse.md +13 -3
  82. data/docs/LiveStreamsApi.md +418 -170
  83. data/docs/Metric.md +21 -7
  84. data/docs/MetricsApi.md +206 -112
  85. data/docs/NotificationRule.md +17 -5
  86. data/docs/OverallValues.md +19 -6
  87. data/docs/PlaybackID.md +15 -4
  88. data/docs/PlaybackIDApi.md +34 -16
  89. data/docs/PlaybackPolicy.md +10 -2
  90. data/docs/RealTimeApi.md +172 -76
  91. data/docs/RealTimeBreakdownValue.md +21 -7
  92. data/docs/RealTimeHistogramTimeseriesBucket.md +15 -4
  93. data/docs/RealTimeHistogramTimeseriesBucketValues.md +15 -4
  94. data/docs/RealTimeHistogramTimeseriesDatapoint.md +25 -9
  95. data/docs/RealTimeTimeseriesDatapoint.md +17 -5
  96. data/docs/Score.md +23 -8
  97. data/docs/SignalLiveStreamCompleteResponse.md +13 -3
  98. data/docs/SigningKey.md +17 -5
  99. data/docs/SigningKeyResponse.md +13 -3
  100. data/docs/SimulcastTarget.md +21 -7
  101. data/docs/SimulcastTargetResponse.md +13 -3
  102. data/docs/Track.md +37 -15
  103. data/docs/URLSigningKeysApi.md +127 -51
  104. data/docs/UpdateAssetMP4SupportRequest.md +13 -3
  105. data/docs/UpdateAssetMasterAccessRequest.md +13 -3
  106. data/docs/Upload.md +29 -11
  107. data/docs/UploadError.md +15 -4
  108. data/docs/UploadResponse.md +13 -3
  109. data/docs/VideoView.md +235 -114
  110. data/docs/VideoViewEvent.md +19 -6
  111. data/docs/VideoViewResponse.md +15 -4
  112. data/docs/VideoViewsApi.md +76 -39
  113. data/gen/.gitignore +7 -0
  114. data/gen/Makefile +31 -0
  115. data/gen/generator-config.json +11 -0
  116. data/gen/openapitools.json +7 -0
  117. data/gen/package.json +17 -0
  118. data/gen/templates/Gemfile.mustache +11 -0
  119. data/gen/templates/README.mustache +158 -0
  120. data/gen/templates/Rakefile.mustache +10 -0
  121. data/gen/templates/api.mustache +206 -0
  122. data/gen/templates/api_client.mustache +264 -0
  123. data/gen/templates/api_client_faraday_partial.mustache +138 -0
  124. data/gen/templates/api_client_spec.mustache +220 -0
  125. data/gen/templates/api_client_typhoeus_partial.mustache +183 -0
  126. data/gen/templates/api_doc.mustache +118 -0
  127. data/gen/templates/api_error.mustache +67 -0
  128. data/gen/templates/api_info.mustache +12 -0
  129. data/gen/templates/api_test.mustache +47 -0
  130. data/gen/templates/base_object.mustache +120 -0
  131. data/gen/templates/configuration.mustache +349 -0
  132. data/gen/templates/configuration_spec.mustache +34 -0
  133. data/gen/templates/configuration_tls_faraday_partial.mustache +29 -0
  134. data/gen/templates/configuration_tls_typhoeus_partial.mustache +34 -0
  135. data/gen/templates/gem.mustache +40 -0
  136. data/gen/templates/gemspec.mustache +35 -0
  137. data/gen/templates/gitignore.mustache +39 -0
  138. data/gen/templates/model.mustache +26 -0
  139. data/gen/templates/model_doc.mustache +12 -0
  140. data/gen/templates/model_test.mustache +77 -0
  141. data/gen/templates/partial_model_enum_class.mustache +20 -0
  142. data/gen/templates/partial_model_generic.mustache +371 -0
  143. data/gen/templates/partial_model_generic_doc.mustache +28 -0
  144. data/gen/templates/partial_oneof_module.mustache +137 -0
  145. data/gen/templates/partial_oneof_module_doc.mustache +92 -0
  146. data/gen/templates/rspec.mustache +2 -0
  147. data/gen/templates/rubocop.mustache +148 -0
  148. data/gen/templates/spec_helper.mustache +103 -0
  149. data/gen/templates/version.mustache +7 -0
  150. data/gen/yarn.lock +1878 -0
  151. data/lib/mux_ruby.rb +9 -2
  152. data/lib/mux_ruby/api/assets_api.rb +279 -150
  153. data/lib/mux_ruby/api/delivery_usage_api.rb +28 -12
  154. data/lib/mux_ruby/api/dimensions_api.rb +55 -29
  155. data/lib/mux_ruby/api/direct_uploads_api.rb +90 -44
  156. data/lib/mux_ruby/api/errors_api.rb +32 -16
  157. data/lib/mux_ruby/api/exports_api.rb +28 -12
  158. data/lib/mux_ruby/api/filters_api.rb +53 -27
  159. data/lib/mux_ruby/api/incidents_api.rb +88 -46
  160. data/lib/mux_ruby/api/live_streams_api.rb +299 -157
  161. data/lib/mux_ruby/api/metrics_api.rb +175 -104
  162. data/lib/mux_ruby/api/playback_id_api.rb +31 -15
  163. data/lib/mux_ruby/api/real_time_api.rb +139 -77
  164. data/lib/mux_ruby/api/url_signing_keys_api.rb +89 -42
  165. data/lib/mux_ruby/api/video_views_api.rb +56 -29
  166. data/lib/mux_ruby/api_client.rb +94 -79
  167. data/lib/mux_ruby/api_error.rb +35 -7
  168. data/lib/mux_ruby/configuration.rb +50 -14
  169. data/lib/mux_ruby/models/abridged_video_view.rb +58 -24
  170. data/lib/mux_ruby/models/asset.rb +88 -61
  171. data/lib/mux_ruby/models/asset_errors.rb +50 -15
  172. data/lib/mux_ruby/models/asset_master.rb +52 -17
  173. data/lib/mux_ruby/models/asset_non_standard_input_reasons.rb +70 -35
  174. data/lib/mux_ruby/models/asset_recording_times.rb +50 -16
  175. data/lib/mux_ruby/models/asset_response.rb +48 -14
  176. data/lib/mux_ruby/models/asset_static_renditions.rb +53 -17
  177. data/lib/mux_ruby/models/asset_static_renditions_files.rb +58 -23
  178. data/lib/mux_ruby/models/breakdown_value.rb +52 -18
  179. data/lib/mux_ruby/models/create_asset_request.rb +64 -30
  180. data/lib/mux_ruby/models/create_live_stream_request.rb +57 -22
  181. data/lib/mux_ruby/models/create_playback_id_request.rb +48 -14
  182. data/lib/mux_ruby/models/create_playback_id_response.rb +48 -14
  183. data/lib/mux_ruby/models/create_simulcast_target_request.rb +50 -16
  184. data/lib/mux_ruby/models/create_track_request.rb +59 -25
  185. data/lib/mux_ruby/models/create_track_response.rb +48 -14
  186. data/lib/mux_ruby/models/create_upload_request.rb +52 -18
  187. data/lib/mux_ruby/models/delivery_report.rb +106 -21
  188. data/lib/mux_ruby/models/dimension_value.rb +49 -15
  189. data/lib/mux_ruby/models/disable_live_stream_response.rb +48 -14
  190. data/lib/mux_ruby/models/enable_live_stream_response.rb +48 -14
  191. data/lib/mux_ruby/models/error.rb +63 -21
  192. data/lib/mux_ruby/models/filter_value.rb +49 -15
  193. data/lib/mux_ruby/models/get_asset_input_info_response.rb +48 -14
  194. data/lib/mux_ruby/models/get_asset_or_live_stream_id_response.rb +48 -14
  195. data/lib/mux_ruby/models/get_asset_or_live_stream_id_response_data.rb +50 -16
  196. data/lib/mux_ruby/models/get_asset_or_live_stream_id_response_data_object.rb +51 -17
  197. data/lib/mux_ruby/models/get_asset_playback_id_response.rb +48 -14
  198. data/lib/mux_ruby/models/get_metric_timeseries_data_response.rb +50 -16
  199. data/lib/mux_ruby/models/get_overall_values_response.rb +50 -16
  200. data/lib/mux_ruby/models/get_real_time_breakdown_response.rb +50 -16
  201. data/lib/mux_ruby/models/get_real_time_histogram_timeseries_response.rb +51 -17
  202. data/lib/mux_ruby/models/get_real_time_histogram_timeseries_response_meta.rb +48 -14
  203. data/lib/mux_ruby/models/get_real_time_timeseries_response.rb +50 -16
  204. data/lib/mux_ruby/models/incident.rb +68 -34
  205. data/lib/mux_ruby/models/incident_breakdown.rb +50 -16
  206. data/lib/mux_ruby/models/incident_notification.rb +50 -16
  207. data/lib/mux_ruby/models/incident_notification_rule.rb +52 -18
  208. data/lib/mux_ruby/models/incident_response.rb +49 -15
  209. data/lib/mux_ruby/models/input_file.rb +49 -15
  210. data/lib/mux_ruby/models/input_info.rb +49 -15
  211. data/lib/mux_ruby/models/input_settings.rb +64 -30
  212. data/lib/mux_ruby/models/input_settings_overlay_settings.rb +58 -24
  213. data/lib/mux_ruby/models/input_track.rb +56 -22
  214. data/lib/mux_ruby/models/insight.rb +53 -19
  215. data/lib/mux_ruby/models/list_all_metric_values_response.rb +50 -16
  216. data/lib/mux_ruby/models/list_assets_response.rb +48 -14
  217. data/lib/mux_ruby/models/list_breakdown_values_response.rb +50 -16
  218. data/lib/mux_ruby/models/list_delivery_usage_response.rb +51 -17
  219. data/lib/mux_ruby/models/list_dimension_values_response.rb +50 -16
  220. data/lib/mux_ruby/models/list_dimensions_response.rb +50 -16
  221. data/lib/mux_ruby/models/list_errors_response.rb +50 -16
  222. data/lib/mux_ruby/models/list_exports_response.rb +50 -16
  223. data/lib/mux_ruby/models/list_filter_values_response.rb +50 -16
  224. data/lib/mux_ruby/models/list_filters_response.rb +50 -16
  225. data/lib/mux_ruby/models/list_filters_response_data.rb +49 -15
  226. data/lib/mux_ruby/models/list_incidents_response.rb +50 -16
  227. data/lib/mux_ruby/models/list_insights_response.rb +50 -16
  228. data/lib/mux_ruby/models/list_live_streams_response.rb +48 -14
  229. data/lib/mux_ruby/models/list_real_time_dimensions_response.rb +50 -16
  230. data/lib/mux_ruby/models/list_real_time_dimensions_response_data.rb +49 -15
  231. data/lib/mux_ruby/models/list_real_time_metrics_response.rb +50 -16
  232. data/lib/mux_ruby/models/list_related_incidents_response.rb +50 -16
  233. data/lib/mux_ruby/models/list_signing_keys_response.rb +48 -14
  234. data/lib/mux_ruby/models/list_uploads_response.rb +48 -14
  235. data/lib/mux_ruby/models/list_video_views_response.rb +50 -16
  236. data/lib/mux_ruby/models/live_stream.rb +110 -28
  237. data/lib/mux_ruby/models/live_stream_response.rb +48 -14
  238. data/lib/mux_ruby/models/metric.rb +52 -18
  239. data/lib/mux_ruby/models/notification_rule.rb +50 -16
  240. data/lib/mux_ruby/models/overall_values.rb +51 -17
  241. data/lib/mux_ruby/models/playback_id.rb +49 -15
  242. data/lib/mux_ruby/models/playback_policy.rb +12 -6
  243. data/lib/mux_ruby/models/real_time_breakdown_value.rb +52 -18
  244. data/lib/mux_ruby/models/real_time_histogram_timeseries_bucket.rb +50 -16
  245. data/lib/mux_ruby/models/real_time_histogram_timeseries_bucket_values.rb +49 -15
  246. data/lib/mux_ruby/models/real_time_histogram_timeseries_datapoint.rb +54 -20
  247. data/lib/mux_ruby/models/real_time_timeseries_datapoint.rb +50 -16
  248. data/lib/mux_ruby/models/score.rb +53 -19
  249. data/lib/mux_ruby/models/signal_live_stream_complete_response.rb +48 -14
  250. data/lib/mux_ruby/models/signing_key.rb +53 -16
  251. data/lib/mux_ruby/models/signing_key_response.rb +48 -14
  252. data/lib/mux_ruby/models/simulcast_target.rb +54 -20
  253. data/lib/mux_ruby/models/simulcast_target_response.rb +48 -14
  254. data/lib/mux_ruby/models/track.rb +67 -33
  255. data/lib/mux_ruby/models/update_asset_master_access_request.rb +50 -16
  256. data/lib/mux_ruby/models/update_asset_mp4_support_request.rb +50 -16
  257. data/lib/mux_ruby/models/upload.rb +61 -25
  258. data/lib/mux_ruby/models/upload_error.rb +51 -15
  259. data/lib/mux_ruby/models/upload_response.rb +48 -14
  260. data/lib/mux_ruby/models/video_view.rb +166 -132
  261. data/lib/mux_ruby/models/video_view_event.rb +51 -17
  262. data/lib/mux_ruby/models/video_view_response.rb +49 -15
  263. data/lib/mux_ruby/version.rb +10 -3
  264. data/mux_ruby.gemspec +15 -17
  265. data/spec/api_client_spec.rb +10 -3
  266. data/spec/configuration_spec.rb +9 -2
  267. data/spec/spec_helper.rb +9 -2
  268. metadata +139 -242
@@ -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