Class: CopyTunerClient::Cache
- Inherits:
-
Object
- Object
- CopyTunerClient::Cache
- 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
-
#blurbs ⇒ Object
readonly
Returns the value of attribute blurbs.
-
#last_downloaded_at ⇒ Object
readonly
Returns the value of attribute last_downloaded_at.
-
#last_uploaded_at ⇒ Object
readonly
Returns the value of attribute last_uploaded_at.
-
#queued ⇒ Object
readonly
Returns the value of attribute queued.
Instance Method Summary collapse
-
#[](key) ⇒ String
Returns content for the given blurb.
-
#[]=(key, value) ⇒ Object
Sets content for the given blurb.
- #download ⇒ Object
-
#export ⇒ String
Yaml representation of all blurbs.
- #flush ⇒ Object
-
#initialize(client, options) ⇒ Cache
constructor
Usually instantiated when CopyTunerClient::Configuration#apply is invoked.
- #inspect ⇒ Object
-
#keys ⇒ Array<String>
Keys for all blurbs stored on the server.
- #pending? ⇒ Boolean
-
#sync ⇒ Object
Downloads and then flushes.
-
#wait_for_download ⇒ Object
Waits until the first download has finished.
Constructor Details
#initialize(client, options) ⇒ Cache
Usually instantiated when CopyTunerClient::Configuration#apply is invoked.
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, ) @client = client @logger = [:logger] @mutex = Mutex.new @exclude_key_regexp = [:exclude_key_regexp] @upload_disabled = [:upload_disabled] @ignored_keys = .fetch(:ignored_keys, []) @ignored_key_handler = .fetch(:ignored_key_handler, -> (e) { raise e }) @locales = Array([:locales]).map(&:to_s) # mutable states @blurbs = {} @blank_keys = Set.new @queued = {} @started = false @downloaded = false end |
Instance Attribute Details
#blurbs ⇒ Object (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_at ⇒ Object (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_at ⇒ Object (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 |
#queued ⇒ Object (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.
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.
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 |
#download ⇒ Object
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. ensure @downloaded = true end |
#export ⇒ String
Yaml representation of all blurbs
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 |
#flush ⇒ Object
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. end |
#inspect ⇒ Object
127 128 129 |
# File 'lib/copy_tuner_client/cache.rb', line 127 def inspect "#<CopyTunerClient::Cache:#{object_id}>" end |
#keys ⇒ Array<String>
Keys for all blurbs stored on the server.
64 65 66 |
# File 'lib/copy_tuner_client/cache.rb', line 64 def keys lock { @blurbs.keys } end |
#pending? ⇒ Boolean
131 132 133 |
# File 'lib/copy_tuner_client/cache.rb', line 131 def pending? @started && !@downloaded end |
#sync ⇒ Object
Downloads and then flushes
120 121 122 123 |
# File 'lib/copy_tuner_client/cache.rb', line 120 def sync download flush end |
#wait_for_download ⇒ Object
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 |