mux_ruby 1.5.1 → 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 (317) hide show
  1. checksums.yaml +4 -4
  2. data/Gemfile +3 -1
  3. data/Gemfile.lock +26 -37
  4. data/README.md +38 -12
  5. data/docs/AbridgedVideoView.md +33 -13
  6. data/docs/Asset.md +57 -23
  7. data/docs/AssetErrors.md +15 -4
  8. data/docs/AssetMaster.md +15 -4
  9. data/docs/AssetNonStandardInputReasons.md +34 -0
  10. data/docs/AssetRecordingTimes.md +20 -0
  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 +391 -160
  15. data/docs/BreakdownValue.md +21 -7
  16. data/docs/CreateAssetRequest.md +27 -10
  17. data/docs/CreateLiveStreamRequest.md +25 -8
  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 +20 -0
  27. data/docs/DimensionsApi.md +156 -0
  28. data/docs/DirectUploadsApi.md +131 -56
  29. data/docs/DisableLiveStreamResponse.md +18 -0
  30. data/docs/EnableLiveStreamResponse.md +18 -0
  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 +73 -35
  36. data/docs/GetAssetInputInfoResponse.md +13 -3
  37. data/docs/GetAssetOrLiveStreamIdResponse.md +18 -0
  38. data/docs/GetAssetOrLiveStreamIdResponseData.md +22 -0
  39. data/docs/GetAssetOrLiveStreamIdResponseDataObject.md +20 -0
  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 +22 -0
  44. data/docs/GetRealTimeHistogramTimeseriesResponse.md +24 -0
  45. data/docs/GetRealTimeHistogramTimeseriesResponseMeta.md +18 -0
  46. data/docs/GetRealTimeTimeseriesResponse.md +22 -0
  47. data/docs/Incident.md +58 -0
  48. data/docs/IncidentBreakdown.md +22 -0
  49. data/docs/IncidentNotification.md +22 -0
  50. data/docs/IncidentNotificationRule.md +26 -0
  51. data/docs/IncidentResponse.md +20 -0
  52. data/docs/IncidentsApi.md +242 -0
  53. data/docs/InputFile.md +15 -4
  54. data/docs/InputInfo.md +15 -4
  55. data/docs/InputSettings.md +31 -10
  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 +22 -0
  64. data/docs/ListDimensionsResponse.md +22 -0
  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 +22 -0
  71. data/docs/ListInsightsResponse.md +17 -5
  72. data/docs/ListLiveStreamsResponse.md +13 -3
  73. data/docs/ListRealTimeDimensionsResponse.md +22 -0
  74. data/docs/ListRealTimeDimensionsResponseData.md +20 -0
  75. data/docs/ListRealTimeMetricsResponse.md +22 -0
  76. data/docs/ListRelatedIncidentsResponse.md +22 -0
  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 +497 -145
  83. data/docs/Metric.md +21 -7
  84. data/docs/MetricsApi.md +206 -112
  85. data/docs/NotificationRule.md +22 -0
  86. data/docs/OverallValues.md +19 -6
  87. data/docs/PlaybackID.md +15 -4
  88. data/docs/PlaybackIDApi.md +78 -0
  89. data/docs/PlaybackPolicy.md +10 -2
  90. data/docs/RealTimeApi.md +376 -0
  91. data/docs/RealTimeBreakdownValue.md +26 -0
  92. data/docs/RealTimeHistogramTimeseriesBucket.md +20 -0
  93. data/docs/RealTimeHistogramTimeseriesBucketValues.md +20 -0
  94. data/docs/RealTimeHistogramTimeseriesDatapoint.md +30 -0
  95. data/docs/RealTimeTimeseriesDatapoint.md +22 -0
  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 -112
  110. data/docs/VideoViewEvent.md +19 -6
  111. data/docs/VideoViewResponse.md +15 -4
  112. data/docs/VideoViewsApi.md +76 -39
  113. data/examples/data/exercise-dimensions.rb +29 -0
  114. data/examples/data/exercise-incidents.rb +29 -0
  115. data/examples/data/exercise-realtime.rb +60 -0
  116. data/examples/video/exercise-assets.rb +21 -0
  117. data/examples/video/exercise-live-streams.rb +30 -0
  118. data/gen/.gitignore +7 -0
  119. data/gen/Makefile +31 -0
  120. data/gen/generator-config.json +11 -0
  121. data/gen/openapitools.json +7 -0
  122. data/gen/package.json +17 -0
  123. data/gen/templates/Gemfile.mustache +11 -0
  124. data/gen/templates/README.mustache +158 -0
  125. data/gen/templates/Rakefile.mustache +10 -0
  126. data/gen/templates/api.mustache +206 -0
  127. data/gen/templates/api_client.mustache +264 -0
  128. data/gen/templates/api_client_faraday_partial.mustache +138 -0
  129. data/gen/templates/api_client_spec.mustache +220 -0
  130. data/gen/templates/api_client_typhoeus_partial.mustache +183 -0
  131. data/gen/templates/api_doc.mustache +118 -0
  132. data/gen/templates/api_error.mustache +67 -0
  133. data/gen/templates/api_info.mustache +12 -0
  134. data/gen/templates/api_test.mustache +47 -0
  135. data/gen/templates/base_object.mustache +120 -0
  136. data/gen/templates/configuration.mustache +349 -0
  137. data/gen/templates/configuration_spec.mustache +34 -0
  138. data/gen/templates/configuration_tls_faraday_partial.mustache +29 -0
  139. data/gen/templates/configuration_tls_typhoeus_partial.mustache +34 -0
  140. data/gen/templates/gem.mustache +40 -0
  141. data/gen/templates/gemspec.mustache +35 -0
  142. data/gen/templates/gitignore.mustache +39 -0
  143. data/gen/templates/model.mustache +26 -0
  144. data/gen/templates/model_doc.mustache +12 -0
  145. data/gen/templates/model_test.mustache +77 -0
  146. data/gen/templates/partial_model_enum_class.mustache +20 -0
  147. data/gen/templates/partial_model_generic.mustache +371 -0
  148. data/gen/templates/partial_model_generic_doc.mustache +28 -0
  149. data/gen/templates/partial_oneof_module.mustache +137 -0
  150. data/gen/templates/partial_oneof_module_doc.mustache +92 -0
  151. data/gen/templates/rspec.mustache +2 -0
  152. data/gen/templates/rubocop.mustache +148 -0
  153. data/gen/templates/spec_helper.mustache +103 -0
  154. data/gen/templates/version.mustache +7 -0
  155. data/gen/yarn.lock +1878 -0
  156. data/lib/mux_ruby.rb +43 -2
  157. data/lib/mux_ruby/api/assets_api.rb +283 -150
  158. data/lib/mux_ruby/api/delivery_usage_api.rb +28 -12
  159. data/lib/mux_ruby/api/dimensions_api.rb +154 -0
  160. data/lib/mux_ruby/api/direct_uploads_api.rb +90 -44
  161. data/lib/mux_ruby/api/errors_api.rb +32 -16
  162. data/lib/mux_ruby/api/exports_api.rb +28 -12
  163. data/lib/mux_ruby/api/filters_api.rb +57 -31
  164. data/lib/mux_ruby/api/incidents_api.rb +259 -0
  165. data/lib/mux_ruby/api/live_streams_api.rb +381 -133
  166. data/lib/mux_ruby/api/metrics_api.rb +175 -104
  167. data/lib/mux_ruby/api/playback_id_api.rb +85 -0
  168. data/lib/mux_ruby/api/real_time_api.rb +373 -0
  169. data/lib/mux_ruby/api/url_signing_keys_api.rb +89 -42
  170. data/lib/mux_ruby/api/video_views_api.rb +56 -29
  171. data/lib/mux_ruby/api_client.rb +106 -91
  172. data/lib/mux_ruby/api_error.rb +35 -7
  173. data/lib/mux_ruby/configuration.rb +50 -14
  174. data/lib/mux_ruby/models/abridged_video_view.rb +58 -24
  175. data/lib/mux_ruby/models/asset.rb +147 -53
  176. data/lib/mux_ruby/models/asset_errors.rb +52 -15
  177. data/lib/mux_ruby/models/asset_master.rb +85 -15
  178. data/lib/mux_ruby/models/asset_non_standard_input_reasons.rb +370 -0
  179. data/lib/mux_ruby/models/asset_recording_times.rb +229 -0
  180. data/lib/mux_ruby/models/asset_response.rb +48 -14
  181. data/lib/mux_ruby/models/asset_static_renditions.rb +55 -19
  182. data/lib/mux_ruby/models/asset_static_renditions_files.rb +60 -25
  183. data/lib/mux_ruby/models/breakdown_value.rb +52 -18
  184. data/lib/mux_ruby/models/create_asset_request.rb +70 -30
  185. data/lib/mux_ruby/models/create_live_stream_request.rb +70 -24
  186. data/lib/mux_ruby/models/create_playback_id_request.rb +48 -14
  187. data/lib/mux_ruby/models/create_playback_id_response.rb +48 -14
  188. data/lib/mux_ruby/models/create_simulcast_target_request.rb +50 -16
  189. data/lib/mux_ruby/models/create_track_request.rb +65 -27
  190. data/lib/mux_ruby/models/create_track_response.rb +48 -14
  191. data/lib/mux_ruby/models/create_upload_request.rb +52 -18
  192. data/lib/mux_ruby/models/delivery_report.rb +106 -21
  193. data/lib/mux_ruby/models/dimension_value.rb +227 -0
  194. data/lib/mux_ruby/models/disable_live_stream_response.rb +218 -0
  195. data/lib/mux_ruby/models/enable_live_stream_response.rb +218 -0
  196. data/lib/mux_ruby/models/error.rb +63 -21
  197. data/lib/mux_ruby/models/filter_value.rb +49 -15
  198. data/lib/mux_ruby/models/get_asset_input_info_response.rb +48 -14
  199. data/lib/mux_ruby/models/get_asset_or_live_stream_id_response.rb +218 -0
  200. data/lib/mux_ruby/models/get_asset_or_live_stream_id_response_data.rb +237 -0
  201. data/lib/mux_ruby/models/get_asset_or_live_stream_id_response_data_object.rb +264 -0
  202. data/lib/mux_ruby/models/get_asset_playback_id_response.rb +48 -14
  203. data/lib/mux_ruby/models/get_metric_timeseries_data_response.rb +50 -16
  204. data/lib/mux_ruby/models/get_overall_values_response.rb +50 -16
  205. data/lib/mux_ruby/models/get_real_time_breakdown_response.rb +240 -0
  206. data/lib/mux_ruby/models/get_real_time_histogram_timeseries_response.rb +249 -0
  207. data/lib/mux_ruby/models/get_real_time_histogram_timeseries_response_meta.rb +220 -0
  208. data/lib/mux_ruby/models/get_real_time_timeseries_response.rb +240 -0
  209. data/lib/mux_ruby/models/incident.rb +404 -0
  210. data/lib/mux_ruby/models/incident_breakdown.rb +236 -0
  211. data/lib/mux_ruby/models/incident_notification.rb +236 -0
  212. data/lib/mux_ruby/models/incident_notification_rule.rb +256 -0
  213. data/lib/mux_ruby/models/incident_response.rb +229 -0
  214. data/lib/mux_ruby/models/input_file.rb +49 -15
  215. data/lib/mux_ruby/models/input_info.rb +49 -15
  216. data/lib/mux_ruby/models/input_settings.rb +91 -30
  217. data/lib/mux_ruby/models/input_settings_overlay_settings.rb +68 -26
  218. data/lib/mux_ruby/models/input_track.rb +56 -22
  219. data/lib/mux_ruby/models/insight.rb +53 -19
  220. data/lib/mux_ruby/models/list_all_metric_values_response.rb +50 -16
  221. data/lib/mux_ruby/models/list_assets_response.rb +48 -14
  222. data/lib/mux_ruby/models/list_breakdown_values_response.rb +50 -16
  223. data/lib/mux_ruby/models/list_delivery_usage_response.rb +51 -17
  224. data/lib/mux_ruby/models/list_dimension_values_response.rb +240 -0
  225. data/lib/mux_ruby/models/list_dimensions_response.rb +238 -0
  226. data/lib/mux_ruby/models/list_errors_response.rb +50 -16
  227. data/lib/mux_ruby/models/list_exports_response.rb +50 -16
  228. data/lib/mux_ruby/models/list_filter_values_response.rb +50 -16
  229. data/lib/mux_ruby/models/list_filters_response.rb +50 -16
  230. data/lib/mux_ruby/models/list_filters_response_data.rb +49 -15
  231. data/lib/mux_ruby/models/list_incidents_response.rb +240 -0
  232. data/lib/mux_ruby/models/list_insights_response.rb +50 -16
  233. data/lib/mux_ruby/models/list_live_streams_response.rb +48 -14
  234. data/lib/mux_ruby/models/list_real_time_dimensions_response.rb +240 -0
  235. data/lib/mux_ruby/models/list_real_time_dimensions_response_data.rb +227 -0
  236. data/lib/mux_ruby/models/list_real_time_metrics_response.rb +240 -0
  237. data/lib/mux_ruby/models/list_related_incidents_response.rb +240 -0
  238. data/lib/mux_ruby/models/list_signing_keys_response.rb +48 -14
  239. data/lib/mux_ruby/models/list_uploads_response.rb +48 -14
  240. data/lib/mux_ruby/models/list_video_views_response.rb +50 -16
  241. data/lib/mux_ruby/models/live_stream.rb +111 -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 +236 -0
  245. data/lib/mux_ruby/models/overall_values.rb +51 -17
  246. data/lib/mux_ruby/models/playback_id.rb +50 -15
  247. data/lib/mux_ruby/models/playback_policy.rb +12 -6
  248. data/lib/mux_ruby/models/real_time_breakdown_value.rb +254 -0
  249. data/lib/mux_ruby/models/real_time_histogram_timeseries_bucket.rb +227 -0
  250. data/lib/mux_ruby/models/real_time_histogram_timeseries_bucket_values.rb +227 -0
  251. data/lib/mux_ruby/models/real_time_histogram_timeseries_datapoint.rb +274 -0
  252. data/lib/mux_ruby/models/real_time_timeseries_datapoint.rb +236 -0
  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 +55 -21
  258. data/lib/mux_ruby/models/simulcast_target_response.rb +48 -14
  259. data/lib/mux_ruby/models/track.rb +92 -33
  260. data/lib/mux_ruby/models/update_asset_master_access_request.rb +51 -17
  261. data/lib/mux_ruby/models/update_asset_mp4_support_request.rb +51 -17
  262. data/lib/mux_ruby/models/upload.rb +62 -26
  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 +200 -148
  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/mux_ruby.gemspec +15 -15
  270. data/spec/api/assets_api_spec.rb +2 -0
  271. data/spec/api/dimensions_api_spec.rb +55 -0
  272. data/spec/api/filters_api_spec.rb +2 -2
  273. data/spec/api/incidents_api_spec.rb +73 -0
  274. data/spec/api/live_streams_api_spec.rb +24 -0
  275. data/spec/api/playback_id_api_spec.rb +40 -0
  276. data/spec/api/real_time_api_spec.rb +93 -0
  277. data/spec/api_client_spec.rb +10 -3
  278. data/spec/configuration_spec.rb +9 -2
  279. data/spec/models/asset_master_spec.rb +4 -0
  280. data/spec/models/asset_non_standard_input_reasons_spec.rb +98 -0
  281. data/spec/models/asset_recording_times_spec.rb +40 -0
  282. data/spec/models/asset_spec.rb +26 -0
  283. data/spec/models/asset_static_renditions_files_spec.rb +2 -2
  284. data/spec/models/create_live_stream_request_spec.rb +6 -0
  285. data/spec/models/dimension_value_spec.rb +40 -0
  286. data/spec/models/disable_live_stream_response_spec.rb +34 -0
  287. data/spec/models/enable_live_stream_response_spec.rb +34 -0
  288. data/spec/models/get_asset_or_live_stream_id_response_data_object_spec.rb +44 -0
  289. data/spec/models/get_asset_or_live_stream_id_response_data_spec.rb +46 -0
  290. data/spec/models/get_asset_or_live_stream_id_response_spec.rb +34 -0
  291. data/spec/models/get_real_time_breakdown_response_spec.rb +46 -0
  292. data/spec/models/get_real_time_histogram_timeseries_response_meta_spec.rb +34 -0
  293. data/spec/models/get_real_time_histogram_timeseries_response_spec.rb +52 -0
  294. data/spec/models/get_real_time_timeseries_response_spec.rb +46 -0
  295. data/spec/models/incident_breakdown_spec.rb +46 -0
  296. data/spec/models/incident_notification_rule_spec.rb +58 -0
  297. data/spec/models/incident_notification_spec.rb +46 -0
  298. data/spec/models/incident_response_spec.rb +40 -0
  299. data/spec/models/incident_spec.rb +154 -0
  300. data/spec/models/input_settings_spec.rb +12 -0
  301. data/spec/models/list_dimension_values_response_spec.rb +46 -0
  302. data/spec/models/list_dimensions_response_spec.rb +46 -0
  303. data/spec/models/list_incidents_response_spec.rb +46 -0
  304. data/spec/models/list_real_time_dimensions_response_data_spec.rb +40 -0
  305. data/spec/models/list_real_time_dimensions_response_spec.rb +46 -0
  306. data/spec/models/list_real_time_metrics_response_spec.rb +46 -0
  307. data/spec/models/list_related_incidents_response_spec.rb +46 -0
  308. data/spec/models/notification_rule_spec.rb +46 -0
  309. data/spec/models/real_time_breakdown_value_spec.rb +58 -0
  310. data/spec/models/real_time_histogram_timeseries_bucket_spec.rb +40 -0
  311. data/spec/models/real_time_histogram_timeseries_bucket_values_spec.rb +40 -0
  312. data/spec/models/real_time_histogram_timeseries_datapoint_spec.rb +70 -0
  313. data/spec/models/real_time_timeseries_datapoint_spec.rb +46 -0
  314. data/spec/models/track_spec.rb +4 -0
  315. data/spec/models/video_view_spec.rb +12 -0
  316. data/spec/spec_helper.rb +9 -2
  317. metadata +249 -212
