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
# 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]
end

Instance Attribute Details

#last_downloaded_atObject (readonly)

Returns the value of attribute last_downloaded_at.



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

def last_downloaded_at
  @last_downloaded_at
end

#last_uploaded_atObject (readonly)

Returns the value of attribute last_uploaded_at.



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

def last_uploaded_at
  @last_uploaded_at
end

#queuedObject (readonly)

Returns the value of attribute queued.



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

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



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

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



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

def []=(key, value)
  return if key =~ @exclude_key_regexp
  lock { @queued[key] = value }
end

#downloadObject



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

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



50
51
52
53
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/cache.rb', line 50

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



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

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



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

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

#keysArray<String>

Keys for all blurbs stored on the server.

Returns:

  • (Array<String>)

    keys



44
45
46
# File 'lib/copy_tuner_client/cache.rb', line 44

def keys
  lock { @blurbs.keys }
end

#syncObject

Downloads and then flushes



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

def sync
  download
  flush
end

#wait_for_downloadObject

Waits until the first download has finished.



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

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