Class: CopyTunerClient::Cache

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

Overview

Manages synchronization of copy between I18nBackend and Client. Acts like a Hash. Applications using the client will not need to interact with this class directly.

Responsible for locking down access to data used by both threads.

Instance Attribute Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(client, options) ⇒ Cache

Usually instantiated when CopyTunerClient::Configuration#apply is invoked.

Parameters:

  • client (Client)

    the client used to fetch and upload data

  • options (Hash)

Options Hash (options):

  • :logger (Logger)

    where errors should be logged



15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
# File 'lib/copy_tuner_client/cache.rb', line 15

def initialize(client, options)
  @client = client
  @logger = options[:logger]
  @mutex = Mutex.new
  @exclude_key_regexp = options[:exclude_key_regexp]
  @upload_disabled = options[:upload_disabled]
  @ignored_keys = options.fetch(:ignored_keys, [])
  @ignored_key_handler = options.fetch(:ignored_key_handler, -> (e) { raise e })
  @locales = Array(options[:locales]).map(&:to_s)
  # mutable states
  @blurbs = {}
  @blank_keys = Set.new
  @queued = {}
  @started = false
  @downloaded = false
end

Instance Attribute Details

#blurbsObject (readonly)

Returns the value of attribute blurbs.



125
126
127
# File 'lib/copy_tuner_client/cache.rb', line 125

def blurbs
  @blurbs
end

#last_downloaded_atObject (readonly)

Returns the value of attribute last_downloaded_at.



125
126
127
# File 'lib/copy_tuner_client/cache.rb', line 125

def last_downloaded_at
  @last_downloaded_at
end

#last_uploaded_atObject (readonly)

Returns the value of attribute last_uploaded_at.



125
126
127
# File 'lib/copy_tuner_client/cache.rb', line 125

def last_uploaded_at
  @last_uploaded_at
end

#queuedObject (readonly)

Returns the value of attribute queued.



125
126
127
# File 'lib/copy_tuner_client/cache.rb', line 125

def queued
  @queued
end

Instance Method Details

#[](key) ⇒ String

Returns content for the given blurb.

Parameters:

  • key (String)

    the key of the desired blurb

Returns:

  • (String)

    the contents of the blurb



35
36
37
# File 'lib/copy_tuner_client/cache.rb', line 35

def [](key)
  lock { @blurbs[key] }
end

#[]=(key, value) ⇒ Object

Sets content for the given blurb. The content will be pushed to the server on the next flush.

Parameters:

  • key (String)

    the key of the blurb to update

  • value (String)

    the new contents of the blurb



43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
# File 'lib/copy_tuner_client/cache.rb', line 43

def []=(key, value)
  return if @exclude_key_regexp && key.match?(@exclude_key_regexp)
  return unless key.include?('.')
  return if @locales.present? && !@locales.member?(key.split('.').first)
  return if @upload_disabled

  # NOTE: config/locales以下のファイルに除外キーが残っていた場合の対応
  key_without_locale = key.split('.')[1..].join('.')
  if @ignored_keys.include?(key_without_locale)
    @ignored_key_handler.call(IgnoredKey.new("Ignored key: #{key_without_locale}"))
  end

  lock do
    return if @blank_keys.member?(key) || @blurbs.key?(key)

    @queued[key] = value
  end
end

#downloadObject



99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
# File 'lib/copy_tuner_client/cache.rb', line 99

def download
  @started = true

  res = client.download do |downloaded_blurbs|
    blank_blurbs, blurbs = downloaded_blurbs.partition { |_key, value| value == '' }
    lock do
      @blank_keys = Set.new(blank_blurbs.to_h.keys)
      @blurbs = blurbs.to_h
    end
  end

  @last_downloaded_at = Time.now.utc

  res
rescue ConnectionError => e
  logger.error e.message
ensure
  @downloaded = true
end

#exportString

Yaml representation of all blurbs

Returns:

  • (String)

    yaml



70
71
72
# File 'lib/copy_tuner_client/cache.rb', line 70

def export
  lock { @blurbs.present? ? DottedHash.to_h(@blurbs).to_yaml : nil }
end

#flushObject



87
88
89
90
91
92
93
94
95
96
97
# File 'lib/copy_tuner_client/cache.rb', line 87

def flush
  res = with_queued_changes do |queued|
    client.upload queued
  end

  @last_uploaded_at = Time.now.utc

  res
rescue ConnectionError => e
  logger.error e.message
end

#inspectObject



127
128
129
# File 'lib/copy_tuner_client/cache.rb', line 127

def inspect
  "#<CopyTunerClient::Cache:#{object_id}>"
end

#keysArray<String>

Keys for all blurbs stored on the server.

Returns:

  • (Array<String>)

    keys



64
65
66
# File 'lib/copy_tuner_client/cache.rb', line 64

def keys
  lock { @blurbs.keys }
end

#pending?Boolean

Returns:

  • (Boolean)


131
132
133
# File 'lib/copy_tuner_client/cache.rb', line 131

def pending?
  @started && !@downloaded
end

#syncObject

Downloads and then flushes



120
121
122
123
# File 'lib/copy_tuner_client/cache.rb', line 120

def sync
  download
  flush
end

#wait_for_downloadObject

Waits until the first download has finished.



75
76
77
78
79
80
81
82
83
84
85
# File 'lib/copy_tuner_client/cache.rb', line 75

def wait_for_download
  return unless pending?

  logger.info 'Waiting for first download'

  if logger.respond_to? :flush
    logger.flush
  end

  sleep 0.1 while pending?
end