data/gen/.gitignore ADDED
@@ -0,0 +1,7 @@
1
+ node_modules/
2
+ tmp/
3
+
4
+ *.log
5
+ *.bak
6
+
7
+ template-changes.diff
data/gen/Makefile ADDED
@@ -0,0 +1,31 @@
1
+ # per-SDK stuff
2
+ GENERATOR_TYPE=ruby
3
+
4
+ ###### helper variables ######
5
+ # this is in case we want to go to Docker or something other than running yarn
6
+ # for OAS in the future. also less typing.
7
+ OAS_CLI=yarn run -s oas
8
+ CONFIG_PATH=./generator-config.json
9
+ OUTPUT_DIR=..
10
+ TEMPLATE_DIR=./templates
11
+ GENERATED_TEMPLATE_DIR=./tmp/oas-base-templates
12
+
13
+ ensure:
14
+ yarn install
15
+
16
+ clean:
17
+ rm -rf tmp
18
+
19
+ clean-products:
20
+ rm -rf "${OUTPUT_DIR}/lib"
21
+ rm -rf "${OUTPUT_DIR}/docs"
22
+
23
+ build: ensure clean-products
24
+ ${OAS_CLI} generate -g "${GENERATOR_TYPE}" -c "${CONFIG_PATH}" -t "${TEMPLATE_DIR}" -o "${OUTPUT_DIR}" -i "${OAS_SPEC_PATH}"
25
+
26
+ config-help: ensure
27
+ ${OAS_CLI} config-help -g "${GENERATOR_TYPE}"
28
+
29
+ template-diff: ensure
30
+ ${OAS_CLI} author template -g "${GENERATOR_TYPE}" -o "${GENERATED_TEMPLATE_DIR}"
31
+ diff "${TEMPLATE_DIR}" "${GENERATED_TEMPLATE_DIR}" > ./tmp/template-changes.diff
@@ -0,0 +1,11 @@
1
+ {
2
+ "!!source": "https://github.com/OpenAPITools/openapi-generator/blob/master/docs/generators/ruby.md",
3
+ "gemName": "mux_ruby",
4
+ "gemAuthor": "Mux",
5
+ "gemAuthorEmail": "devex@mux.com",
6
+ "gemDescription": "The Ruby client for Mux Data and Mux Video.",
7
+ "gemHomepage": "https://docs.mux.com",
8
+ "gemLicense": "MIT",
9
+ "moduleName": "MuxRuby",
10
+ "gemVersion": "2.0.0-rc.1"
11
+ }
@@ -0,0 +1,7 @@
1
+ {
2
+ "$schema": "node_modules/@openapitools/openapi-generator-cli/config.schema.json",
3
+ "spaces": 2,
4
+ "generator-cli": {
5
+ "version": "5.0.1"
6
+ }
7
+ }
data/gen/package.json ADDED
@@ -0,0 +1,17 @@
1
+ {
2
+ "private": true,
3
+ "scripts": {
4
+ "oas": "openapi-generator-cli",
5
+ "current-version": "jq -r .gemVersion < ./generator-config.json",
6
+ "compute-next-version:patch": "semver $(yarn run --silent current-version) -i patch",
7
+ "compute-next-version:minor": "semver $(yarn run --silent current-version) -i minor",
8
+ "compute-next-version:major": "semver $(yarn run --silent current-version) -i major",
9
+ "bump-version:patch": "jq -r \".gemVersion = \\\"$(yarn run -s compute-next-version:patch)\\\"\" < ./generator-config.json > ./generator-config.tmp.json && cp ./generator-config.json ./generator-config.json.bak && mv ./generator-config.tmp.json ./generator-config.json",
10
+ "build": ""
11
+ },
12
+ "dependencies": {
13
+ "@openapitools/openapi-generator-cli": "2.2.2",
14
+ "node-jq": "1.12.0",
15
+ "semver": "7.3.4"
16
+ }
17
+ }
@@ -0,0 +1,11 @@
1
+ source 'https://rubygems.org'
2
+
3
+ gemspec
4
+
5
+ group :development, :test do
6
+ gem 'rake', '~> 13.0.1'
7
+ gem 'pry-byebug'
8
+ gem 'rubocop', '~> 0.66.0'
9
+
10
+ gem 'solid_assert'
11
+ end
@@ -0,0 +1,158 @@
1
+ ![Mux Ruby Banner](github-ruby-sdk.png)
2
+
3
+ ![](https://github.com/muxinc/mux-ruby/workflows/Integration%20Test/badge.svg)
4
+
5
+ {{moduleName}} - the Ruby gem for the {{appName}}
6
+
7
+ # Mux Ruby
8
+
9
+ Official Mux API wrapper for ruby projects, supporting both Mux Data and Mux Video.
10
+
11
+ [Mux Video](https://mux.com/video) is an API-first platform, powered by data and designed by video experts to make beautiful video possible for every development team.
12
+
13
+ [Mux Data](https://mux.com/data) is a platform for monitoring your video streaming performance with just a few lines of code. Get in-depth quality of service analytics on web, mobile, and OTT devices.
14
+
15
+ Not familiar with Mux? Check out https://mux.com/ for more information.
16
+
17
+ This SDK is automatically generated by the [OpenAPI Generator](https://openapi-generator.tech) project:
18
+
19
+ - API version: {{appVersion}}
20
+ - Package version: {{gemVersion}}
21
+ {{^hideGenerationTimestamp}}
22
+ - Build date: {{generatedDate}}
23
+ {{/hideGenerationTimestamp}}
24
+ - Build package: {{generatorClass}}
25
+ {{#infoUrl}}
26
+ For more information, please visit [{{{infoUrl}}}]({{{infoUrl}}})
27
+ {{/infoUrl}}
28
+
29
+ ## Installation
30
+
31
+ ### Build a gem
32
+
33
+ To build the Ruby code into a gem:
34
+
35
+ ```shell
36
+ gem build {{{gemName}}}.gemspec
37
+ ```
38
+
39
+ Then either install the gem locally:
40
+
41
+ ```shell
42
+ gem install ./{{{gemName}}}-{{{gemVersion}}}.gem
43
+ ```
44
+
45
+ (for development, run `gem install --dev ./{{{gemName}}}-{{{gemVersion}}}.gem` to install the development dependencies)
46
+
47
+ or publish the gem to a gem hosting service, e.g. [RubyGems](https://rubygems.org/).
48
+
49
+ Finally add this to the Gemfile:
50
+
51
+ gem '{{{gemName}}}', '~> {{{gemVersion}}}'
52
+
53
+ ### Install from Git
54
+
55
+ If the Ruby gem is hosted at a git repository: https://{{gitHost}}/{{#gitUserId}}{{.}}{{/gitUserId}}{{^gitUserId}}YOUR_GIT_USERNAME{{/gitUserId}}/{{#gitRepoId}}{{.}}{{/gitRepoId}}{{^gitRepoId}}YOUR_GIT_REPO{{/gitRepoId}}, then add the following in the Gemfile:
56
+
57
+ gem '{{{gemName}}}', :git => 'https://{{gitHost}}/{{#gitUserId}}{{.}}{{/gitUserId}}{{^gitUserId}}YOUR_GIT_USERNAME{{/gitUserId}}/{{#gitRepoId}}{{.}}{{/gitRepoId}}{{^gitRepoId}}YOUR_GIT_REPO{{/gitRepoId}}.git'
58
+
59
+ ### Include the Ruby code directly
60
+
61
+ Include the Ruby code directly using `-I` as follows:
62
+
63
+ ```shell
64
+ ruby -Ilib script.rb
65
+ ```
66
+
67
+ ## Getting Started
68
+
69
+ ### Overview
70
+
71
+ Mux Ruby is a code generated lightweight wrapper around the Mux REST API and reflects them accurately. This has a few consequences you should watch out for:
72
+
73
+ 1) For almost all API responses, the object you're looking for will be in the `data` field on the API response object, as in the example below. This is because we designed our APIs with similar concepts to the [JSON:API](https://jsonapi.org/) standard. This means we'll be able to return more metadata from our API calls (such as related entities) without the need to make breaking changes to our APIs. We've decided not to hide that in this library.
74
+
75
+ 2) We don't use a lot of object orientation. For example API calls that happen on a single asset don't exist in the asset class, but are API calls in the AssetsApi which require an asset ID.
76
+
77
+ ### Authentication
78
+ To use the Mux API, you'll need an access token and a secret. [Details on obtaining these can be found here in the Mux documentation.](https://docs.mux.com/docs#section-1-get-an-api-access-token)
79
+
80
+ Its up to you to manage your token and secret. In our examples, we read them from `MUX_TOKEN_ID` and `MUX_TOKEN_SECRET` in your environment.
81
+
82
+ ### Example Usage
83
+ Below is a quick example of using Mux Ruby to list the Video assets stored in your Mux account.
84
+
85
+ Be sure to also checkout the [exmples directory](examples/):
86
+ * [List Assets, Live Streams, Signing Keys, and Uploads.](examples/video/list-everything.rb)
87
+ * [Create an Asset, wait for it to become availiable, and print its playback URL](examples/video/ingest.rb)
88
+ * [Create a new Live Stream and retrieve its Stream key.](examples/video/create-live-stream.rb)
89
+
90
+ There's also example usage of every API call (also used for testing):
91
+ * [Video](examples/video/)
92
+ * [Assets](examples/video/exercise-assets.rb)
93
+ * [Live Streams](examples/video/exercise-live-streams.rb)
94
+ * [Signing Keys](examples/video/exercise-signing-keys.rb)
95
+ * [Uploads](examples/video/exercise-uploads.rb)
96
+ * [Data](examples/data/)
97
+ * [Errors](examples/data/exercise-errors.rb)
98
+ * [Exports](examples/data/exercise-exports.rb)
99
+ * [Filters](examples/data/exercise-filters.rb)
100
+ * [Metrics](examples/data/exercise-metrics.rb)
101
+ * [Video Views](examples/data/exercise-video-views.rb)
102
+
103
+ ```ruby
104
+ #!/usr/bin/env ruby
105
+
106
+ require 'mux_ruby'
107
+
108
+ # Auth Setup
109
+ openapi = MuxRuby.configure do |config|
110
+ config.username = ENV['MUX_TOKEN_ID']
111
+ config.password = ENV['MUX_TOKEN_SECRET']
112
+ end
113
+
114
+ # API Client Init
115
+ assets_api = MuxRuby::AssetsApi.new
116
+
117
+ # List Assets
118
+ puts "Listing Assets in account:\n\n"
119
+
120
+ assets = assets_api.list_assets()
121
+ assets.data.each do | asset |
122
+ puts "Asset ID: #{asset.id}"
123
+ puts "Status: #{asset.status}"
124
+ puts "Duration: #{asset.duration.to_s}\n\n"
125
+ end
126
+ ```
127
+
128
+ ## Exceptions & Error Handling
129
+
130
+ All errors inherit from `ApiError`, you can catch it or you can catch one of the more specific Errors below.
131
+
132
+ ### NotFoundError
133
+
134
+ `NotFoundError` is thrown when a resource is not found. This is useful when trying to get an entity by its ID, for example `get_asset("some-id-here")` in the AssetsApi.
135
+
136
+ ### UnauthorizedError
137
+
138
+ `UnauthorizedError` is thrown when Mux cannot authenticate your request. [You should check you have configured your credentials correctly.](#authentication)
139
+
140
+ ### ServiceError
141
+
142
+ `ServiceError` is thrown when Mux returns a HTTP 5XX Status Code. If you encounter this reproducibly, please get in touch with [support@mux.com](mailto:support@mux.com).
143
+
144
+ ## Documentation
145
+
146
+ [Be sure to check out the documentation in the `docs` directory.](docs/)
147
+
148
+ ## Issues
149
+
150
+ If you run into problems, [please raise a GitHub issue,](https://github.com/muxinc/mux-ruby/issues) filling in the issue template. We'll take a look as soon as possible.
151
+
152
+ ## Contributing
153
+
154
+ We now accept PRs against this package! Please make your modifications to the templates in `gen/templates`, not the code itself, or [please open an issue.](https://github.com/muxinc/mux-ruby/issues)
155
+
156
+ ## License
157
+
158
+ [MIT License.](LICENSE) Copyright 2019 Mux, Inc.
@@ -0,0 +1,10 @@
1
+ require "bundler/gem_tasks"
2
+
3
+ begin
4
+ require 'rspec/core/rake_task'
5
+
6
+ RSpec::Core::RakeTask.new(:spec)
7
+ task default: :spec
8
+ rescue LoadError
9
+ # no rspec available
10
+ end
@@ -0,0 +1,206 @@
1
+ =begin
2
+ {{> api_info}}
3
+ =end
4
+
5
+ require 'cgi'
6
+
7
+ module {{moduleName}}
8
+ {{#operations}}
9
+ class {{classname}}
10
+ attr_accessor :api_client
11
+
12
+ def initialize(api_client = ApiClient.default)
13
+ @api_client = api_client
14
+ end
15
+ {{#operation}}
16
+ {{#summary}}
17
+ # {{{summary}}}
18
+ {{/summary}}
19
+ {{#notes}}
20
+ # {{{notes}}}
21
+ {{/notes}}
22
+ {{#allParams}}{{#required}} # @param {{paramName}} [{{{dataType}}}] {{description}}
23
+ {{/required}}{{/allParams}} # @param [Hash] opts the optional parameters
24
+ {{#allParams}}{{^required}} # @option opts [{{{dataType}}}] :{{paramName}} {{description}}{{#defaultValue}} (default to {{{.}}}){{/defaultValue}}
25
+ {{/required}}{{/allParams}} # @return [{{#returnType}}{{{returnType}}}{{/returnType}}{{^returnType}}nil{{/returnType}}]
26
+ def {{operationId}}({{#allParams}}{{#required}}{{paramName}}, {{/required}}{{/allParams}}opts = {})
27
+ {{#returnType}}data, _status_code, _headers = {{/returnType}}{{operationId}}_with_http_info({{#allParams}}{{#required}}{{paramName}}, {{/required}}{{/allParams}}opts)
28
+ {{#returnType}}data{{/returnType}}{{^returnType}}nil{{/returnType}}
29
+ end
30
+
31
+ {{#summary}}
32
+ # {{summary}}
33
+ {{/summary}}
34
+ {{#notes}}
35
+ # {{notes}}
36
+ {{/notes}}
37
+ {{#allParams}}{{#required}} # @param {{paramName}} [{{{dataType}}}] {{description}}
38
+ {{/required}}{{/allParams}} # @param [Hash] opts the optional parameters
39
+ {{#allParams}}{{^required}} # @option opts [{{{dataType}}}] :{{paramName}} {{description}}
40
+ {{/required}}{{/allParams}} # @return [Array<({{#returnType}}{{{returnType}}}{{/returnType}}{{^returnType}}nil{{/returnType}}, Integer, Hash)>] {{#returnType}}{{{returnType}}} data{{/returnType}}{{^returnType}}nil{{/returnType}}, response status code and response headers
41
+ def {{operationId}}_with_http_info({{#allParams}}{{#required}}{{paramName}}, {{/required}}{{/allParams}}opts = {})
42
+ if @api_client.config.debugging
43
+ @api_client.config.logger.debug 'Calling API: {{classname}}.{{operationId}} ...'
44
+ end
45
+ {{#allParams}}
46
+ {{^isNullable}}
47
+ {{#required}}
48
+ # verify the required parameter '{{paramName}}' is set
49
+ if @api_client.config.client_side_validation && {{{paramName}}}.nil?
50
+ fail ArgumentError, "Missing the required parameter '{{paramName}}' when calling {{classname}}.{{operationId}}"
51
+ end
52
+ {{#isEnum}}
53
+ {{^isContainer}}
54
+ # verify enum value
55
+ allowable_values = [{{#allowableValues}}{{#enumVars}}{{{value}}}{{^-last}}, {{/-last}}{{/enumVars}}{{/allowableValues}}]
56
+ if @api_client.config.client_side_validation && !allowable_values.include?({{{paramName}}})
57
+ fail ArgumentError, "invalid value for \"{{{paramName}}}\", must be one of #{allowable_values}"
58
+ end
59
+ {{/isContainer}}
60
+ {{/isEnum}}
61
+ {{/required}}
62
+ {{/isNullable}}
63
+ {{^required}}
64
+ {{#isEnum}}
65
+ {{#collectionFormat}}
66
+ allowable_values = [{{#allowableValues}}{{#enumVars}}{{{value}}}{{^-last}}, {{/-last}}{{/enumVars}}{{/allowableValues}}]
67
+ if @api_client.config.client_side_validation && opts[:'{{{paramName}}}'] && !opts[:'{{{paramName}}}'].all? { |item| allowable_values.include?(item) }
68
+ fail ArgumentError, "invalid value for \"{{{paramName}}}\", must include one of #{allowable_values}"
69
+ end
70
+ {{/collectionFormat}}
71
+ {{^collectionFormat}}
72
+ allowable_values = [{{#allowableValues}}{{#enumVars}}{{{value}}}{{^-last}}, {{/-last}}{{/enumVars}}{{/allowableValues}}]
73
+ if @api_client.config.client_side_validation && opts[:'{{{paramName}}}'] && !allowable_values.include?(opts[:'{{{paramName}}}'])
74
+ fail ArgumentError, "invalid value for \"{{{paramName}}}\", must be one of #{allowable_values}"
75
+ end
76
+ {{/collectionFormat}}
77
+ {{/isEnum}}
78
+ {{/required}}
79
+ {{#hasValidation}}
80
+ {{#maxLength}}
81
+ if @api_client.config.client_side_validation && {{^required}}!opts[:'{{{paramName}}}'].nil? && {{/required}}{{#required}}{{{paramName}}}{{/required}}{{^required}}opts[:'{{{paramName}}}']{{/required}}.to_s.length > {{{maxLength}}}
82
+ fail ArgumentError, 'invalid value for "{{#required}}{{{paramName}}}{{/required}}{{^required}}opts[:"{{{paramName}}}"]{{/required}}" when calling {{classname}}.{{operationId}}, the character length must be smaller than or equal to {{{maxLength}}}.'
83
+ end
84
+
85
+ {{/maxLength}}
86
+ {{#minLength}}
87
+ if @api_client.config.client_side_validation && {{^required}}!opts[:'{{{paramName}}}'].nil? && {{/required}}{{#required}}{{{paramName}}}{{/required}}{{^required}}opts[:'{{{paramName}}}']{{/required}}.to_s.length < {{{minLength}}}
88
+ fail ArgumentError, 'invalid value for "{{#required}}{{{paramName}}}{{/required}}{{^required}}opts[:"{{{paramName}}}"]{{/required}}" when calling {{classname}}.{{operationId}}, the character length must be great than or equal to {{{minLength}}}.'
89
+ end
90
+
91
+ {{/minLength}}
92
+ {{#maximum}}
93
+ if @api_client.config.client_side_validation && {{^required}}!opts[:'{{{paramName}}}'].nil? && {{/required}}{{#required}}{{{paramName}}}{{/required}}{{^required}}opts[:'{{{paramName}}}']{{/required}} >{{#exclusiveMaximum}}={{/exclusiveMaximum}} {{{maximum}}}
94
+ fail ArgumentError, 'invalid value for "{{#required}}{{{paramName}}}{{/required}}{{^required}}opts[:"{{{paramName}}}"]{{/required}}" when calling {{classname}}.{{operationId}}, must be smaller than {{^exclusiveMaximum}}or equal to {{/exclusiveMaximum}}{{{maximum}}}.'
95
+ end
96
+
97
+ {{/maximum}}
98
+ {{#minimum}}
99
+ if @api_client.config.client_side_validation && {{^required}}!opts[:'{{{paramName}}}'].nil? && {{/required}}{{#required}}{{{paramName}}}{{/required}}{{^required}}opts[:'{{{paramName}}}']{{/required}} <{{#exclusiveMinimum}}={{/exclusiveMinimum}} {{{minimum}}}
100
+ fail ArgumentError, 'invalid value for "{{#required}}{{{paramName}}}{{/required}}{{^required}}opts[:"{{{paramName}}}"]{{/required}}" when calling {{classname}}.{{operationId}}, must be greater than {{^exclusiveMinimum}}or equal to {{/exclusiveMinimum}}{{{minimum}}}.'
101
+ end
102
+
103
+ {{/minimum}}
104
+ {{#pattern}}
105
+ pattern = Regexp.new({{{pattern}}})
106
+ if @api_client.config.client_side_validation && {{^required}}!opts[:'{{{paramName}}}'].nil? && {{/required}}{{#required}}{{{paramName}}}{{/required}}{{^required}}opts[:'{{{paramName}}}']{{/required}} !~ pattern
107
+ fail ArgumentError, "invalid value for '{{#required}}{{{paramName}}}{{/required}}{{^required}}opts[:\"{{{paramName}}}\"]{{/required}}' when calling {{classname}}.{{operationId}}, must conform to the pattern #{pattern}."
108
+ end
109
+
110
+ {{/pattern}}
111
+ {{#maxItems}}
112
+ if @api_client.config.client_side_validation && {{^required}}!opts[:'{{{paramName}}}'].nil? && {{/required}}{{#required}}{{{paramName}}}{{/required}}{{^required}}opts[:'{{{paramName}}}']{{/required}}.length > {{{maxItems}}}
113
+ fail ArgumentError, 'invalid value for "{{#required}}{{{paramName}}}{{/required}}{{^required}}opts[:"{{{paramName}}}"]{{/required}}" when calling {{classname}}.{{operationId}}, number of items must be less than or equal to {{{maxItems}}}.'
114
+ end
115
+
116
+ {{/maxItems}}
117
+ {{#minItems}}
118
+ if @api_client.config.client_side_validation && {{^required}}!opts[:'{{{paramName}}}'].nil? && {{/required}}{{#required}}{{{paramName}}}{{/required}}{{^required}}opts[:'{{{paramName}}}']{{/required}}.length < {{{minItems}}}
119
+ fail ArgumentError, 'invalid value for "{{#required}}{{{paramName}}}{{/required}}{{^required}}opts[:"{{{paramName}}}"]{{/required}}" when calling {{classname}}.{{operationId}}, number of items must be greater than or equal to {{{minItems}}}.'
120
+ end
121
+
122
+ {{/minItems}}
123
+ {{/hasValidation}}
124
+ {{/allParams}}
125
+ # resource path
126
+ local_var_path = '{{{path}}}'{{#pathParams}}.sub('{' + '{{baseName}}' + '}', CGI.escape({{paramName}}.to_s){{^strictSpecBehavior}}.gsub('%2F', '/'){{/strictSpecBehavior}}){{/pathParams}}
127
+
128
+ # query parameters
129
+ query_params = opts[:query_params] || {}
130
+ {{#queryParams}}
131
+ {{#required}}
132
+ query_params[:'{{{baseName}}}'] = {{#collectionFormat}}@api_client.build_collection_param({{{paramName}}}, :{{{collectionFormat}}}){{/collectionFormat}}{{^collectionFormat}}{{{paramName}}}{{/collectionFormat}}
133
+ {{/required}}
134
+ {{/queryParams}}
135
+ {{#queryParams}}
136
+ {{^required}}
137
+ query_params[:'{{{baseName}}}'] = {{#collectionFormat}}@api_client.build_collection_param(opts[:'{{{paramName}}}'], :{{{collectionFormat}}}){{/collectionFormat}}{{^collectionFormat}}opts[:'{{{paramName}}}']{{/collectionFormat}} if !opts[:'{{{paramName}}}'].nil?
138
+ {{/required}}
139
+ {{/queryParams}}
140
+
141
+ # header parameters
142
+ header_params = opts[:header_params] || {}
143
+ {{#hasProduces}}
144
+ # HTTP header 'Accept' (if needed)
145
+ header_params['Accept'] = @api_client.select_header_accept([{{#produces}}'{{{mediaType}}}'{{^-last}}, {{/-last}}{{/produces}}])
146
+ {{/hasProduces}}
147
+ {{#hasConsumes}}
148
+ # HTTP header 'Content-Type'
149
+ header_params['Content-Type'] = @api_client.select_header_content_type([{{#consumes}}'{{{mediaType}}}'{{^-last}}, {{/-last}}{{/consumes}}])
150
+ {{/hasConsumes}}
151
+ {{#headerParams}}
152
+ {{#required}}
153
+ header_params[:'{{{baseName}}}'] = {{#collectionFormat}}@api_client.build_collection_param({{{paramName}}}, :{{{collectionFormat}}}){{/collectionFormat}}{{^collectionFormat}}{{{paramName}}}{{/collectionFormat}}
154
+ {{/required}}
155
+ {{/headerParams}}
156
+ {{#headerParams}}
157
+ {{^required}}
158
+ header_params[:'{{{baseName}}}'] = {{#collectionFormat}}@api_client.build_collection_param(opts[:'{{{paramName}}}'], :{{{collectionFormat}}}){{/collectionFormat}}{{^collectionFormat}}opts[:'{{{paramName}}}']{{/collectionFormat}} if !opts[:'{{{paramName}}}'].nil?
159
+ {{/required}}
160
+ {{/headerParams}}
161
+
162
+ # form parameters
163
+ form_params = opts[:form_params] || {}
164
+ {{#formParams}}
165
+ {{#required}}
166
+ form_params['{{baseName}}'] = {{#collectionFormat}}@api_client.build_collection_param({{{paramName}}}, :{{{collectionFormat}}}){{/collectionFormat}}{{^collectionFormat}}{{{paramName}}}{{/collectionFormat}}
167
+ {{/required}}
168
+ {{/formParams}}
169
+ {{#formParams}}
170
+ {{^required}}
171
+ form_params['{{baseName}}'] = {{#collectionFormat}}@api_client.build_collection_param(opts[:'{{{paramName}}}'], :{{{collectionFormat}}}){{/collectionFormat}}{{^collectionFormat}}opts[:'{{{paramName}}}']{{/collectionFormat}} if !opts[:'{{paramName}}'].nil?
172
+ {{/required}}
173
+ {{/formParams}}
174
+
175
+ # http body (model)
176
+ post_body = opts[:debug_body]{{#bodyParam}} || @api_client.object_to_http_body({{#required}}{{{paramName}}}{{/required}}{{^required}}opts[:'{{{paramName}}}']{{/required}}){{/bodyParam}}
177
+
178
+ # return_type
179
+ return_type = opts[:debug_return_type]{{#returnType}} || '{{{returnType}}}'{{/returnType}}
180
+
181
+ # auth_names
182
+ auth_names = opts[:debug_auth_names] || [{{#authMethods}}'{{name}}'{{^-last}}, {{/-last}}{{/authMethods}}]
183
+
184
+ new_options = opts.merge(
185
+ :operation => :"{{classname}}.{{operationId}}",
186
+ :header_params => header_params,
187
+ :query_params => query_params,
188
+ :form_params => form_params,
189
+ :body => post_body,
190
+ :auth_names => auth_names,
191
+ :return_type => return_type
192
+ )
193
+
194
+ data, status_code, headers = @api_client.call_api(:{{httpMethod}}, local_var_path, new_options)
195
+ if @api_client.config.debugging
196
+ @api_client.config.logger.debug "API called: {{classname}}#{{operationId}}\nData: #{data.inspect}\nStatus code: #{status_code}\nHeaders: #{headers}"
197
+ end
198
+ return data, status_code, headers
199
+ end
200
+ {{^-last}}
201
+
202
+ {{/-last}}
203
+ {{/operation}}
204
+ end
205
+ {{/operations}}
206
+ end