class Toptranslation::Connection

Attributes

access_token[RW]
upload_token[RW]
verbose[RW]

Public Class Methods

new(options = {}) click to toggle source
# File lib/toptranslation/connection.rb, line 5
def initialize(options = {})
  @base_url = options[:base_url] || 'https://api.toptranslation.com'
  @files_url = options[:files_url] || 'https://files.toptranslation.com'
  @access_token = options[:access_token]
  @verbose = options[:verbose] || false
  sign_in!(options) if @access_token.nil? && options.values_at(:email, :password).all?
end

Public Instance Methods

download(url, path, &block) click to toggle source
# File lib/toptranslation/connection.rb, line 25
def download(url, path, &block)
  puts "# downloading #{url}" if @verbose
  uri = URI.parse(url)
  download_uri(uri, path, &block)
end
get(path, options = {}) click to toggle source
# File lib/toptranslation/connection.rb, line 13
def get(path, options = {})
  transform_response(request(:get, path, options), options)
end
patch(path, options = {}) click to toggle source
# File lib/toptranslation/connection.rb, line 21
def patch(path, options = {})
  transform_response(request(:patch, path, options), options)
end
post(path, options = {}) click to toggle source
# File lib/toptranslation/connection.rb, line 17
def post(path, options = {})
  transform_response(request(:post, path, options), options)
end
sign_in!(options) click to toggle source
# File lib/toptranslation/connection.rb, line 37
def sign_in!(options)
  return if @access_token

  sign_in_options = {
    email: options[:email],
    password: options[:password],
    application_id: 'pollux'
  }.merge(options)

  @access_token = post('/auth/sign_in', sign_in_options.merge(version: 2))['access_token']

  puts "# Requested access token #{@access_token}" if @verbose

  @access_token
end
upload(filepath, type, &block) click to toggle source
# File lib/toptranslation/connection.rb, line 31
def upload(filepath, type, &block)
  uri = URI.parse("#{@files_url}/documents")
  file = File.new(filepath)
  upload_file(file, type, uri, &block)
end

Private Instance Methods

auth_params() click to toggle source
# File lib/toptranslation/connection.rb, line 101
def auth_params
  { access_token: @access_token }
end
download_content_length(http, uri) click to toggle source
# File lib/toptranslation/connection.rb, line 105
def download_content_length(http, uri)
  sleep_time = 0.5
  attempts = 0
  total = nil

  loop do
    raise 'File not available' if attempts >= 10

    head_response = http.request_head(uri.request_uri)
    total = head_response['content-length'].to_i
    break if head_response.code == '200'

    attempts += 1
    sleep sleep_time
    sleep_time += sleep_time * 0.5
  end

  total
end
download_uri(uri, path) { |nil, total| ... } click to toggle source
# File lib/toptranslation/connection.rb, line 125
def download_uri(uri, path)
  Net::HTTP.start(uri.host, uri.port, use_ssl: uri.scheme == 'https') do |http|
    total = download_content_length(http, uri)
    yield nil, total if block_given?

    FileUtils.mkpath(File.dirname(path))
    file = File.open(path, 'w')
    http.request_get(uri.request_uri) do |response|
      response.read_body do |data|
        file.write(data)
        yield data.length, total if block_given?
      end
    end
    file
  end
end
prepare_request_options(options, method) click to toggle source
# File lib/toptranslation/connection.rb, line 90
def prepare_request_options(options, method)
  request_options = options.dup
  request_options.delete(:version)
  if [:post, :patch].include? method
    request_options.merge(auth_params)
  else
    params = options[:params] || {}
    request_options.merge(params: params.merge(auth_params))
  end
end
request(method, path, options) click to toggle source
# File lib/toptranslation/connection.rb, line 59
def request(method, path, options)
  url = "#{@base_url}/v#{version(options)}#{path}"
  puts "# #{method}-request #{url}" if @verbose
  puts "options: #{prepare_request_options(options, method)}" if @verbose
  RestClient.send(method, url, prepare_request_options(options, method))
rescue RestClient::ExceptionWithResponse => e
  puts e.response if @verbose
  raise e
end
request_upload_token() click to toggle source
# File lib/toptranslation/connection.rb, line 73
def request_upload_token
  puts '# Requesting upload-token' if @verbose
  token = post('/upload_tokens')['upload_token']
  puts "# Upload-token retrieved: #{token}" if @verbose
  token
end
transform_response(response, options) click to toggle source
# File lib/toptranslation/connection.rb, line 80
def transform_response(response, options)
  puts response if @verbose
  parsed = JSON.parse(response)
  if version(options) == 2
    parsed
  else
    parsed['data']
  end
end
upload_file(file, type, uri) { |upload_size| ... } click to toggle source
# File lib/toptranslation/connection.rb, line 142
def upload_file(file, type, uri)
  last_upload_size = 0

  response = Net::HTTP.start(uri.host, uri.port, use_ssl: uri.scheme == 'https') do |http|
    request = Net::HTTP::Post.new(uri)
    request.set_form({ 'file' => file, 'token' => upload_token, 'type' => type }, 'multipart/form-data')

    Net::HTTP::UploadProgress.new(request) do |progress|
      yield progress.upload_size - last_upload_size if block_given?
      last_upload_size = progress.upload_size
    end

    http.request(request)
  end

  transform_response(response.body, version: 0)
end
version(options) click to toggle source
# File lib/toptranslation/connection.rb, line 55
def version(options)
  options[:version] || 0
end