singleton-client-test 0.7.7.1 → 0.7.7.4

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 66531dc1471879c17d807694ff65b64e60bfd35a093d7eb739b728d7e0ae3321
4
- data.tar.gz: 200e2f4b3ab09a0cfeefe1131ed61494fbec0a1f63974d36a9ce9379d117d066
3
+ metadata.gz: 2b1a0ab0b7bfa8a2fef42c229aae91032941499667f0885882f924d6a3f75694
4
+ data.tar.gz: be51ed5dbdf30cbc7f67353b5d96ba49e4e20a5de61ea9bd7d99d4f27785e1a9
5
5
  SHA512:
6
- metadata.gz: d85cd8e706659abb1ec1a6e1364b5fcddf2b2c14bca9d616e49d0d28a7657984e26752e48b310763e51f536cbaefb56d99585fe09d46a68cc8cc75f1504e784b
7
- data.tar.gz: 924846467b0707fb90b95f77a604546822e2e1ae3dbbc79cb3541fdbd1dcc99fd17df0b00762dd5ee2073a08a8f2044cbb260f986ded95e6ca42ce089cf35046
6
+ metadata.gz: d3a9b167165b5d6f6726ed8be0b07fadc7ef4aeb0c8ecb8f941bc77e5ff7ada988557f97098c33d1907fb7f24b1cac17f7df4fa3de3b96cce2e64a4240633c58
7
+ data.tar.gz: 44e84a38eb2e592793546c812817b751b0366b5af2ed0591eeaed1e4dd5b014af70b33674b7da69cac2873e16fb9ab3b47ff85d7d5f463b3a3bcfd987930ee7e
@@ -7,7 +7,6 @@ module SgtnClient
7
7
  class Source
8
8
  def self.loadBundles(locale)
9
9
  SgtnClient.logger.debug "[Source][loadBundles]locale=#{locale}"
10
- Config.configurations.default = locale
11
10
  end
12
11
  end
13
12
  end
@@ -8,19 +8,19 @@ module SgtnClient
8
8
  module Implementation
9
9
  # <b>DEPRECATED:</b> Please use <tt>Sgtn:translate</tt> instead.
10
10
  def getString(component, key, locale)
11
- SgtnClient.logger.debug "[Translation.getString]component: #{component}, key: #{key}, locale: #{locale}"
11
+ SgtnClient.logger.debug { "[Translation.getString]component: #{component}, key: #{key}, locale: #{locale}" }
12
12
  translate(key, component, locale) { nil }
13
13
  end
14
14
 
15
15
  # <b>DEPRECATED:</b> Please use <tt>Sgtn:translate</tt> instead.
16
16
  def getString_p(component, key, plural_args, locale)
17
- SgtnClient.logger.debug "[Translation][getString_p]component=#{component}, key=#{key}, locale=#{locale}"
17
+ SgtnClient.logger.debug { "[Translation][getString_p]component=#{component}, key=#{key}, locale=#{locale}" }
18
18
  translate(key, component, locale, **plural_args) { nil }
19
19
  end
20
20
 
21
21
  # <b>DEPRECATED:</b> Please use <tt>Sgtn:translate</tt> instead.
22
22
  def getString_f(component, key, args, locale, *_optionals)
23
- SgtnClient.logger.debug "[Translation][getString_f]component=#{component}, key=#{key}, locale=#{locale}"
23
+ SgtnClient.logger.debug { "[Translation][getString_f]component=#{component}, key=#{key}, locale=#{locale}" }
24
24
  s = translate(key, component, locale) { nil }
25
25
  return nil if s.nil?
26
26
 
@@ -39,16 +39,16 @@ module SgtnClient
39
39
  get_translations(component, locale)
40
40
  end
41
41
 
42
- # raise error when translation is not found
43
42
  def translate(key, component, locale = nil, **kwargs)
