ifad/colore-client

View on GitHub
bin/colore-client

Summary

Maintainability
Test Coverage
#!/usr/bin/env ruby

require 'optparse'
require 'pathname'
require 'pp'

BASE=Pathname.new(__FILE__).realpath.parent.parent
$: << BASE + 'lib'

require 'colore-client'

base_uri = 'http://localhost:9240/'
backtrace = false
request = nil
app = nil
doc_id = nil
version = Colore::CURRENT
language = 'en'
actions = nil
title = nil
file = nil
output_file = nil
callback_url = nil
verbose = nil

REQUESTS = %w(
  ping
  create_document update_document update_title
  request_conversion delete_document
  delete_version get_document get_document_info
  convert
 )

OptionParser.new do |opts|
  opts.banner = 'Usage: colore_client -r {request} [opts]'
  opts.on( '-r', '--request NAME', REQUESTS, 'Request to perform' ) { |r| request = r }
  opts.on( '-u', '--base-uri', 'Base URI' ) { |u| base_uri = u }
  opts.on( '-a', '--app APP', 'Application name' ) { |a| app = a }
  opts.on( '-d', '--doc-id ID', 'Document id' ) { |d| doc_id = d }
  opts.on( '-v', '--version VERSION', 'Version id' ) { |v| version = v }
  opts.on( '-f', '--file FILE', 'File to upload/convert' ) { |f| file = f }
  opts.on( '-o', '--output-file FILE', 'File to write to' ) { |f| output_file = f }
  opts.on( '-m', '--actions x,y,z', Array, 'Conversion actions' ) { |f| actions = f }
  opts.on( '-l', '--language LANG', 'Language of document' ) { |l| language = l }
  opts.on( '-t', '--title TITLE', 'Document title' ) { |t| title = t }
  opts.on( '-c', '--callback-url URL', 'Callback URL for conversion callbacks' ) { |c| callback_url = c }
  opts.on( '-B', '--backtrace', 'Request backtrace on errors' ) { backtrace = true }
  opts.on( '-V', '--verbose', 'Log interactions' ) { verbose = true }
  opts.on( '-h', '--help', 'This message' ) { puts opts; exit 0 }
  opts.separator "Valid requests: #{REQUESTS.join ', '}"
end.parse!

logger = Logger.new( verbose ? STDOUT : nil )

client = Colore::Client.new base_uri: base_uri, app: app, backtrace: backtrace, logger: logger

begin
  resp = nil
  case request
    when 'ping'
      resp = client.ping
    when 'create_document'
      resp = client.create_document(
        doc_id: doc_id,
        title: title,
        filename: ( File.basename(file) if file ),
        content: ( File.read(file) if file ),
        actions: actions,
        callback_url: callback_url
      )
    when 'update_document'
      resp = client.update_document(
        doc_id: doc_id,
        filename: ( File.basename(file) if file ),
        content: ( File.read(file) if file ),
        actions: actions,
        callback_url: callback_url
      )
    when 'update_title'
      resp = client.update_document( doc_id: doc_id, title: title )
    when 'request_conversion'
      actions.each do |action|
        resp = client.request_conversion doc_id: doc_id, version: version, filename:File.basename(file), action: action, callback_url: callback_url
      end
    when 'delete_document'
      resp = client.delete_document doc_id: doc_id
    when 'delete_version'
      resp = client.delete_version doc_id: doc_id, version: version
    when 'get_document'
      resp = client.delete_document doc_id: doc_id, version: version, filename: filename
      if output_file
        File.open(output_file, "wb" ) { |f| f.write(resp) }
        resp = nil
      end
    when 'get_document_info'
      resp = client.get_document_info doc_id: doc_id
    when 'convert'
      resp = client.convert content: File.read(file), action: actions[0], language: language
      if output_file
        File.open(output_file, "wb" ) { |f| f.write(resp) }
        resp = nil
      end
    else
      raise "Unhandled request type: #{request}"
  end

  if resp.respond_to? :to_hash
    resp.respond_to? :to_hash
  else
    STDOUT.write resp
  end
  
rescue Colore::Errors::APIError => e
  puts "Received error from colore: #{e.http_code}, #{e.message}"
  pp e.rsp_backtrace if backtrace
end