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.

Options Hash (options):

  • :logger (Logger)

    where errors should be logged



15
16
17
18
19
20
21
22
23
24
25
26
27
# 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]
  @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.



115
116
117
# File 'lib/copy_tuner_client/cache.rb', line 115

def blurbs
  @blurbs
end

#last_downloaded_atObject (readonly)

Returns the value of attribute last_downloaded_at.



115
116
117
# File 'lib/copy_tuner_client/cache.rb', line 115

def last_downloaded_at
  @last_downloaded_at
end

#last_uploaded_atObject (readonly)

Returns the value of attribute last_uploaded_at.



115
116
117
# File 'lib/copy_tuner_client/cache.rb', line 115

def last_uploaded_at
  @last_uploaded_at
end

#queuedObject (readonly)

Returns the value of attribute queued.



115
116
117
# File 'lib/copy_tuner_client/cache.rb', line 115

def queued
  @queued
end

Instance Method Details

#[](key) ⇒ String

Returns content for the given blurb.



32
33
34
# File 'lib/copy_tuner_client/cache.rb', line 32

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.



40
41
42
43
44
45
46
47
48
49
50
# File 'lib/copy_tuner_client/cache.rb', line 40

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)

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

    @queued[key] = value
  end
end

#downloadObject



89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
# File 'lib/copy_tuner_client/cache.rb', line 89

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



60
61
62
# File 'lib/copy_tuner_client/cache.rb', line 60

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

#flushObject



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

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



117
118
119
# File 'lib/copy_tuner_client/cache.rb', line 117

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

#keysArray<String>

Keys for all blurbs stored on the server.



54
55
56
# File 'lib/copy_tuner_client/cache.rb', line 54

def keys
  lock { @blurbs.keys }
end

#pending?Boolean



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

def pending?
  @started && !@downloaded
end

#syncObject

Downloads and then flushes



110
111
112
113
# File 'lib/copy_tuner_client/cache.rb', line 110

def sync
  download
  flush
end

#wait_for_downloadObject

Waits until the first download has finished.



65
66
67
68
69
70
71
72
73
74
75
# File 'lib/copy_tuner_client/cache.rb', line 65

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