44
- SgtnClient.logger.debug "[#{method(__callee__).owner}.#{__callee__}] key: #{key}, component: #{component}, locale: #{locale}, args: #{kwargs}"
45
-
46
- locale = locale.nil? ? self.locale : LocaleUtil.get_best_locale(locale)
47
-
48
- result = get_bundle(component, locale)&.fetch(key, nil)
49
- if result.nil? && !LocaleUtil.is_source_locale(locale)
50
- locale = LocaleUtil.get_source_locale
51
- result = get_bundle(component, locale)&.fetch(key, nil)
43
+ SgtnClient.logger.debug { "[#{method(__callee__).owner}.#{__callee__}] key: #{key}, component: #{component}, locale: #{locale}, args: #{kwargs}" }
44
+
45
+ begin
46
+ best_match_locale = LocaleUtil.get_best_locale(locale || self.locale, component)
47
+ messages, actual_locale = get_bundle_with_fallback(component, best_match_locale)
48
+ result = messages&.fetch(key, nil)
49
+ rescue StandardError => e
50
+ SgtnClient.logger.debug { "[#{method(__callee__).owner}.#{__callee__}] translation is missing. {#{key}, #{component}, #{locale}}. #{e}" }
51
+ result = nil
52
52
  end
53
53
 
54
54
  if result.nil?
@@ -61,23 +61,21 @@ module SgtnClient
61
61
  if kwargs.empty?
62
62
  result
63
63
  else
64
- locale = result.locale if result.is_a?(StringUtil)
65
- result.localize(locale) % kwargs
64
+ result.localize(actual_locale) % kwargs
66
65
  end
67
66
  end
68
67
  alias t translate
69
68
 
70
69
  def get_translations(component, locale = nil)
71
- SgtnClient.logger.debug "[#{method(__callee__).owner}.#{__callee__}] component: #{component}, locale: #{locale}"
70
+ SgtnClient.logger.debug { "[#{method(__callee__).owner}.#{__callee__}] component: #{component}, locale: #{locale}" }
72
71
 
73
- locale = locale.nil? ? self.locale : LocaleUtil.get_best_locale(locale)
74
- items = get_bundle(component, locale)
75
- if items.nil? && !LocaleUtil.is_source_locale(locale)
76
- items = get_bundle(component, LocaleUtil.get_source_locale)
77
- locale = LocaleUtil.get_source_locale
78
- end
72
+ best_match_locale = LocaleUtil.get_best_locale(locale || self.locale, component)
73
+ messages, actual_locale = get_bundle_with_fallback(component, best_match_locale)
79
74
 
80
- { 'component' => component, 'locale' => locale, 'messages' => items || {} } if items
75
+ { 'component' => component, 'locale' => actual_locale, 'messages' => messages } if messages
76
+ rescue StandardError => e
77
+ SgtnClient.logger.error "[#{method(__callee__).owner}.#{__callee__}] translations are missing. {#{component}, #{locale}}. #{e}"
78
+ nil
81
79
  end
82
80
 
83
81
  def locale
@@ -85,7 +83,7 @@ module SgtnClient
85
83
  end
86
84
 
87
85
  def locale=(value)
88
- RequestStore.store[:locale] = LocaleUtil.get_best_locale(value)
86
+ RequestStore.store[:locale] = value
89
87
  end
90
88
 
91
89
  private
@@ -99,15 +97,29 @@ module SgtnClient
99
97
  end
100
98
 
101
99
  def get_bundle!(component, locale)
102
- id = Common::BundleID.new(component, locale)
103
- bundles = Config.available_bundles
104
- unless bundles.nil? || bundles.empty? || bundles.include?(id)
105
- raise SingletonError, 'bundle is unavailable.'
106
- end
100
+ SgtnClient.config.loader.get_bundle(component, locale)
101
+ rescue StandardError
102
+ # delete the locale from the available_bundles of component to avoid repeated calls to server
103
+ SgtnClient.config.available_bundles.delete(Common::BundleID.new(component, locale))
104
+ SgtnClient.config.available_locales(component)&.delete(locale)
105
+ SgtnClient.config.changed
106
+ SgtnClient.config.notify_observers(:available_locales, component)
107
+ raise
108
+ end
109
+
110
+ def get_bundle_with_fallback(component, locale)
111
+ messages = get_bundle(component, locale)
112
+ return messages, locale if messages
113
+
114
+ LocaleUtil.locale_fallbacks.each do |l|
115
+ next if l == locale
107
116
 
