rev-api 2.4.0 → 2.5.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 (60) hide show
  1. checksums.yaml +4 -4
  2. data/.gitignore +22 -22
  3. data/.ruby-gemset +1 -1
  4. data/.ruby-version +1 -1
  5. data/.travis.yml +8 -8
  6. data/Gemfile +3 -3
  7. data/LICENSE +191 -191
  8. data/README.md +131 -131
  9. data/Rakefile +13 -13
  10. data/examples/cli.rb +270 -270
  11. data/lib/rev-api.rb +26 -26
  12. data/lib/rev-api/api.rb +326 -326
  13. data/lib/rev-api/api_serializable.rb +30 -30
  14. data/lib/rev-api/exceptions.rb +97 -97
  15. data/lib/rev-api/http_client.rb +97 -97
  16. data/lib/rev-api/models/order.rb +129 -129
  17. data/lib/rev-api/models/order_request.rb +292 -273
  18. data/lib/rev-api/version.rb +3 -3
  19. data/rev-api.gemspec +33 -33
  20. data/spec/fixtures/api_cassettes/cancel_order.yml +38 -38
  21. data/spec/fixtures/api_cassettes/cancel_order_not_allowed.yml +40 -40
  22. data/spec/fixtures/api_cassettes/get_attachment_content.yml +399 -399
  23. data/spec/fixtures/api_cassettes/get_attachment_content_as_pdf.yml +399 -399
  24. data/spec/fixtures/api_cassettes/get_attachment_content_as_text.yml +65 -65
  25. data/spec/fixtures/api_cassettes/get_attachment_content_as_youtube_transcript.yml +66 -66
  26. data/spec/fixtures/api_cassettes/get_attachment_content_unacceptable_representation.yml +42 -42
  27. data/spec/fixtures/api_cassettes/get_attachment_content_with_invalid_id.yml +42 -42
  28. data/spec/fixtures/api_cassettes/get_attachment_metadata.yml +42 -42
  29. data/spec/fixtures/api_cassettes/get_attachment_with_invalid_id.yml +40 -40
  30. data/spec/fixtures/api_cassettes/get_orders.yml +122 -122
  31. data/spec/fixtures/api_cassettes/get_orders_with_clientRef.yml +41 -41
  32. data/spec/fixtures/api_cassettes/get_tc_order.yml +44 -44
  33. data/spec/fixtures/api_cassettes/get_third_page_of_orders.yml +52 -52
  34. data/spec/fixtures/api_cassettes/link_input.yml +44 -44
  35. data/spec/fixtures/api_cassettes/link_input_with_all_attributes.yml +44 -44
  36. data/spec/fixtures/api_cassettes/link_input_with_spaces_in_filename.yml +45 -45
  37. data/spec/fixtures/api_cassettes/not_found_order.yml +42 -42
  38. data/spec/fixtures/api_cassettes/submit_cp_order.yml +44 -44
  39. data/spec/fixtures/api_cassettes/submit_su_order.yml +44 -44
  40. data/spec/fixtures/api_cassettes/submit_tc_order_with_account_balance.yml +44 -44
  41. data/spec/fixtures/api_cassettes/submit_tc_order_with_invalid_request.yml +45 -45
  42. data/spec/fixtures/api_cassettes/submit_tc_order_without_specifying_payment.yml +44 -44
  43. data/spec/fixtures/api_cassettes/unauthorized.yml +42 -42
  44. data/spec/fixtures/api_cassettes/upload_input.yml +90 -90
  45. data/spec/fixtures/api_cassettes/upload_input_with_invalid_content_type.yml +91 -91
  46. data/spec/lib/rev/api_spec.rb +30 -30
  47. data/spec/lib/rev/cancel_order_spec.rb +24 -24
  48. data/spec/lib/rev/exceptions_spec.rb +8 -8
  49. data/spec/lib/rev/get_attachment_content_spec.rb +79 -79
  50. data/spec/lib/rev/get_attachment_metadata_spec.rb +33 -33
  51. data/spec/lib/rev/get_order_spec.rb +52 -52
  52. data/spec/lib/rev/get_orders_spec.rb +62 -62
  53. data/spec/lib/rev/http_client_spec.rb +32 -32
  54. data/spec/lib/rev/models/order_request_spec.rb +41 -6
  55. data/spec/lib/rev/models/order_spec.rb +58 -58
  56. data/spec/lib/rev/post_inputs_spec.rb +94 -94
  57. data/spec/lib/rev/post_order_spec.rb +163 -163
  58. data/spec/spec_helper.rb +47 -47
  59. data/spec/test_helpers.rb +5 -5
  60. metadata +19 -19
