lib/rev-api/models/order_request.rb in rev-api-2.4.0 vs lib/rev-api/models/order_request.rb in rev-api-2.5.0

- old
+ new

@@ -1,273 +1,292 @@ -require 'rev-api/api_serializable' - -module Rev - # OrderRequest is used for constructing order 'spec' in consumer code and passing it into. - # It consists of three main elements: :payment, :transcription_options and :notification. - # You can also supply reference number and whether standard turnaround time is not required - # - # @note https://www.rev.com/api/ordersposttranscription, https://www.rev.com/api/orderspostcaption - - GLOSSARY_ENTRIES_LIMIT = 1000 - GLOSSARY_ENTRY_LENGTH_LIMIT = 255 - SPEAKER_ENTRIES_LIMIT = 100 - SPEAKER_ENTRY_LENGTH_LIMIT = 15 - - class OrderRequest < ApiSerializable - # see {Rev::Payment} - attr_reader :payment - - # see {Rev::TranscriptionOptions} - attr_reader :transcription_options - - # see {Rev::CaptionOptions} - attr_reader :caption_options - - # see {Rev::Notification} - attr_reader :notification - - # a reference number for the order meaningful for the client (optional) - attr_reader :client_ref - - # a boolean flag specifying whether normal turnaround time is not required, defaults to false (optional) - attr_reader :non_standard_tat_guarantee - - # @param payment [Payment] payment info - # @param fields [Hash] of fields to initialize instance. See instance attributes for available fields. - # @deprecated payment always defaults to :account_balance - def self.new_with_payment(payment, fields = {}) - fields = { :non_standard_tat_guarantee => false }.merge(fields) - super fields - @payment = payment - end - - # @param fields [Hash] of fields to initialize instance. See instance attributes for available fields. - def initialize(fields = {}) - fields = { :non_standard_tat_guarantee => false }.merge(fields) - @payment = Rev::Payment.with_account_balance - super fields - end - end - - # Payment Info. Payment can only be done by debiting the user's account balance. - # @deprecated setting the payment is no longer necessary. All orders now default to :account_balance - class Payment < ApiSerializable - attr_accessor :type - - # use to correctly set payment type - TYPES = { - :account_balance => 'AccountBalance' - } - - CC_ON_FILE_ID = 1 - - # @param type [String] payment method - def initialize(type) - @type = type - end - - class << self - def with_account_balance() - Payment::new(TYPES[:account_balance]) - end - end - end - - # Billing address - class BillingAddress < ApiSerializable - attr_reader :street, :street2, :city, :state, :zip, :country_alpha2 - end - - # Superclass for the business-line options that handles capture and common validation of inputs. - class InputOptions < ApiSerializable - # Mandatory, contains list of inputs. Must have at least one element. - attr_reader :inputs - - # @param inputs [Array] list of inputs - # @param info [Hash] of fields to initialize instance. - def initialize(inputs, info = {}) - super info - raise(ArgumentError, "inputs must have at least one element") unless validate_inputs(inputs) - @inputs = inputs - end - - private - - def validate_inputs(inputs) - !inputs.nil? && inputs.length > 0 - end - end - - # Transcription options. This section contains the input media that must be transferred to our servers - # using a POST to /inputs, and are referenced using the URIs returned by that call. We also support external links. - # @see https://www.rev.com/api/ordersposttranscription - class TranscriptionOptions < InputOptions - # Optional, should we transcribe the provided files verbatim? If true, - # all filler words (i.e. umm, huh) will be included. - attr_reader :verbatim - - # Optional, should we include timestamps? - attr_reader :timestamps - - # @param inputs [Array] list of inputs - # @param info [Hash] of fields to initialize instance. May contain: - # - :verbatim => true/false - # - :timestamps => true/false - def initialize(inputs, info = {}) - super inputs, info - options_validation(inputs) - end - - private - - def options_validation(inputs) - inputs.each { |input| - input.validate_glossary - input.validate_speakers - input.validate_accents - } - end - end - - # Caption options. This section contains the input media that must be transferred to our servers - # using a POST to /inputs, and are referenced using the URIs returned by that call. We also support external links. - # @see https://www.rev.com/api/orderspostcaption - class CaptionOptions < InputOptions - # Array of file formats the captions should be delivered as. (Optional, default is SubRip) - attr_reader :output_file_formats - - # Optional, Array of language codes to request foreign language subtitles - attr_reader :subtitle_languages - - # All supported output file formats - OUTPUT_FILE_FORMATS = { - :subrip => 'SubRip', - :scc => 'Scc', - :mcc => 'Mcc', - :ttml => 'Ttml', - :qttext => 'QTtext', - :transcript => 'Transcript', - :webvtt => 'WebVtt', - :dfxp => 'Dfxp', - :cheetahcap => 'CheetahCap' - } - - # @param inputs [Array] list of inputs - # @param info [Hash] of fields to initialize instance. May contain: - # - :subtitle_languages - # @see For language codes refer to http://www.loc.gov/standards/iso639-2/php/code_list.php - def initialize(inputs, info = {}) - super(inputs, info) - raise(ArgumentError, "invalid format(s)") unless validate_output_formats(info[:output_file_formats]) - options_validation(inputs) - end - - private - - def validate_output_formats(formats) - formats.nil? || formats.select{|f| !OUTPUT_FILE_FORMATS.has_value?(f) }.empty? - end - - def options_validation(inputs) - inputs.each { |input| - input.validate_glossary - input.validate_speakers - } - end - end - - # Input for order (aka source file) - class Input < ApiSerializable - # Length of audio in seconds (mandatory in case of inability to determine it automatically). - # Used within {Rev::OrderRequest::TranscriptionInfo} - attr_reader :audio_length_seconds - - # Length of video in seconds (mandatory in case of inability to determine it automatically). - # Used within {Rev::OrderRequest::CaptionInfo} - attr_reader :video_length_seconds - - # Mandatory, URI of the media, as returned from the call to POST /inputs. - # :external_link might substitute :uri for Transcription or Caption. - attr_reader :uri - - # External URL, if sources wasn't POSTed as input (YouTube, Vimeo, Dropbox, etc) - attr_reader :external_link - - # Optional, list of glossary entries. - attr_reader :glossary - - # Optional, list of speaker names. - attr_reader :speakers - - # Optional, list of accents. - attr_reader :accents - - SUPPORTED_ACCENTS = { - :american_neutral => 'AmericanNeutral', - :american_southern => 'AmericanSouthern', - :asian => 'Asian', - :australian => 'Australian', - :british => 'British', - :indian => 'Indian', - :other => 'Other', - :unknown => 'Unknown' - } - - def validate_glossary - if glossary - if glossary.length > GLOSSARY_ENTRIES_LIMIT - raise(ArgumentError, "Glossary must not exceed #{GLOSSARY_ENTRIES_LIMIT} entries") - end - glossary.each { |term| - if term.length > GLOSSARY_ENTRY_LENGTH_LIMIT - raise(ArgumentError, "Glossary entries cannot exceed #{GLOSSARY_ENTRY_LENGTH_LIMIT} characters") - end - } - end - end - - def validate_speakers - if speakers - if speakers.length > SPEAKER_ENTRIES_LIMIT - raise(ArgumentError, "Speaker list must not exceed #{SPEAKER_ENTRIES_LIMIT} entries") - end - speakers.each { |speaker| - if speaker.length > SPEAKER_ENTRY_LENGTH_LIMIT - raise(ArgumentError, "Speaker name cannot exceed #{SPEAKER_ENTRY_LENGTH_LIMIT} characters") - end - } - end - end - - def validate_accents - if accents - if accents.length > SUPPORTED_ACCENTS.length - raise(ArgumentError, "Length of accents list cannot exceed number of supported accents.") - end - if accents.any?{ |accent| !Rev::Input::SUPPORTED_ACCENTS.has_value?(accent) } - raise(ArgumentError, 'Unsupported accent provided') - end - end - end - end - - # Notification Info. Optionally you may request that an HTTP post be made to a url of your choice when the order enters - # a new status (eg being transcribed or reviewed) and when it is complete. - class Notification < ApiSerializable - attr_reader :url, :level - - # Notification levels - LEVELS = { - :detailed => 'Detailed', - :final_only => 'FinalOnly' - } - - # @param url [String] The url for notifications. Mandatory if the notifications element is used. Updates will be posted to this URL - # @param level [String] Optional, specifies which notifications are sent: - # - :detailed - a notification is sent whenever the order is in a new status or has a new comment - # - :final_only - (the default), notification is sent only when the order is complete - def initialize(url, level = nil) - @url = url - @level = level ? level : LEVELS[:final_only] - end - end -end +require 'rev-api/api_serializable' + +module Rev + # OrderRequest is used for constructing order 'spec' in consumer code and passing it into. + # It consists of three main elements: :payment, :transcription_options and :notification. + # You can also supply reference number and whether standard turnaround time is not required + # + # @note https://www.rev.com/api/ordersposttranscription, https://www.rev.com/api/orderspostcaption + + GLOSSARY_ENTRIES_LIMIT = 1000 + GLOSSARY_ENTRY_LENGTH_LIMIT = 255 + SPEAKER_ENTRIES_LIMIT = 100 + SPEAKER_ENTRY_LENGTH_LIMIT = 15 + + class OrderRequest < ApiSerializable + # see {Rev::Payment} + attr_reader :payment + + # see {Rev::TranscriptionOptions} + attr_reader :transcription_options + + # see {Rev::CaptionOptions} + attr_reader :caption_options + + # see {Rev::Notification} + attr_reader :notification + + # a reference number for the order meaningful for the client (optional) + attr_reader :client_ref + + # a boolean flag specifying whether normal turnaround time is not required, defaults to false (optional) + attr_reader :non_standard_tat_guarantee + + # @param payment [Payment] payment info + # @param fields [Hash] of fields to initialize instance. See instance attributes for available fields. + # @deprecated payment always defaults to :account_balance + def self.new_with_payment(payment, fields = {}) + fields = { :non_standard_tat_guarantee => false }.merge(fields) + super fields + @payment = payment + end + + # @param fields [Hash] of fields to initialize instance. See instance attributes for available fields. + def initialize(fields = {}) + fields = { :non_standard_tat_guarantee => false }.merge(fields) + @payment = Rev::Payment.with_account_balance + super fields + end + end + + # Payment Info. Payment can only be done by debiting the user's account balance. + # @deprecated setting the payment is no longer necessary. All orders now default to :account_balance + class Payment < ApiSerializable + attr_accessor :type + + # use to correctly set payment type + TYPES = { + :account_balance => 'AccountBalance' + } + + CC_ON_FILE_ID = 1 + + # @param type [String] payment method + def initialize(type) + @type = type + end + + class << self + def with_account_balance() + Payment::new(TYPES[:account_balance]) + end + end + end + + # Billing address + class BillingAddress < ApiSerializable + attr_reader :street, :street2, :city, :state, :zip, :country_alpha2 + end + + # Superclass for the business-line options that handles capture and common validation of inputs. + class InputOptions < ApiSerializable + # Mandatory, contains list of inputs. Must have at least one element. + attr_reader :inputs + + # @param inputs [Array] list of inputs + # @param info [Hash] of fields to initialize instance. + def initialize(inputs, info = {}) + super info + raise(ArgumentError, "inputs must have at least one element") unless validate_inputs(inputs) + @inputs = inputs + end + + private + + def validate_inputs(inputs) + !inputs.nil? && inputs.length > 0 + end + end + + # Transcription options. This section contains the input media that must be transferred to our servers + # using a POST to /inputs, and are referenced using the URIs returned by that call. We also support external links. + # @see https://www.rev.com/api/ordersposttranscription + class TranscriptionOptions < InputOptions + # Optional, array of file formats the captions should be delivered as. + # default is MS Word + attr_reader :output_file_formats + + # Optional, should we transcribe the provided files verbatim? If true, + # all filler words (i.e. umm, huh) will be included. + attr_reader :verbatim + + # Optional, should we include timestamps? + attr_reader :timestamps + + # All supported output file formats + OUTPUT_FILE_FORMATS = { + :ms_word => 'MS Word', + :json => 'JSON', + :text => 'Text', + :pdf => 'Pdf' + } + + # @param inputs [Array] list of inputs + # @param info [Hash] of fields to initialize instance. May contain: + # - :output_file_formats => String[] + # - :verbatim => true/false + # - :timestamps => true/false + def initialize(inputs, info = {}) + super inputs, info + raise(ArgumentError, "invalid format(s)") unless validate_output_formats(info[:output_file_formats]) + options_validation(inputs) + end + + private + + def validate_output_formats(formats) + formats.nil? || formats.select{|f| !OUTPUT_FILE_FORMATS.has_value?(f) }.empty? + end + + def options_validation(inputs) + inputs.each { |input| + input.validate_glossary + input.validate_speakers + input.validate_accents + } + end + end + + # Caption options. This section contains the input media that must be transferred to our servers + # using a POST to /inputs, and are referenced using the URIs returned by that call. We also support external links. + # @see https://www.rev.com/api/orderspostcaption + class CaptionOptions < InputOptions + # Array of file formats the captions should be delivered as. (Optional, default is SubRip) + attr_reader :output_file_formats + + # Optional, Array of language codes to request foreign language subtitles + attr_reader :subtitle_languages + + # All supported output file formats + OUTPUT_FILE_FORMATS = { + :subrip => 'SubRip', + :scc => 'Scc', + :mcc => 'Mcc', + :ttml => 'Ttml', + :qttext => 'QTtext', + :transcript => 'Transcript', + :webvtt => 'WebVtt', + :dfxp => 'Dfxp', + :cheetahcap => 'CheetahCap' + } + + # @param inputs [Array] list of inputs + # @param info [Hash] of fields to initialize instance. May contain: + # - :output_file_formats => String[] + # - :subtitle_languages => String[] + # @see For language codes refer to http://www.loc.gov/standards/iso639-2/php/code_list.php + def initialize(inputs, info = {}) + super(inputs, info) + raise(ArgumentError, "invalid format(s)") unless validate_output_formats(info[:output_file_formats]) + options_validation(inputs) + end + + private + + def validate_output_formats(formats) + formats.nil? || formats.select{|f| !OUTPUT_FILE_FORMATS.has_value?(f) }.empty? + end + + def options_validation(inputs) + inputs.each { |input| + input.validate_glossary + input.validate_speakers + } + end + end + + # Input for order (aka source file) + class Input < ApiSerializable + # Length of audio in seconds (mandatory in case of inability to determine it automatically). + # Used within {Rev::OrderRequest::TranscriptionInfo} + attr_reader :audio_length_seconds + + # Length of video in seconds (mandatory in case of inability to determine it automatically). + # Used within {Rev::OrderRequest::CaptionInfo} + attr_reader :video_length_seconds + + # Mandatory, URI of the media, as returned from the call to POST /inputs. + # :external_link might substitute :uri for Transcription or Caption. + attr_reader :uri + + # External URL, if sources wasn't POSTed as input (YouTube, Vimeo, Dropbox, etc) + attr_reader :external_link + + # Optional, list of glossary entries. + attr_reader :glossary + + # Optional, list of speaker names. + attr_reader :speakers + + # Optional, list of accents. + attr_reader :accents + + SUPPORTED_ACCENTS = { + :american_neutral => 'AmericanNeutral', + :american_southern => 'AmericanSouthern', + :asian => 'Asian', + :australian => 'Australian', + :british => 'British', + :indian => 'Indian', + :other => 'Other', + :unknown => 'Unknown' + } + + def validate_glossary + if glossary + if glossary.length > GLOSSARY_ENTRIES_LIMIT + raise(ArgumentError, "Glossary must not exceed #{GLOSSARY_ENTRIES_LIMIT} entries") + end + glossary.each { |term| + if term.length > GLOSSARY_ENTRY_LENGTH_LIMIT + raise(ArgumentError, "Glossary entries cannot exceed #{GLOSSARY_ENTRY_LENGTH_LIMIT} characters") + end + } + end + end + + def validate_speakers + if speakers + if speakers.length > SPEAKER_ENTRIES_LIMIT + raise(ArgumentError, "Speaker list must not exceed #{SPEAKER_ENTRIES_LIMIT} entries") + end + speakers.each { |speaker| + if speaker.length > SPEAKER_ENTRY_LENGTH_LIMIT + raise(ArgumentError, "Speaker name cannot exceed #{SPEAKER_ENTRY_LENGTH_LIMIT} characters") + end + } + end + end + + def validate_accents + if accents + if accents.length > SUPPORTED_ACCENTS.length + raise(ArgumentError, "Length of accents list cannot exceed number of supported accents.") + end + if accents.any?{ |accent| !Rev::Input::SUPPORTED_ACCENTS.has_value?(accent) } + raise(ArgumentError, 'Unsupported accent provided') + end + end + end + end + + # Notification Info. Optionally you may request that an HTTP post be made to a url of your choice when the order enters + # a new status (eg being transcribed or reviewed) and when it is complete. + class Notification < ApiSerializable + attr_reader :url, :level + + # Notification levels + LEVELS = { + :detailed => 'Detailed', + :final_only => 'FinalOnly' + } + + # @param url [String] The url for notifications. Mandatory if the notifications element is used. Updates will be posted to this URL + # @param level [String] Optional, specifies which notifications are sent: + # - :detailed - a notification is sent whenever the order is in a new status or has a new comment + # - :final_only - (the default), notification is sent only when the order is complete + def initialize(url, level = nil) + @url = url + @level = level ? level : LEVELS[:final_only] + end + end +end