108
- Config.loader.get_bundle(component, locale)
117
+ messages = get_bundle(component, l)
118
+ return messages, l if messages
119
+ end
109
120
  end
110
121
  end
122
+
111
123
  extend Implementation
112
124
  end
113
125
  end
@@ -23,7 +23,7 @@ module SgtnClient
23
23
  alias eql? ==
24
24
 
25
25
  def to_s
26
- "locale=#{@locale}, component=#{@component}}"
26
+ "{component: #{@component}, locale: #{@locale}}"
27
27
  end
28
28
  end
29
29
  end
@@ -3,25 +3,24 @@
3
3
 
4
4
  module SgtnClient
5
5
  class SingleOperation
6
- def initialize(*conditions, &block)
7
- raise 'no way to create a new obj' unless block
6
+ def initialize(*conditions, &creator)
7
+ raise 'no way to create a new obj' unless creator
8
8
 
9
9
  @lock = Mutex.new
10
10
  @hash = {}
11
11
 
12
12
  @conditions = conditions
13
- @creator = block
13
+ @creator = creator
14
14
  end
15
15
 
16
- # return new created object
17
- def operate(id, *args)
16
+ # return new created object (return nil possibly)
17
+ def operate(id, &block)
18
18
  @lock.synchronize do
19
19
  obj = @hash[id]
20
20
  @conditions.each do |con|
21
- return obj unless con.call(id, obj, *args)
21
+ return obj unless con.call(id, obj)
22
22
  end
23
- # TODO: whatif returning nil
24
- @hash[id] = @creator.call(id, obj, *args)
23
+ @hash[id] = @creator.call(id, &block)
25
24
  end
26
25
  end
27
26
 
@@ -7,27 +7,24 @@ module SgtnClient::Core
7
7
  class Cache
8
8
  Entry = Struct.new(:expiry, :items)
9
9
 
10
- def self.initialize(disabled=false, opts={})
11
- @@opts = opts
12
- SgtnClient.logger.debug "[Cache][initialize] Disable cache? #{disabled}"
13
- @@data = Hash.new
14
- end
15
-
16
10
  def self.get(key)
17
- SgtnClient.logger.debug "[Cache][get]get cache for key: " + key
18
- return @@data&.dig(key)
11
+ SgtnClient.logger.debug { "[Cache][get]get cache for key: #{key}" }
12
+ return data&.dig(key)
19
13
  end
20
14
 
21
- def self.put(key, items, ttl=nil)
22
- ttl ||= @@opts[:ttl]
15
+ def self.put(key, items, ttl)
23
16
  # hours from new
24
- SgtnClient.logger.debug "[Cache][put]put cache for key '" + key + "' with expired time at'" + (Time.now + ttl*60).to_s
25
- @@data[key] = Entry.new(Time.now + ttl*60, items)
17
+ SgtnClient.logger.debug { "[Cache][put]put cache for key '#{key}' with expired time at'" + (Time.now + ttl*60).to_s }
18
+ data[key] = Entry.new(Time.now + ttl*60, items)
26
19
  end
27
20
 
28
21
  def self.clear
29
- SgtnClient.logger.debug "[Cache][clear]clear cache!"
30
- @@data = Hash.new
22
+ SgtnClient.logger.debug { "[Cache][clear]clear cache!" }
23
+ @data = {}
24
+ end
25
+
26
+ def self.data
27
+ @data ||= {}
31
28
  end
32
29
  end
33
30
 
@@ -1,200 +1,86 @@
1
1
  # Copyright 2022 VMware, Inc.
2
2
  # SPDX-License-Identifier: EPL-2.0
3
3
 
4
- require 'erb'
5
- require 'yaml'
6
- require 'set'
4
+ require 'concurrent/map'
7
5
  require 'observer'
6
+ require 'set'
7
+ require 'singleton'
8
8
 