@@ -1,273 +1,292 @@
1
- require 'rev-api/api_serializable'
2
-
3
- module Rev
4
- # OrderRequest is used for constructing order 'spec' in consumer code and passing it into.
5
- # It consists of three main elements: :payment, :transcription_options and :notification.
6
- # You can also supply reference number and whether standard turnaround time is not required
7
- #
8
- # @note https://www.rev.com/api/ordersposttranscription, https://www.rev.com/api/orderspostcaption
9
-
10
- GLOSSARY_ENTRIES_LIMIT = 1000
11
- GLOSSARY_ENTRY_LENGTH_LIMIT = 255
12
- SPEAKER_ENTRIES_LIMIT = 100
13
- SPEAKER_ENTRY_LENGTH_LIMIT = 15
14
-
15
- class OrderRequest < ApiSerializable
16
- # see {Rev::Payment}
17
- attr_reader :payment
18
-
19
- # see {Rev::TranscriptionOptions}
20
- attr_reader :transcription_options
21
-
22
- # see {Rev::CaptionOptions}
23
- attr_reader :caption_options
24
-
25
- # see {Rev::Notification}
26
- attr_reader :notification
27
-
28
- # a reference number for the order meaningful for the client (optional)
29
- attr_reader :client_ref
30
-
31
- # a boolean flag specifying whether normal turnaround time is not required, defaults to false (optional)
32
- attr_reader :non_standard_tat_guarantee
33
-
34
- # @param payment [Payment] payment info
35
- # @param fields [Hash] of fields to initialize instance. See instance attributes for available fields.
36
- # @deprecated payment always defaults to :account_balance
37
- def self.new_with_payment(payment, fields = {})
38
- fields = { :non_standard_tat_guarantee => false }.merge(fields)
39
- super fields
40
- @payment = payment
41
- end
42
-
43
- # @param fields [Hash] of fields to initialize instance. See instance attributes for available fields.
44
- def initialize(fields = {})
45
- fields = { :non_standard_tat_guarantee => false }.merge(fields)
46
- @payment = Rev::Payment.with_account_balance
47
- super fields
48
- end
49
- end
50
-
51
- # Payment Info. Payment can only be done by debiting the user's account balance.
52
- # @deprecated setting the payment is no longer necessary. All orders now default to :account_balance
53
- class Payment < ApiSerializable
54
- attr_accessor :type
55
-
56
- # use to correctly set payment type
57
- TYPES = {
58
- :account_balance => 'AccountBalance'
59
- }
60
-
61
- CC_ON_FILE_ID = 1
62
-
63
- # @param type [String] payment method
64
- def initialize(type)
65
- @type = type
66
- end
67
-
68
- class << self
69
- def with_account_balance()
70
- Payment::new(TYPES[:account_balance])
71
- end
72
- end
73
- end
74
-
75
- # Billing address
76
- class BillingAddress < ApiSerializable
77
- attr_reader :street, :street2, :city, :state, :zip, :country_alpha2
78
- end
79
-
80
- # Superclass for the business-line options that handles capture and common validation of inputs.
81
- class InputOptions < ApiSerializable
82
- # Mandatory, contains list of inputs. Must have at least one element.
83
- attr_reader :inputs
84
-
85
- # @param inputs [Array] list of inputs
86
- # @param info [Hash] of fields to initialize instance.
87
- def initialize(inputs, info = {})
88
- super info
89
- raise(ArgumentError, "inputs must have at least one element") unless validate_inputs(inputs)
90
- @inputs = inputs
91
- end
92
-
93
- private
94
-
95
- def validate_inputs(inputs)
96
- !inputs.nil? && inputs.length > 0
97
- end
98
- end
99
-
100
- # Transcription options. This section contains the input media that must be transferred to our servers
101
- # using a POST to /inputs, and are referenced using the URIs returned by that call. We also support external links.
102
- # @see https://www.rev.com/api/ordersposttranscription
103
- class TranscriptionOptions < InputOptions
104
- # Optional, should we transcribe the provided files verbatim? If true,
105
- # all filler words (i.e. umm, huh) will be included.
106
- attr_reader :verbatim
107
-
108
- # Optional, should we include timestamps?
109
- attr_reader :timestamps
110
-
111
- # @param inputs [Array] list of inputs
112
- # @param info [Hash] of fields to initialize instance. May contain:
113
- # - :verbatim => true/false
114
- # - :timestamps => true/false
115
- def initialize(inputs, info = {})
116
- super inputs, info
117
- options_validation(inputs)
118
- end
119
-
120
- private
121
-
122
- def options_validation(inputs)
123
- inputs.each { |input|
124
- input.validate_glossary
125
- input.validate_speakers
126
- input.validate_accents
127
- }
128
- end
129
- end
130
-
131
- # Caption options. This section contains the input media that must be transferred to our servers
132
- # using a POST to /inputs, and are referenced using the URIs returned by that call. We also support external links.
133
- # @see https://www.rev.com/api/orderspostcaption
134
- class CaptionOptions < InputOptions
135
- # Array of file formats the captions should be delivered as. (Optional, default is SubRip)
136
- attr_reader :output_file_formats
137
-
138
- # Optional, Array of language codes to request foreign language subtitles
139
- attr_reader :subtitle_languages
140
-
141
- # All supported output file formats
142
- OUTPUT_FILE_FORMATS = {
143
- :subrip => 'SubRip',
144
- :scc => 'Scc',
145
- :mcc => 'Mcc',
146
- :ttml => 'Ttml',
147
- :qttext => 'QTtext',
148
- :transcript => 'Transcript',
149
- :webvtt => 'WebVtt',
150
- :dfxp => 'Dfxp',
151
- :cheetahcap => 'CheetahCap'
152
- }
153
-
154
- # @param inputs [Array] list of inputs
155
- # @param info [Hash] of fields to initialize instance. May contain:
156
- # - :subtitle_languages
157
- # @see For language codes refer to http://www.loc.gov/standards/iso639-2/php/code_list.php
158
- def initialize(inputs, info = {})
159
- super(inputs, info)
160
- raise(ArgumentError, "invalid format(s)") unless validate_output_formats(info[:output_file_formats])
161
- options_validation(inputs)
162
- end
163
-
164
- private
165
-
166
- def validate_output_formats(formats)
167
- formats.nil? || formats.select{|f| !OUTPUT_FILE_FORMATS.has_value?(f) }.empty?
168
- end
169
-
170
- def options_validation(inputs)
171
- inputs.each { |input|
172
- input.validate_glossary
173
- input.validate_speakers
174
- }
175
- end
176
- end
177
-
178
- # Input for order (aka source file)
179
- class Input < ApiSerializable
180
- # Length of audio in seconds (mandatory in case of inability to determine it automatically).
181
- # Used within {Rev::OrderRequest::TranscriptionInfo}
182
- attr_reader :audio_length_seconds
183
-
184
- # Length of video in seconds (mandatory in case of inability to determine it automatically).
185
- # Used within {Rev::OrderRequest::CaptionInfo}
186
- attr_reader :video_length_seconds
187
-
188
- # Mandatory, URI of the media, as returned from the call to POST /inputs.
189
- # :external_link might substitute :uri for Transcription or Caption.
190
- attr_reader :uri
191
-
192
- # External URL, if sources wasn't POSTed as input (YouTube, Vimeo, Dropbox, etc)
193
- attr_reader :external_link
194
-
195
- # Optional, list of glossary entries.
196
- attr_reader :glossary
197
-
198
- # Optional, list of speaker names.
199
- attr_reader :speakers
200
-
201
- # Optional, list of accents.
202
- attr_reader :accents
203
-
204
- SUPPORTED_ACCENTS = {
205
- :american_neutral => 'AmericanNeutral',
206
- :american_southern => 'AmericanSouthern',
207
- :asian => 'Asian',
208
- :australian => 'Australian',
209
- :british => 'British',
210
- :indian => 'Indian',
211
- :other => 'Other',
212
- :unknown => 'Unknown'
213
- }
214
-
215
- def validate_glossary
216
- if glossary
217
- if glossary.length > GLOSSARY_ENTRIES_LIMIT
218
- raise(ArgumentError, "Glossary must not exceed #{GLOSSARY_ENTRIES_LIMIT} entries")
219
- end
220
- glossary.each { |term|
221
- if term.length > GLOSSARY_ENTRY_LENGTH_LIMIT
222
- raise(ArgumentError, "Glossary entries cannot exceed #{GLOSSARY_ENTRY_LENGTH_LIMIT} characters")
223
- end
224
- }
225
- end
226
- end
227
-
228
- def validate_speakers
229
- if speakers
230
- if speakers.length > SPEAKER_ENTRIES_LIMIT
231
- raise(ArgumentError, "Speaker list must not exceed #{SPEAKER_ENTRIES_LIMIT} entries")
232
- end
233
- speakers.each { |speaker|
234
- if speaker.length > SPEAKER_ENTRY_LENGTH_LIMIT
235
- raise(ArgumentError, "Speaker name cannot exceed #{SPEAKER_ENTRY_LENGTH_LIMIT} characters")
236
- end
237
- }
238
- end
239
- end
240
-
241
- def validate_accents
242
- if accents
243
- if accents.length > SUPPORTED_ACCENTS.length
244
- raise(ArgumentError, "Length of accents list cannot exceed number of supported accents.")
245
- end
246
- if accents.any?{ |accent| !Rev::Input::SUPPORTED_ACCENTS.has_value?(accent) }
247
- raise(ArgumentError, 'Unsupported accent provided')
248
- end
249
- end
250
- end
251
- end
252
-
253
- # Notification Info. Optionally you may request that an HTTP post be made to a url of your choice when the order enters
254
- # a new status (eg being transcribed or reviewed) and when it is complete.
255
- class Notification < ApiSerializable
256
- attr_reader :url, :level
257
-
258
- # Notification levels
259
- LEVELS = {
260
- :detailed => 'Detailed',
261
- :final_only => 'FinalOnly'
262
- }
263
-
264
- # @param url [String] The url for notifications. Mandatory if the notifications element is used. Updates will be posted to this URL
265
- # @param level [String] Optional, specifies which notifications are sent:
266
- # - :detailed - a notification is sent whenever the order is in a new status or has a new comment
267
- # - :final_only - (the default), notification is sent only when the order is complete
268
- def initialize(url, level = nil)
269
- @url = url
270
- @level = level ? level : LEVELS[:final_only]
271
- end
272
- end
273
- end
1
+ require 'rev-api/api_serializable'
2
+
3
+ module Rev
4
+ # OrderRequest is used for constructing order 'spec' in consumer code and passing it into.
5
+ # It consists of three main elements: :payment, :transcription_options and :notification.
6
+ # You can also supply reference number and whether standard turnaround time is not required
7
+ #
8
+ # @note https://www.rev.com/api/ordersposttranscription, https://www.rev.com/api/orderspostcaption
9
+
10
+ GLOSSARY_ENTRIES_LIMIT = 1000
11
+ GLOSSARY_ENTRY_LENGTH_LIMIT = 255
12
+ SPEAKER_ENTRIES_LIMIT = 100
13
+ SPEAKER_ENTRY_LENGTH_LIMIT = 15
14
+
15
+ class OrderRequest < ApiSerializable
16
+ # see {Rev::Payment}
17
+ attr_reader :payment
18
+
19
+ # see {Rev::TranscriptionOptions}
20
+ attr_reader :transcription_options
21
+
22
+ # see {Rev::CaptionOptions}
23
+ attr_reader :caption_options
24
+
25
+ # see {Rev::Notification}
26
+ attr_reader :notification
27
+
28
+ # a reference number for the order meaningful for the client (optional)
29
+ attr_reader :client_ref
30
+
31
+ # a boolean flag specifying whether normal turnaround time is not required, defaults to false (optional)
32
+ attr_reader :non_standard_tat_guarantee
33
+
34
+ # @param payment [Payment] payment info
35
+ # @param fields [Hash] of fields to initialize instance. See instance attributes for available fields.
36
+ # @deprecated payment always defaults to :account_balance
37
+ def self.new_with_payment(payment, fields = {})
38
+ fields = { :non_standard_tat_guarantee => false }.merge(fields)
39
+ super fields
40
+ @payment = payment
41
+ end
42
+
43
+ # @param fields [Hash] of fields to initialize instance. See instance attributes for available fields.
44
+ def initialize(fields = {})
45
+ fields = { :non_standard_tat_guarantee => false }.merge(fields)
46
+ @payment = Rev::Payment.with_account_balance
47
+ super fields
48
+ end
49
+ end
50
+
51
+ # Payment Info. Payment can only be done by debiting the user's account balance.
52
+ # @deprecated setting the payment is no longer necessary. All orders now default to :account_balance
53
+ class Payment < ApiSerializable
54
+ attr_accessor :type
55
+
56
+ # use to correctly set payment type
57
+ TYPES = {
58
+ :account_balance => 'AccountBalance'
59
+ }
60
+
61
+ CC_ON_FILE_ID = 1
62
+
63
+ # @param type [String] payment method
64
+ def initialize(type)
65
+ @type = type
66
+ end
67
+
68
+ class << self
69
+ def with_account_balance()
70
+ Payment::new(TYPES[:account_balance])
71
+ end
72
+ end
73
+ end
74
+
75
+ # Billing address
76
+ class BillingAddress < ApiSerializable
77
+ attr_reader :street, :street2, :city, :state, :zip, :country_alpha2
78
+ end
79
+
80
+ # Superclass for the business-line options that handles capture and common validation of inputs.
81
+ class InputOptions < ApiSerializable
82
+ # Mandatory, contains list of inputs. Must have at least one element.
83
+ attr_reader :inputs
84
+
85
+ # @param inputs [Array] list of inputs
86
+ # @param info [Hash] of fields to initialize instance.
87
+ def initialize(inputs, info = {})
88
+ super info
89
+ raise(ArgumentError, "inputs must have at least one element") unless validate_inputs(inputs)
90
+ @inputs = inputs
91
+ end
92
+
93
+ private
94
+
95
+ def validate_inputs(inputs)
96
+ !inputs.nil? && inputs.length > 0
97
+ end
98
+ end
99
+
100
+ # Transcription options. This section contains the input media that must be transferred to our servers
101
+ # using a POST to /inputs, and are referenced using the URIs returned by that call. We also support external links.
102
+ # @see https://www.rev.com/api/ordersposttranscription
103
+ class TranscriptionOptions < InputOptions
104
+ # Optional, array of file formats the captions should be delivered as.
105
+ # default is MS Word
106
+ attr_reader :output_file_formats
107
+
108
+ # Optional, should we transcribe the provided files verbatim? If true,
109
+ # all filler words (i.e. umm, huh) will be included.
110
+ attr_reader :verbatim
111
+
112
+ # Optional, should we include timestamps?
113
+ attr_reader :timestamps
114
+
115
+ # All supported output file formats
116
+ OUTPUT_FILE_FORMATS = {
117
+ :ms_word => 'MS Word',
118
+ :json => 'JSON',
119
+ :text => 'Text',
120
+ :pdf => 'Pdf'
121
+ }
122
+
123
+ # @param inputs [Array] list of inputs
124
+ # @param info [Hash] of fields to initialize instance. May contain:
125
+ # - :output_file_formats => String[]
126
+ # - :verbatim => true/false
127
+ # - :timestamps => true/false
128
+ def initialize(inputs, info = {})
129
+ super inputs, info
130
+ raise(ArgumentError, "invalid format(s)") unless validate_output_formats(info[:output_file_formats])
131
+ options_validation(inputs)
132
+ end
133
+
134
+ private
135
+
136
+ def validate_output_formats(formats)
137
+ formats.nil? || formats.select{|f| !OUTPUT_FILE_FORMATS.has_value?(f) }.empty?
138
+ end
139
+
140
+ def options_validation(inputs)
141
+ inputs.each { |input|
142
+ input.validate_glossary
143
+ input.validate_speakers
144
+ input.validate_accents
145
+ }
146
+ end
147
+ end
148
+
149
+ # Caption options. This section contains the input media that must be transferred to our servers
150
+ # using a POST to /inputs, and are referenced using the URIs returned by that call. We also support external links.
151
+ # @see https://www.rev.com/api/orderspostcaption
152
+ class CaptionOptions < InputOptions
153
+ # Array of file formats the captions should be delivered as. (Optional, default is SubRip)
154
+ attr_reader :output_file_formats
155
+
156
+ # Optional, Array of language codes to request foreign language subtitles
157
+ attr_reader :subtitle_languages
158
+
159
+ # All supported output file formats
160
+ OUTPUT_FILE_FORMATS = {
161
+ :subrip => 'SubRip',
162
+ :scc => 'Scc',
163
+ :mcc => 'Mcc',
164
+ :ttml => 'Ttml',
165
+ :qttext => 'QTtext',
166
+ :transcript => 'Transcript',
167
+ :webvtt => 'WebVtt',
168
+ :dfxp => 'Dfxp',
169
+ :cheetahcap => 'CheetahCap'
170
+ }
171
+
172
+ # @param inputs [Array] list of inputs
173
+ # @param info [Hash] of fields to initialize instance. May contain:
174
+ # - :output_file_formats => String[]
175
+ # - :subtitle_languages => String[]
176
+ # @see For language codes refer to http://www.loc.gov/standards/iso639-2/php/code_list.php
177
+ def initialize(inputs, info = {})
178
+ super(inputs, info)
179
+ raise(ArgumentError, "invalid format(s)") unless validate_output_formats(info[:output_file_formats])
180
+ options_validation(inputs)
181
+ end
182
+
183
+ private
184
+
185
+ def validate_output_formats(formats)
186
+ formats.nil? || formats.select{|f| !OUTPUT_FILE_FORMATS.has_value?(f) }.empty?
187
+ end
188
+
189
+ def options_validation(inputs)
190
+ inputs.each { |input|
191
+ input.validate_glossary
192
+ input.validate_speakers
193
+ }
194
+ end
195
+ end
196
+
197
+ # Input for order (aka source file)
198
+ class Input < ApiSerializable
199
+ # Length of audio in seconds (mandatory in case of inability to determine it automatically).
200
+ # Used within {Rev::OrderRequest::TranscriptionInfo}
201
+ attr_reader :audio_length_seconds
202
+
203
+ # Length of video in seconds (mandatory in case of inability to determine it automatically).
204
+ # Used within {Rev::OrderRequest::CaptionInfo}
205
+ attr_reader :video_length_seconds
206
+
207
+ # Mandatory, URI of the media, as returned from the call to POST /inputs.
208
+ # :external_link might substitute :uri for Transcription or Caption.
209
+ attr_reader :uri
210
+
211
+ # External URL, if sources wasn't POSTed as input (YouTube, Vimeo, Dropbox, etc)
212
+ attr_reader :external_link
213
+
214
+ # Optional, list of glossary entries.
215
+ attr_reader :glossary
216
+
217
+ # Optional, list of speaker names.
218
+ attr_reader :speakers
219
+
220
+ # Optional, list of accents.
221
+ attr_reader :accents
222
+
223
+ SUPPORTED_ACCENTS = {
224
+ :american_neutral => 'AmericanNeutral',
225
+ :american_southern => 'AmericanSouthern',
226
+ :asian => 'Asian',
227
+ :australian => 'Australian',
228
+ :british => 'British',
229
+ :indian => 'Indian',
230
+ :other => 'Other',
231
+ :unknown => 'Unknown'
232
+ }
233
+
234
+ def validate_glossary
235
+ if glossary
236
+ if glossary.length > GLOSSARY_ENTRIES_LIMIT
237
+ raise(ArgumentError, "Glossary must not exceed #{GLOSSARY_ENTRIES_LIMIT} entries")
238
+ end
239
+ glossary.each { |term|
240
+ if term.length > GLOSSARY_ENTRY_LENGTH_LIMIT
241
+ raise(ArgumentError, "Glossary entries cannot exceed #{GLOSSARY_ENTRY_LENGTH_LIMIT} characters")
242
+ end
243
+ }
244
+ end
245
+ end
246
+
247
+ def validate_speakers
248
+ if speakers
249
+ if speakers.length > SPEAKER_ENTRIES_LIMIT
250
+ raise(ArgumentError, "Speaker list must not exceed #{SPEAKER_ENTRIES_LIMIT} entries")
251
+ end
252
+ speakers.each { |speaker|
253
+ if speaker.length > SPEAKER_ENTRY_LENGTH_LIMIT
254
+ raise(ArgumentError, "Speaker name cannot exceed #{SPEAKER_ENTRY_LENGTH_LIMIT} characters")
255
+ end
256
+ }
257
+ end
258
+ end
259
+
260
+ def validate_accents
261
+ if accents
262
+ if accents.length > SUPPORTED_ACCENTS.length
263
+ raise(ArgumentError, "Length of accents list cannot exceed number of supported accents.")
264
+ end
265
+ if accents.any?{ |accent| !Rev::Input::SUPPORTED_ACCENTS.has_value?(accent) }
266
+ raise(ArgumentError, 'Unsupported accent provided')
267
+ end
268
+ end
269
+ end
270
+ end
271
+
272
+ # Notification Info. Optionally you may request that an HTTP post be made to a url of your choice when the order enters
273
+ # a new status (eg being transcribed or reviewed) and when it is complete.
274
+ class Notification < ApiSerializable
275
+ attr_reader :url, :level
276
+
277
+ # Notification levels
278
+ LEVELS = {
279
+ :detailed => 'Detailed',
280
+ :final_only => 'FinalOnly'
281
+ }
282
+
283
+ # @param url [String] The url for notifications. Mandatory if the notifications element is used. Updates will be posted to this URL
284
+ # @param level [String] Optional, specifies which notifications are sent:
285
+ # - :detailed - a notification is sent whenever the order is in a new status or has a new comment
286
+ # - :final_only - (the default), notification is sent only when the order is complete
287
+ def initialize(url, level = nil)
288
+ @url = url
289
+ @level = level ? level : LEVELS[:final_only]
290
+ end
291
+ end
292
+ end