Class: CopyTunerClient::Client

Inherits:
Object
  • Object
show all
Defined in:
lib/copy_tuner_client/client.rb

Overview

Communicates with the CopyTuner server. This class is used to actually download and upload blurbs, as well as issuing deploys.

A client is usually instantiated when CopyTunerClient::Configuration#apply is called, and the application will not need to interact with it directly.

Constant Summary collapse

HTTP_ERRORS =

These errors will be rescued when connecting CopyTuner.

[Timeout::Error, Errno::EINVAL, Errno::ECONNRESET, EOFError,
Net::HTTPBadResponse, Net::HTTPHeaderSyntaxError,
Net::ProtocolError, SocketError, OpenSSL::SSL::SSLError,
Errno::ECONNREFUSED]
USER_AGENT =
"copy_tuner_client #{CopyTunerClient::VERSION}"

Instance Method Summary collapse

Constructor Details

#initialize(options) ⇒ Client

Usually instantiated from CopyTunerClient::Configuration#apply. Copies options.

Parameters:

  • options (Hash)

Options Hash (options):

  • :api_key (String)

    API key of the project to connect to

  • :port (Fixnum)

    the port to connect to

  • :public (Boolean)

    whether to download draft or published content

  • :http_read_timeout (Fixnum)

    how long to wait before timing out when reading data from the socket

  • :http_open_timeout (Fixnum)

    how long to wait before timing out when opening the socket

  • :secure (Boolean)

    whether to use SSL

  • :logger (Logger)

    where to log transactions

  • :ca_file (String)

    path to root certificate file for ssl verification



31
32
33
34
35
36
37
38
39
40
41
42
# File 'lib/copy_tuner_client/client.rb', line 31

def initialize(options)
  @etag = nil
  @downloaded_blurbs = {}

  [:api_key, :host, :port, :public, :http_read_timeout,
    :http_open_timeout, :secure, :logger, :ca_file, :s3_host, :download_cache_dir].each do |option|
    instance_variable_set "@#{option}", options[option]
  end

  @download_cache_dir.mkpath
  load_cachedata(last_download_path)
end

Instance Method Details

#deployObject

Issues a deploy, marking all draft content as published for this project.

Raises:



90
91
92
93
94
95
96
# File 'lib/copy_tuner_client/client.rb', line 90

def deploy
  connect(host) do |http|
    response = http.post(uri('deploys'), '', 'User-Agent' => USER_AGENT)
    check response
    log 'Deployed'
  end
end

#download(cache_fallback: false) {|Hash| ... } ⇒ Object

Downloads all blurbs for the given api_key.

If the public option was set to true, this will use published blurbs. Otherwise, draft content is fetched.

The client tracks ETags between download requests, and will return without yielding anything if the server returns a not modified response.

Yields:

  • (Hash)

    downloaded blurbs

Raises:



54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
# File 'lib/copy_tuner_client/client.rb', line 54

def download(cache_fallback: false)
  connect(s3_host) do |http|
    request = Net::HTTP::Get.new(uri(download_resource))
    request['If-None-Match'] = @etag
    log 'Start downloading translations'
    t = Time.now
    response = http.request(request)
    t_ms = ((Time.now - t) * 1000).to_i
    downloaded = check(response)
    if downloaded
      # NOTE: Net::HTTPではgzipが透過的に扱われるため正確なファイルサイズや速度をログに出すのは難しい
      log "Downloaded translations (#{t_ms}ms)"
      @downloaded_blurbs = JSON.parse(response.body)
      @etag = response['ETag']
      last_download_path.write(JSON.pretty_generate(etag: @etag, downloaded_blurbs: @downloaded_blurbs))
    else
      log "No new translations (#{t_ms}ms)"
    end

    yield(@downloaded_blurbs) if downloaded || cache_fallback
  end
end

#upload(data) ⇒ Object

Uploads the given hash of blurbs as draft content.

Parameters:

  • data (Hash)

    the blurbs to upload

Raises:



80
81
82
83
84
85
86
# File 'lib/copy_tuner_client/client.rb', line 80

def upload(data)
  connect(host) do |http|
    response = http.post(uri('draft_blurbs'), data.to_json, 'Content-Type' => 'application/json', 'User-Agent' => USER_AGENT)
    check response
    log 'Uploaded missing translations'
  end
end