9
9
  module SgtnClient
10
- module Configuration
10
+ class Config # :nodoc:
11
+ include Observable
12
+ include Singleton
13
+
14
+ attr_accessor :product_name, :version, :vip_server, :translation_bundle, :source_bundle, :cache_expiry_period, :log_file, :log_level
15
+
16
+ attr_writer :logger
17
+
18
+ def logger
19
+ @logger ||= if log_file
20
+ puts "create log file: '#{log_file}', level: #{log_level}"
21
+ require 'lumberjack'
22
+ Lumberjack::Logger.new(log_file, level: log_level, max_size: '1M', keep: 4)
23
+ else
24
+ require 'logger'
25
+ Logger.new(STDOUT, level: log_level || Logger::INFO)
26
+ end
27
+ end
11
28
 
12
- def config
13
- @config ||= Config.config
29
+ def loader
30
+ @loader ||= TranslationLoader::LoaderFactory.create(self)
14
31
  end
15
32
 
16
- def set_config(env, override_configurations = {})
17
- @config =
18
- case env
19
- when Config
20
- env
21
- when Hash
22
- begin
23
- config.dup.merge!(env)
24
- rescue Errno::ENOENT => error
25
- Config.new(env)
26
- end
27
- else
28
- Config.config(env, override_configurations)
29
- end
33
+ def available_bundles
34
+ loader.available_bundles
35
+ rescue StandardError => e
36
+ SgtnClient.logger.error 'failed to get available bundles'
37
+ SgtnClient.logger.error e
38
+ Set.new
30
39
  end
31
40
 
32
- alias_method :config=, :set_config
41
+ def available_components
42
+ bundles = available_bundles
43
+ return Set.new if bundles.nil? || bundles.empty?
33
44
 
34
- end
35
-
36
-
37
- class Config
38
- extend Observable
39
-
40
- attr_accessor :username, :password, :signature, :app_id, :cert_path,
41
- :token, :token_secret, :subject,
42
- :http_timeout, :http_proxy,
43
- :device_ipaddress, :sandbox_email_address,
44
- :mode, :endpoint, :merchant_endpoint, :platform_endpoint, :ipn_endpoint,
45
- :rest_endpoint, :rest_token_endpoint, :client_id, :client_secret,
46
- :openid_endpoint, :openid_redirect_uri, :openid_client_id, :openid_client_secret,
47
- :verbose_logging, :product_name, :version, :vip_server,
48
- :translation_bundle, :source_bundle, :cache_expiry_period, :disable_cache, :default_language
49
-
50
-
51
- # Create Config object
52
- # === Options(Hash)
53
- # * <tt>username</tt> -- Username
54
- # * <tt>password</tt> -- Password
55
- # * <tt>signature</tt> (Optional if certificate present) -- Signature
56
- # * <tt>app_id</tt> -- Application ID
57
- # * <tt>cert_path</tt> (Optional if signature present) -- Certificate file path
58
- def initialize(options)
59
- merge!(options)
45
+ define_bundles_methods(bundles) unless bundles.respond_to?(:components)
46
+ bundles.components
47
+ end
48
+
49
+ def available_locales(component)
50
+ bundles = available_bundles
51
+ return Set.new if bundles.nil? || bundles.empty?
52
+
53
+ define_bundles_methods(bundles) unless bundles.respond_to?(:locales)
54
+ bundles.locales(component)
60
55
  end
61
56
 
62
- # Override configurations
63
- def merge!(options)
57
+ def update(options)
64
58
  options.each do |key, value|
65
59
  send("#{key}=", value)
66
60
  end
67
- self
68
61
  end
