Class: Mindee::V1::Client
- Defined in:
- lib/mindee/v1/client.rb,
sig/mindee/v1/client.rbs
Overview
Mindee API Client. See: https://developers.mindee.com/docs
Instance Method Summary collapse
-
#create_endpoint(endpoint_name: '', account_name: '', version: '') ⇒ Mindee::V1::HTTP::Endpoint
Creates a custom endpoint with the given values.
-
#enqueue(input_source, product_class, endpoint: nil, options: {}) ⇒ Mindee::V1::Parsing::Common::ApiResponse
Enqueue a document for async parsing.
-
#enqueue_and_parse(input_source, product_class, endpoint, options, cancellation_token = nil) ⇒ Mindee::V1::Parsing::Common::ApiResponse
rubocop:disable Metrics/CyclomaticComplexity Enqueue a document for async parsing and automatically try to retrieve it.
-
#execute_workflow(input_source, workflow_id, options: {}) ⇒ Mindee::V1::Parsing::Common::WorkflowResponse
rubocop:enable Metrics/CyclomaticComplexity Sends a document to a workflow.
- #fix_account_name(account_name) ⇒ String
- #fix_endpoint_name(product_class, endpoint_name) ⇒ String
- #fix_version(product_class, version) ⇒ String
-
#initialize(api_key: '') ⇒ Client
constructor
A new instance of Client.
-
#initialize_endpoint(product_class, endpoint_name: '', account_name: '', version: '') ⇒ Mindee::V1::HTTP::Endpoint
Creates an endpoint with the given values.
-
#load_prediction(product_class, local_response) ⇒ Mindee::V1::Parsing::Common::ApiResponse
Load a prediction.
- #logger ⇒ Logging
-
#normalize_parse_options(options) ⇒ ParseOptions
If needed, converts the parsing options provided as a hash into a proper ParseOptions object.
-
#parse(input_source, product_class, endpoint: nil, options: {}, enqueue: true) ⇒ Mindee::V1::Parsing::Common::ApiResponse
Enqueue a document for parsing and automatically try to retrieve it if needed.
-
#parse_queued(job_id, product_class, endpoint: nil) ⇒ Mindee::V1::Parsing::Common::ApiResponse
Parses a queued document.
-
#parse_sync(input_source, product_class, endpoint, options) ⇒ Mindee::V1::Parsing::Common::ApiResponse
Call prediction API on a document and parse the results.
-
#process_pdf_if_required(input_source, opts) ⇒ void
Processes a PDF if parameters were provided.
-
#source_from_b64string(base64_string, filename, repair_pdf: false) ⇒ Mindee::Input::Source::Base64InputSource
Load a document from a base64 encoded string.
-
#source_from_bytes(input_bytes, filename, repair_pdf: false) ⇒ Mindee::Input::Source::BytesInputSource
Load a document from raw bytes.
-
#source_from_file(input_file, filename, repair_pdf: false) ⇒ Mindee::Input::Source::FileInputSource
Load a document from a normal Ruby
File. -
#source_from_path(input_path, repair_pdf: false) ⇒ Mindee::Input::Source::PathInputSource
Load a document from an absolute path, as a string.
-
#source_from_url(url) ⇒ Mindee::Input::Source::URLInputSource
Load a document from a secure remote source (HTTPS).
-
#validate_async_params(initial_delay_sec, delay_sec, max_retries) ⇒ void
Validates the parameters for async auto-polling.
Constructor Details
#initialize(api_key: '') ⇒ Client
Returns a new instance of Client.
94 95 96 |
# File 'lib/mindee/v1/client.rb', line 94 def initialize(api_key: '') @api_key = api_key end |
Instance Method Details
#create_endpoint(endpoint_name: '', account_name: '', version: '') ⇒ Mindee::V1::HTTP::Endpoint
Creates a custom endpoint with the given values. Do not set for standard (off the shelf) endpoints.
405 406 407 408 409 410 411 412 |
# File 'lib/mindee/v1/client.rb', line 405 def create_endpoint(endpoint_name: '', account_name: '', version: '') initialize_endpoint( Mindee::V1::Product::Universal::Universal, endpoint_name: endpoint_name, account_name: account_name, version: version ) end |
#enqueue(input_source, product_class, endpoint: nil, options: {}) ⇒ Mindee::V1::Parsing::Common::ApiResponse
Enqueue a document for async parsing
195 196 197 198 199 200 201 202 203 204 205 |
# File 'lib/mindee/v1/client.rb', line 195 def enqueue(input_source, product_class, endpoint: nil, options: {}) opts = () endpoint ||= initialize_endpoint(product_class) logger.debug("Enqueueing document as '#{endpoint.url_root}'") prediction, raw_http = endpoint.predict_async( input_source, opts ) Mindee::V1::Parsing::Common::ApiResponse.new(product_class, prediction, raw_http) end |
#enqueue_and_parse(input_source, product_class, endpoint, options, cancellation_token = nil) ⇒ Mindee::V1::Parsing::Common::ApiResponse
rubocop:disable Metrics/CyclomaticComplexity Enqueue a document for async parsing and automatically try to retrieve it
rubocop:disable-next Metrics/PerceivedComplexity
254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 |
# File 'lib/mindee/v1/client.rb', line 254 def enqueue_and_parse( input_source, product_class, endpoint, , cancellation_token = nil ) validate_async_params(.initial_delay_sec, .delay_sec, .max_retries) enqueue_res = enqueue(input_source, product_class, endpoint: endpoint, options: ) job = enqueue_res.job or raise Error::MindeeAPIError, 'Expected job to be present' job_id = job.id raise Mindee::Error::MindeeError, 'Enqueueing of the document was canceled.' if cancellation_token&.canceled? sleep(.initial_delay_sec) polling_attempts = 1 logger.debug("Successfully enqueued document with job id: '#{job_id}'") queue_res = parse_queued(job_id, product_class, endpoint: endpoint) queue_res_job = queue_res.job or raise Error::MindeeAPIError, 'Expected job to be present' valid_statuses = [ Mindee::V1::Parsing::Common::JobStatus::WAITING, Mindee::V1::Parsing::Common::JobStatus::PROCESSING, ] # @type var valid_statuses: Array[(:waiting | :processing | :completed | :failed)] while valid_statuses.include?(queue_res_job.status) && polling_attempts < .max_retries logger.debug("Polling server for parsing result with job id: '#{job_id}'. Attempt #{polling_attempts}") raise Mindee::Error::MindeeError, 'Enqueueing of the document was canceled.' if cancellation_token&.canceled? sleep(.delay_sec) queue_res = parse_queued(job_id, product_class, endpoint: endpoint) queue_res_job = queue_res.job or raise Error::MindeeAPIError, 'Expected job to be present' polling_attempts += 1 end if queue_res_job.status != Mindee::V1::Parsing::Common::JobStatus::COMPLETED elapsed = .initial_delay_sec + (polling_attempts * .delay_sec.to_f) raise Error::MindeeAPIError, "Asynchronous parsing request timed out after #{elapsed} seconds (#{polling_attempts} tries)" end queue_res end |
#execute_workflow(input_source, workflow_id, options: {}) ⇒ Mindee::V1::Parsing::Common::WorkflowResponse
rubocop:enable Metrics/CyclomaticComplexity Sends a document to a workflow.
Accepts options either as a Hash or as a WorkflowOptions struct.
requiring authentication.
-
page_options[Hash, nil] Page cutting/merge options:-
:page_indexesZero-based list of page indexes.-
:operationOperation to apply on the document, given the `page_indexes specified::KEEP_ONLY- keep only the specified pages, and remove all others.:REMOVE- remove the specified pages, and keep all others.
-
:on_min_pagesApply the operation only if document has at least this many pages.
-
319 320 321 322 323 324 325 326 327 328 329 330 331 332 333 334 |
# File 'lib/mindee/v1/client.rb', line 319 def execute_workflow(input_source, workflow_id, options: {}) opts = .is_a?(WorkflowOptions) ? : WorkflowOptions.new(params: ) if opts.respond_to?(:page_options) && input_source.is_a?(Input::Source::LocalInputSource) process_pdf_if_required(input_source, opts) end workflow_endpoint = V1::HTTP::WorkflowEndpoint.new(workflow_id, api_key: @api_key.to_s) logger.debug("Sending document to workflow '#{workflow_id}'") prediction, raw_http = workflow_endpoint.execute_workflow( input_source, opts ) Mindee::V1::Parsing::Common::WorkflowResponse.new(V1::Product::Universal::Universal, prediction, raw_http) end |
#fix_account_name(account_name) ⇒ String
461 462 463 464 465 466 467 468 |
# File 'lib/mindee/v1/client.rb', line 461 def fix_account_name(account_name) if account_name.nil? || account_name.empty? logger.info("No account name provided, #{OTS_OWNER} will be used by default.") return OTS_OWNER end account_name end |
#fix_endpoint_name(product_class, endpoint_name) ⇒ String
457 458 459 |
# File 'lib/mindee/v1/client.rb', line 457 def fix_endpoint_name(product_class, endpoint_name) endpoint_name.nil? || endpoint_name.empty? ? product_class.endpoint_name.to_s : endpoint_name.to_s end |
#fix_version(product_class, version) ⇒ String
470 471 472 473 474 475 476 477 478 |
# File 'lib/mindee/v1/client.rb', line 470 def fix_version(product_class, version) return version unless version.nil? || version.empty? if product_class.endpoint_version.nil? || product_class.endpoint_version.to_s.empty? logger.debug('No version provided for a custom build, will attempt to poll version 1 by default.') return '1' end product_class.endpoint_version || '' end |
#initialize_endpoint(product_class, endpoint_name: '', account_name: '', version: '') ⇒ Mindee::V1::HTTP::Endpoint
Creates an endpoint with the given values. Raises an error if the endpoint is invalid.
445 446 447 448 449 450 451 452 453 454 455 |
# File 'lib/mindee/v1/client.rb', line 445 def initialize_endpoint(product_class, endpoint_name: '', account_name: '', version: '') if (endpoint_name.nil? || endpoint_name.empty?) && product_class == Mindee::V1::Product::Universal::Universal raise Mindee::Error::MindeeConfigurationError, 'Missing argument endpoint_name when using custom class' end endpoint_name = fix_endpoint_name(product_class, endpoint_name) account_name = fix_account_name(account_name) version = fix_version(product_class, version) V1::HTTP::Endpoint.new(account_name, endpoint_name, version, api_key: @api_key.to_s) end |
#load_prediction(product_class, local_response) ⇒ Mindee::V1::Parsing::Common::ApiResponse
Load a prediction.
341 342 343 344 345 346 347 348 349 350 |
# File 'lib/mindee/v1/client.rb', line 341 def load_prediction(product_class, local_response) raise Error::MindeeAPIError, 'Expected LocalResponse to not be nil.' if local_response.nil? response_hash = local_response.as_hash || {} raise Error::MindeeAPIError, 'Expected LocalResponse#as_hash to return a hash.' if response_hash.nil? Mindee::V1::Parsing::Common::ApiResponse.new(product_class, response_hash, response_hash.to_json) rescue KeyError, Error::MindeeAPIError raise Error::MindeeInputError, 'No prediction found in local response.' end |
#normalize_parse_options(options) ⇒ ParseOptions
If needed, converts the parsing options provided as a hash into a proper ParseOptions object.
483 484 485 486 487 |
# File 'lib/mindee/v1/client.rb', line 483 def () return if .is_a?(ParseOptions) ParseOptions.new(params: ) end |
#parse(input_source, product_class, endpoint: nil, options: {}, enqueue: true) ⇒ Mindee::V1::Parsing::Common::ApiResponse
Enqueue a document for parsing and automatically try to retrieve it if needed.
Accepts options either as a Hash or as a ParseOptions struct.
125 126 127 128 129 130 131 132 133 134 135 |
# File 'lib/mindee/v1/client.rb', line 125 def parse(input_source, product_class, endpoint: nil, options: {}, enqueue: true) opts = () process_pdf_if_required(input_source, opts) if input_source.is_a?(Input::Source::LocalInputSource) endpoint ||= initialize_endpoint(product_class) if enqueue && product_class.has_async enqueue_and_parse(input_source, product_class, endpoint, opts) else parse_sync(input_source, product_class, endpoint, opts) end end |
#parse_queued(job_id, product_class, endpoint: nil) ⇒ Mindee::V1::Parsing::Common::ApiResponse
Parses a queued document
Doesn't need to be set in the case of OTS APIs.
215 216 217 218 219 220 |
# File 'lib/mindee/v1/client.rb', line 215 def parse_queued(job_id, product_class, endpoint: nil) endpoint = initialize_endpoint(product_class) if endpoint.nil? logger.debug("Fetching queued document as '#{endpoint.url_root}'") prediction, raw_http = endpoint.parse_async(job_id) Mindee::V1::Parsing::Common::ApiResponse.new(product_class, prediction, raw_http) end |
#parse_sync(input_source, product_class, endpoint, options) ⇒ Mindee::V1::Parsing::Common::ApiResponse
Call prediction API on a document and parse the results.
158 159 160 161 162 163 164 165 166 167 |
# File 'lib/mindee/v1/client.rb', line 158 def parse_sync(input_source, product_class, endpoint, ) logger.debug("Parsing document as '#{endpoint.url_root}'") prediction, raw_http = endpoint.predict( input_source, ) Mindee::V1::Parsing::Common::ApiResponse.new(product_class, prediction, raw_http) end |
#process_pdf_if_required(input_source, opts) ⇒ void
This method returns an undefined value.
Processes a PDF if parameters were provided.
492 493 494 495 496 497 498 |
# File 'lib/mindee/v1/client.rb', line 492 def process_pdf_if_required(input_source, opts) return unless input_source.is_a?(Mindee::Input::Source::LocalInputSource) && opts..on_min_pages && input_source.pdf? input_source.process_pdf(opts.) end |
#source_from_b64string(base64_string, filename, repair_pdf: false) ⇒ Mindee::Input::Source::Base64InputSource
Load a document from a base64 encoded string.
374 375 376 |
# File 'lib/mindee/v1/client.rb', line 374 def source_from_b64string(base64_string, filename, repair_pdf: false) Input::Source::Base64InputSource.new(base64_string, filename, repair_pdf: repair_pdf) end |
#source_from_bytes(input_bytes, filename, repair_pdf: false) ⇒ Mindee::Input::Source::BytesInputSource
Load a document from raw bytes.
365 366 367 |
# File 'lib/mindee/v1/client.rb', line 365 def source_from_bytes(input_bytes, filename, repair_pdf: false) Input::Source::BytesInputSource.new(input_bytes, filename, repair_pdf: repair_pdf) end |
#source_from_file(input_file, filename, repair_pdf: false) ⇒ Mindee::Input::Source::FileInputSource
Load a document from a normal Ruby File.
383 384 385 |
# File 'lib/mindee/v1/client.rb', line 383 def source_from_file(input_file, filename, repair_pdf: false) Input::Source::FileInputSource.new(input_file, filename, repair_pdf: repair_pdf) end |
#source_from_path(input_path, repair_pdf: false) ⇒ Mindee::Input::Source::PathInputSource
Load a document from an absolute path, as a string.
356 357 358 |
# File 'lib/mindee/v1/client.rb', line 356 def source_from_path(input_path, repair_pdf: false) Input::Source::PathInputSource.new(input_path, repair_pdf: repair_pdf) end |
#source_from_url(url) ⇒ Mindee::Input::Source::URLInputSource
Load a document from a secure remote source (HTTPS).
390 391 392 |
# File 'lib/mindee/v1/client.rb', line 390 def source_from_url(url) Input::Source::URLInputSource.new(url) end |
#validate_async_params(initial_delay_sec, delay_sec, max_retries) ⇒ void
This method returns an undefined value.
Validates the parameters for async auto-polling
418 419 420 421 422 423 424 425 426 427 428 429 430 431 432 |
# File 'lib/mindee/v1/client.rb', line 418 def validate_async_params(initial_delay_sec, delay_sec, max_retries) min_delay_sec = 1 min_initial_delay_sec = 1 min_retries = 2 if delay_sec < min_delay_sec raise ArgumentError, "Cannot set auto-poll delay to less than #{min_delay_sec} second(s)" end if initial_delay_sec < min_initial_delay_sec raise ArgumentError, "Cannot set initial parsing delay to less than #{min_initial_delay_sec} second(s)" end raise ArgumentError, "Cannot set auto-poll retries to less than #{min_retries}" if max_retries < min_retries end |