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
# File 'lib/copy_tuner_client/cache.rb', line 15

def initialize(client, options)
  @blurbs = {}
  @client = client
  @downloaded = false
  @logger = options[:logger]
  @mutex = Mutex.new
  @queued = {}
  @started = false
  @exclude_key_regexp = options[:exclude_key_regexp]
  @locales = Array(options[:locales]).map(&:to_s)
end

Instance Attribute Details

#last_downloaded_atObject (readonly)

Returns the value of attribute last_downloaded_at.



129
130
131
# File 'lib/copy_tuner_client/cache.rb', line 129

def last_downloaded_at
  @last_downloaded_at
end

#last_uploaded_atObject (readonly)

Returns the value of attribute last_uploaded_at.



129
130
131
# File 'lib/copy_tuner_client/cache.rb', line 129

def last_uploaded_at
  @last_uploaded_at
end

#queuedObject (readonly)

Returns the value of attribute queued.



129
130
131
# File 'lib/copy_tuner_client/cache.rb', line 129

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



30
31
32
# File 'lib/copy_tuner_client/cache.rb', line 30

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



38
39
40
41
42
# File 'lib/copy_tuner_client/cache.rb', line 38

def []=(key, value)
  return if key =~ @exclude_key_regexp
  return if @locales.present? && !@locales.member?(key.split('.').first)
  lock { @queued[key] = value }
end

#downloadObject



106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
# File 'lib/copy_tuner_client/cache.rb', line 106

def download
  @started = true

  res = client.download do |downloaded_blurbs|
    downloaded_blurbs.reject! { |key, value| value == '' }
    lock { @blurbs = downloaded_blurbs }
  end

  @last_downloaded_at = Time.now.utc

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

#exportString

Yaml representation of all blurbs

Returns:

  • (String)

    yaml



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

def export
  keys = {}
  lock do
    @blurbs.sort.each do |(blurb_key, value)|
      current = keys
      yaml_keys = blurb_key.split('.')

      0.upto(yaml_keys.size - 2) do |i|
        key = yaml_keys[i]

        # Overwrite en.key with en.sub.key
        unless current[key].class == Hash
          current[key] = {}
        end

        current = current[key]
      end

      current[yaml_keys.last] = value
    end
  end

  unless keys.size < 1
    keys.to_yaml
  end
end

#flushObject



94
95
96
97
98
99
100
101
102
103
104
# File 'lib/copy_tuner_client/cache.rb', line 94

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

  @last_uploaded_at = Time.now.utc

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

#inspectObject



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

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

#keysArray<String>

Keys for all blurbs stored on the server.

Returns:

  • (Array<String>)

    keys



46
47
48
# File 'lib/copy_tuner_client/cache.rb', line 46

def keys
  lock { @blurbs.keys }
end

#syncObject

Downloads and then flushes



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

def sync
  download
  flush
end

#wait_for_downloadObject

Waits until the first download has finished.



80
81
82
83
84
85
86
87
88
89
90
91
92
# File 'lib/copy_tuner_client/cache.rb', line 80

def wait_for_download
  if pending?
    logger.info 'Waiting for first download'

    if logger.respond_to? :flush
      logger.flush
    end

    while pending?
      sleep 0.1
    end
  end
end