69
-
70
- class << self
71
-
72
- @@config_cache = {}
73
- def load(file_name, default_env = default_environment)
74
- @@config_cache = {}
75
- @@configurations = read_configurations(file_name)
76
- @@default_environment = default_env
77
- config
78
- end
79
-
80
-
81
- # Get default environment name
82
- def default_environment
83
- @@default_environment ||= ENV['SGTN_ENV'] || ENV['RACK_ENV'] || ENV['RAILS_ENV'] || "development"
84
- end
85
-
86
-
87
- # Set default environment
88
- def default_environment=(env)
89
- @@default_environment = env.to_s
90
- end
91
-
92
- def configure(options = {}, &block)
93
- begin
94
- self.config.merge!(options)
95
- rescue Errno::ENOENT
96
- self.configurations = { default_environment => options }
97
- end
98
- block.call(self.config) if block
99
- self.config
100
- end
101
- alias_method :set_config, :configure
102
-
103
- # Create or Load Config object based on given environment and configurations.
104
- # === Attributes
105
- # * <tt>env</tt> (Optional) -- Environment name
106
- # * <tt>override_configuration</tt> (Optional) -- Override the configuration given in file.
107
- # === Example
108
- # Config.config
109
- # Config.config(:development)
110
- # Config.config(:development, { :app_id => "XYZ" })
111
- def config(env = default_environment, override_configuration = {})
112
- if env.is_a? Hash
113
- override_configuration = env
114
- env = default_environment
115
- end
116
- if override_configuration.nil? or override_configuration.empty?
117
- default_config(env)
118
- else
119
- default_config(env).dup.merge!(override_configuration)
120
- end
121
- end
122
-
123
- def default_config(env = nil)
124
- env = (env || default_environment).to_s
125
- if configurations[env]
126
- @@config_cache[env] ||= new(configurations[env])
127
- else
128
- raise Exceptions::MissingConfig.new("Configuration[#{env}] NotFound")
129
- end
130
- end
131
-
132
- # Get raw configurations in Hash format.
133
- def configurations
134
- @@configurations ||= read_configurations
135
- end
136
-
137
- # Set configuration
138
- def configurations=(configs)
139
- @@config_cache = {}
140
- @@configurations = configs && Hash[configs.map{|k,v| [k.to_s, v] }]
141
- end
142
-
143
- # Set logger
144
- def logger=(logger)
145
- Logging.logger = logger
146
- end
147
62
 
148
- # Get logger
149
- def logger
150
- if @@configurations[:mode] == 'live' and Logging.logger.level == Logger::DEBUG
151
- Logging.logger.warn "DEBUG log level not allowed in live mode for security of confidential information. Changing log level to INFO..."
152
- Logging.logger.level = Logger::INFO
153
- end
154
- Logging.logger
155
- end
63
+ private
156
64
 
65
+ def define_bundles_methods(bundles)
66
+ bundles.instance_eval do |_|
67
+ @component_locales ||= Concurrent::Map.new
157
68
 
158
- def loader
159
- @loader ||= begin
160
- config = Config.configurations[Config.default_environment]
161
- TranslationLoader::LoaderFactory.create(config)
162
- end
69
+ def components
70
+ @components ||= reduce(Set.new) { |components, id| components << id.component }
163
71
  end
164
72
 
165
- def available_bundles
166
- loader.available_bundles
167
- rescue StandardError => e
168
- SgtnClient.logger.error 'failed to get available bundles'
169
- SgtnClient.logger.error e
170
- Set.new
171
- end
73
+ def locales(component)
74
+ @component_locales[component] ||= begin
75
+ return Set.new unless components.include?(component)
172
76
 
173
- def available_locales
174
- bundles = available_bundles
175
- return Set.new if bundles.nil? || bundles.empty?
176
-
177
- unless bundles.respond_to?(:locales)
178
- def bundles.locales
179
- @locales ||= reduce(Set.new) { |locales, id| locales << id.locale }
180
- end
181
- changed
182
- notify_observers(:available_locales)
77
+ each_with_object(Set.new) { |id, locales| locales << id.locale if id.component == component }
183
78
  end
184
- bundles.locales
185
79
  end
80
+ end
186
81
 
187
- private
188
- # Read configurations from the given file name
189
- # === Arguments
190
- # * <tt>file_name</tt> (Optional) -- Configuration file path
191
- def read_configurations(file_name = "config/sgtnclient.yml")
192
- erb = ERB.new(File.read(file_name))
193
- erb.filename = file_name
194
- YAML.load(erb.result)
195
- end
196
-
82
+ changed
83
+ notify_observers(:available_locales)
197
84
  end
198
85
  end
199
-
200
86
  end
@@ -16,7 +16,7 @@ module SgtnClient # :nodoc:
16
16
  end
17
17
 
18
18
  def initialized?
19
- @initialized = true
19
+ @initialized ||= true
20
20
  end
21
21
 
22
22
  def load_translations(*) end
@@ -24,7 +24,7 @@ module SgtnClient # :nodoc:
24
24
  def store_translations(*) end
25
25
 
26
26
  def available_locales
27
- SgtnClient::Config.available_locales.to_a
27
+ SgtnClient.config.available_locales(@component).to_a
28
28
  end
29
29
 
30
30
  def reload!; end
@@ -33,14 +33,16 @@ module SgtnClient # :nodoc:
33
33
 
34
34
  def translations; end
35
35
 
36
- def exists?(locale, key)
37
- !!(translate(locale, key) { nil })
36
+ def exists?(locale, key, options)
37
+ !!(translate(locale, key, options) { nil })
38
38
  end
39
39
 
40
40
  def translate(locale, key, options)
41
41
  flat_key = I18n::Backend::Flatten.normalize_flat_keys(locale, key, options[:scope], '.')
42
42
  values = options.except(*I18n::RESERVED_KEYS)
43
- SgtnClient::Translation.translate(flat_key, @component, locale, **values) { nil }
43
+ Translation.translate(flat_key, @component, locale, **values) { nil }
44
44
  end
45
+
46
+ def localize(locale, object, format, options) end
45
47
  end
46
48
  end
@@ -8,58 +8,45 @@ module SgtnClient
8
8
  module Cache # :nodoc:
9
9
  # get from cache, return expired data immediately
10
10
  def get_bundle(component, locale)
11
- SgtnClient.logger.debug "[#{__FILE__}][#{__callee__}] component=#{component}, locale=#{locale}"
11
+ SgtnClient.logger.debug { "[#{__FILE__}][#{__callee__}] component=#{component}, locale=#{locale}" }
12
12
 
13
- key = CacheUtil.get_cachekey(component, locale)
13
+ key = Common::BundleID.new(component, locale)
14
14
  cache_item = CacheUtil.get_cache(key)
15
15
  if cache_item
16
- if CacheUtil.is_expired(cache_item)
17
- Thread.new do # TODO: Use one thread # refresh in background
18
- begin
19
- load_bundle(component, locale)
20
- rescue StandardError => e
21
- SgtnClient.logger.error "an error occured while loading bundle: component=#{component}, locale=#{locale}"
22
- SgtnClient.logger.error e
23
- end
24
- end
25
- end
26
- return cache_item.dig(:items)
16
+ load_bundle(component, locale, sync: false) if CacheUtil.is_expired(cache_item)
17
+ cache_item[:items]
18
+ else
19
+ load_bundle(component, locale)
27
20
  end
21
+ end
22
+
23
+ def available_bundles
24
+ SgtnClient.logger.debug { "[#{__FILE__}][#{__callee__}]" }
28
25
 
29
- load_bundle(component, locale) # refresh synchronously if not in cache
26
+ cache_item = CacheUtil.get_cache(CONSTS::AVAILABLE_BUNDLES_KEY)
27
+ if cache_item
28
+ super(sync: false) if CacheUtil.is_expired(cache_item)
29
+ cache_item[:items]
30
+ else
31
+ super
32
+ end
30
33
  end
34
+ end
31
35
 
32
- # load and save to cache
36
+ module CacheFiller
33
37
  def load_bundle(component, locale)
34
- SgtnClient.logger.debug "[#{__FILE__}][#{__callee__}] component=#{component}, locale=#{locale}"
38
+ SgtnClient.logger.debug { "[#{__FILE__}][#{__callee__}] component=#{component}, locale=#{locale}" }
35
39
 
36
- key = CacheUtil.get_cachekey(component, locale)
37
40
  item = super
38
- CacheUtil.write_cache(key, item) if item
41
+ CacheUtil.write_cache(Common::BundleID.new(component, locale), item) if item
39
42
  item
40
43
  end
41
44
 
42
45
  def available_bundles
43
- SgtnClient.logger.debug "[#{__FILE__}][#{__callee__}]"
44
-
45
- cache_item = CacheUtil.get_cache(CONSTS::AVAILABLE_BUNDLES_KEY)
46
- if cache_item
47
- if CacheUtil.is_expired(cache_item)
48
- Thread.new do # TODO: Use one thread
49
- begin
50
- item = super
51
- CacheUtil.write_cache(CONSTS::AVAILABLE_BUNDLES_KEY, item) if item
52
- rescue StandardError => e
53
- SgtnClient.logger.error 'an error occured while loading available bundles.'
54
- SgtnClient.logger.error e
55
- end
56
- end
57
- end
58
- return cache_item.dig(:items)
59
- end
46
+ SgtnClient.logger.debug { "[#{__FILE__}][#{__callee__}]" }
60
47
 
61
48
  item = super
62
- CacheUtil.write_cache(CONSTS::AVAILABLE_BUNDLES_KEY, item) if item
49
+ CacheUtil.write_cache(CONSTS::AVAILABLE_BUNDLES_KEY, item) if item # TODO: don't save when empty
63
50
  item
64
51
  end
65
52
  end
@@ -5,16 +5,17 @@ module SgtnClient
5
5
  module TranslationLoader
6
6
  module LoaderFactory
7
7
  def self.create(config)
8
- SgtnClient.logger.info "[#{method(__callee__).owner}.#{__callee__}] config=#{config}"
8
+ SgtnClient.logger.info "[#{method(__callee__).owner}.#{__callee__}] config=#{config.inspect}"
9
9
 
10
10
  loaders = []
11
- loaders << Source.new(config) if config['source_bundle']
12
- loaders << SgtnServer.new(config) if config['vip_server']
13
- loaders << LocalTranslation.new(config) if config['translation_bundle']
11
+ loaders << Source.new(config) if config.source_bundle
12
+ loaders << SgtnServer.new(config) if config.vip_server
13
+ loaders << LocalTranslation.new(config) if config.translation_bundle
14
14
  raise SingletonError, 'no translation is available!' if loaders.empty?
15
15
 
16
16
  chain_loader = Class.new(Chain)
17
17
  chain_loader.include SourceComparer
18
+ chain_loader.include CacheFiller
18
19
  chain_loader.include SingleLoader
19
20
  chain_loader.include Cache
20
21
 
@@ -12,11 +12,11 @@ module SgtnClient
12
12
  BUNDLE_SUFFIX = '.json'.freeze
13
13
 
14
14
  def initialize(config)
15
- @base_path = Pathname.new(config['translation_bundle']) + config['product_name'] + config['version'].to_s
15
+ @base_path = Pathname.new(config.translation_bundle) + config.product_name + config.version.to_s
16
16
  end
17
17
 
18
18
  def load_bundle(component, locale)
19
- SgtnClient.logger.debug "[#{method(__callee__).owner}.#{__callee__}] component=#{component}, locale=#{locale}"
19
+ SgtnClient.logger.debug { "[#{method(__callee__).owner}.#{__callee__}] component=#{component}, locale=#{locale}" }
20
20
 
21
21
  file_name = BUNDLE_PREFIX + locale + BUNDLE_SUFFIX
22
22
  file_path = @base_path + component + file_name
@@ -30,7 +30,7 @@ module SgtnClient
30
30
  end
31
31
 
32
32
  def available_bundles
33
- SgtnClient.logger.debug "[#{method(__callee__).owner}.#{__callee__}]"
33
+ SgtnClient.logger.debug { "[#{method(__callee__).owner}.#{__callee__}]" }
34
34
 
35
35
  @available_bundles ||= begin
36
36
  @base_path.glob('*/*.json').reduce(Set.new) do |bundles, f|