singleton-client-test 0.7.7.7 → 0.7.7.8

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 71f20276ef709f5a183ab1e6572f171bfe9e5cdb0d0f09decea0fdb2e3aa2e88
4
- data.tar.gz: 1eeebcc0cc3a964c90a00523fdda8aae09d3dc69ddc51af658c6218eb8e97c05
3
+ metadata.gz: 54400e87e847568bead1be140a4374acced859dc3fa9f3fa954b3ddd3fae7192
4
+ data.tar.gz: 073364cb409f2b2fdfa40d0ebadd6c6d36983c262dad8cd9f1d57bae602d419f
5
5
  SHA512:
6
- metadata.gz: cd7cd9a1b977ddfd9110758b997c26bda3d8f2507f95036c87db24e130b7249f9c57871ce7f46c45827c810f0c7dd991b36dde656d3ce8a809e9ef4792554a65
7
- data.tar.gz: 1d8c12a9f7dc6c65ebddcdf1eef50907cd8838a38a0c1a4c98c7001b4b9c77c55c5486d109fc7d9aca01c2c85c99e658ab381e8f2994e7818c73eb3d2a220295
6
+ metadata.gz: 5b213886e41d561eb73c20008920a2ddf87ddd98645f64efdda180f1e157749302494c944f581b87d529ed688e44858d3d0c8cb01cb7eeed9c6a50106b0494f8
7
+ data.tar.gz: efc69bd188f29815770d8c65541ade62268d063cf38a88b3a3cd416ad4c5e961b3bf7e290d4c9faec9510f3ac76e3c15bd6e2070e1e175e2f1969bb09f0d0bae
@@ -39,10 +39,6 @@ module SgtnClient
39
39
  get_translations(component, locale)
40
40
  end
41
41
 
42
- def get_translation!(key, component, locale)
43
- [get_bundle!(component, locale)[key], locale]
44
- end
45
-
46
42
  def translate(key, component, locale = nil, **kwargs, &block)
47
43
  translate!(key, component, locale, **kwargs, &block)
48
44
  rescue StandardError => e
@@ -56,8 +52,8 @@ module SgtnClient
56
52
  SgtnClient.logger.debug { "[#{method(__callee__).owner}.#{__callee__}] key: #{key}, component: #{component}, locale: #{locale}, args: #{kwargs}" }
57
53
 
58
54
  begin
59
- best_match_locale = LocaleUtil.get_best_locale(locale || SgtnClient.locale, component)
60
- result, actual_locale = get_translation!(key, component, best_match_locale)
55
+ picked_locale = pickup_locale(locale || SgtnClient.locale, component)
56
+ result, actual_locale = get_string!(key, component, picked_locale)
61
57
  rescue StandardError => e
62
58
  raise e if block.nil?
63
59
  end
@@ -68,7 +64,7 @@ module SgtnClient
68
64
  return if result.nil?
69
65
  end
70
66
 
71
- kwargs.empty? ? result : result.localize(actual_locale) % kwargs
67
+ kwargs.empty? ? result : interpolate(result, actual_locale, **kwargs)
72
68
  end
73
69
  alias t! translate!
74
70
 
@@ -82,13 +78,19 @@ module SgtnClient
82
78
  def get_translations!(component, locale = nil)
83
79
  SgtnClient.logger.debug { "[#{method(__callee__).owner}.#{__callee__}] component: #{component}, locale: #{locale}" }
84
80
 
85
- best_match_locale = LocaleUtil.get_best_locale(locale || SgtnClient.locale, component)
86
- messages = get_bundle!(component, best_match_locale)
81
+ picked_locale = pickup_locale(locale || SgtnClient.locale, component)
82
+ get_bundle!(component, picked_locale)
83
+ end
87
84
 
88
- { 'component' => component, 'locale' => best_match_locale, 'messages' => messages } if messages
85
+ protected
86
+
87
+ def pickup_locale(locale, component)
88
+ LocaleUtil.get_best_locale(locale, component)
89
89
  end
90
90
 
91
- private
91
+ def interpolate(translation, locale, **kwargs)
92
+ translation.localize(locale) % kwargs
93
+ end
92
94
 
93
95
  def get_bundle!(component, locale)
94
96
  SgtnClient.config.loader.get_bundle(component, locale)
@@ -100,6 +102,13 @@ module SgtnClient
100
102
  SgtnClient.config.notify_observers(:available_locales, component)
101
103
  raise
102
104
  end
105
+
106
+ private
107
+
108
+ def get_string!(key, component, locale)
109
+ bundle = get_bundle!(component, locale)
110
+ [bundle.fetch(key), bundle.locale]
111
+ end
103
112
  end
104
113
 
105
114
  extend Implementation
@@ -50,13 +50,19 @@ module SgtnClient
50
50
  class BundleData < Hash # :nodoc:
51
51
  include DataInfo
52
52
 
53
- def initialize(*args)
53
+ attr_reader :origin, :locale, :component
54
+
55
+ def initialize(*args, origin: nil, locale: nil, component: nil)
54
56
  if !args.empty? && args[0].is_a?(Hash)
55
57
  update(args[0])
56
58
  super()
57
59
  else
58
60
  super
59
61
  end
62
+
63
+ @origin = origin
64
+ @locale = locale
65
+ @component = component
60
66
  end
61
67
  end
62
68
 
@@ -11,9 +11,13 @@ module SgtnClient
11
11
  include Observable
12
12
  include Singleton
13
13
 
14
- attr_accessor :product_name, :version, :vip_server, :translation_bundle, :source_bundle, :cache_expiry_period, :log_file, :log_level
14
+ attr_accessor :product_name, :version, :vip_server, :translation_bundle, :source_bundle, :cache_expiry_period,
15
+ :log_file, :log_level
16
+ attr_writer :logger, :pseudo_tag
15
17
 
16
- attr_writer :logger
18
+ def pseudo_tag
19
+ @pseudo_tag ||= '@@'
20
+ end
17
21
 
18
22
  def logger
19
23
  @logger ||= if log_file
@@ -3,21 +3,12 @@
3
3
 
4
4
  module SgtnClient
5
5
  module Fallbacks # :nodoc:
6
- def get_translation!(key, component, locale)
7
- error = nil
8
- localechain(locale) do |l|
9
- return super(key, component, l)
10
- rescue StandardError => e
11
- error = e
12
- end
13
- raise error if error
14
- end
6
+ protected
15
7
 
16
- def get_translations!(component, locale = nil)
8
+ def get_bundle!(component, locale)
17
9
  error = nil
18
10
  localechain(locale) do |l|
19
- result = super(component, l)
20
- return result if result
11
+ return super(component, l)
21
12
  rescue StandardError => e
22
13
  error = e
23
14
  end
@@ -35,7 +35,7 @@ module SgtnClient
35
35
  def load_bundle(component, locale)
36
36
  SgtnClient.logger.debug { "[#{__FILE__}][#{__callee__}] CacheFiller, component=#{component}, locale=#{locale}" }
37
37
 
38
- @cache_hash[Common::BundleID.new(component, locale)] = Common::BundleData.new(super)
38
+ @cache_hash[Common::BundleID.new(component, locale)] = super
39
39
  end
40
40
 
41
41
  def available_bundles
@@ -6,16 +6,16 @@ require 'set'
6
6
  module SgtnClient
7
7
  module TranslationLoader
8
8
  class Chain
9
- attr_accessor :loaders
9
+ attr_reader :loaders
10
10
 
11
11
  def initialize(*loaders)
12
- self.loaders = loaders
12
+ @loaders = loaders
13
13
  end
14
14
 
15
15
  def load_bundle(component, locale)
16
16
  exception = nil
17
17
 
18
- loaders.each do |loader|
18
+ @loaders.each do |loader|
19
19
  begin
20
20
  bundle = loader.load_bundle(component, locale)
21
21
  return bundle if bundle
@@ -32,7 +32,7 @@ module SgtnClient
32
32
  exception = nil
33
33
  total_data = Set.new
34
34
 
35
- loaders.each do |loader|
35
+ @loaders.each do |loader|
36
36
  begin
37
37
  item = loader.available_bundles
38
38
  total_data += item
@@ -6,7 +6,6 @@
6
6
  module SgtnClient
7
7
  module TranslationLoader
8
8
  module CONSTS
9
- OLD_SOURCE_LOCALE = 'old_source'
10
9
  REAL_SOURCE_LOCALE = 'latest'
11
10
 
12
11
  AVAILABLE_BUNDLES_KEY = 'available_bundles'
@@ -15,6 +15,7 @@ module SgtnClient
15
15
 
16
16
  chain_loader = Class.new(Chain)
17
17
  chain_loader.include SourceComparer
18
+ chain_loader.include Pseudo
18
19
  chain_loader.include CacheFiller
19
20
  chain_loader.include SingleLoader
20
21
  chain_loader.include Cache
@@ -26,17 +26,16 @@ module SgtnClient
26
26
 
27
27
  raise SingletonError, "no messages in local bundle file: #{file_path}." unless messages
28
28
 
29
- messages
29
+ Common::BundleData.new(messages, origin: self, component: component,
30
+ locale: locale == CONSTS::REAL_SOURCE_LOCALE ? LocaleUtil.get_source_locale : locale)
30
31
  end
31
32
 
32
33
  def available_bundles
33
34
  SgtnClient.logger.debug { "[#{method(__callee__).owner}.#{__callee__}]" }
34
35
 
35
- @available_bundles ||= begin
36
- @base_path.glob('*/*.json').reduce(Set.new) do |bundles, f|
37
- locale = f.basename.to_s.sub(/\A#{BUNDLE_PREFIX}/i, '').sub(/#{BUNDLE_SUFFIX}\z/i, '')
38
- bundles.add Common::BundleID.new(f.parent.basename.to_s, locale)
39
- end
36
+ @available_bundles = @base_path.glob('*/*.json').reduce(Set.new) do |bundles, f|
37
+ locale = f.basename.to_s.sub(/\A#{BUNDLE_PREFIX}/i, '').sub(/#{BUNDLE_SUFFIX}\z/i, '')
38
+ bundles.add Common::BundleID.new(f.parent.basename.to_s, locale)
40
39
  end
41
40
  end
42
41
  end
@@ -0,0 +1,21 @@
1
+ # Copyright 2022 VMware, Inc.
2
+ # SPDX-License-Identifier: EPL-2.0
3
+
4
+ module SgtnClient
5
+ module TranslationLoader
6
+ module Pseudo # :nodoc:
7
+ def initialize(*)
8
+ super
9
+ @pseudo_tag = Sgtn.pseudo_tag
10
+ end
11
+
12
+ def load_bundle(component, locale)
13
+ return super unless locale == Sgtn::PSEUDO_LOCALE
14
+
15
+ SgtnClient.logger.debug { "[#{__FILE__}][#{__callee__}] component=#{component}, locale=#{locale}" }
16
+
17
+ super(component, LocaleUtil.get_source_locale).transform_values! { |v| "#{@pseudo_tag}#{v}#{@pseudo_tag}" }
18
+ end
19
+ end
20
+ end
21
+ end
@@ -27,16 +27,18 @@ module SgtnClient
27
27
 
28
28
  @conn = Faraday.new(config.vip_server, request: REQUEST_ARGUMENTS) do |f|
29
29
  f.response :json # decode response bodies as JSON
30
- f.use :gzip
31
30
  f.response :raise_error
32
31
  f.response :logger, config.logger, { log_level: :debug, headers: false, bodies: true }
32
+ f.use :gzip
33
33
  end
34
34
  end
35
35
 
36
36
  def load_bundle(component, locale)
37
37
  SgtnClient.logger.debug { "[#{method(__callee__).owner}.#{__callee__}] component=#{component}, locale=#{locale}" }
38
38
 
39
- query_server(format(@bundle_url, locale, component), ['messages'])
39
+ data = query_server(format(@bundle_url, locale, component), ['messages'])
40
+ Common::BundleData.new(data, origin: self, component: component,
41
+ locale: locale == CONSTS::REAL_SOURCE_LOCALE ? LocaleUtil.get_source_locale : locale)
40
42
  end
41
43
 
42
44
  def available_bundles
@@ -7,7 +7,7 @@ require 'yaml'
7
7
 
8
8
  module SgtnClient
9
9
  module TranslationLoader
10
- class Source
10
+ class Source # :nodoc:
11
11
  def initialize(config)
12
12
  @source_bundle_path = Pathname.new(config.source_bundle)
13
13
  end
@@ -31,7 +31,7 @@ module SgtnClient
31
31
 
32
32
  raise SingletonError, "no local source messages for component #{component}" if total_messages.empty?
33
33
 
34
- total_messages
34
+ Common::BundleData.new(total_messages, origin: self, component: component, locale: LocaleUtil.get_source_locale)
35
35
  end
36
36
 
37
37
  def available_bundles
@@ -11,41 +11,45 @@ module SgtnClient
11
11
  real_locale = cache_to_real_map[locale]
12
12
  return super(component, real_locale) if real_locale
13
13
 
14
- old_source_bundle_thread = Thread.new { load_bundle(component, CONSTS::OLD_SOURCE_LOCALE) }
15
14
  source_bundle_thread = Thread.new { load_bundle(component, LocaleUtil.get_source_locale) }
16
- translation_bundle = super(component, locale)
15
+ translation_bundle = super
16
+
17
+ begin
18
+ old_source_bundle = translation_bundle.origin.load_bundle(component, old_source_locale(locale))
19
+ rescue StandardError => e
20
+ SgtnClient.logger.error "[#{__FILE__}][#{__callee__}] failed to load old source bundle. component:#{component}. error: #{e}"
21
+ end
17
22
 
18
23
  begin
19
- old_source_bundle = old_source_bundle_thread.value
20
24
  source_bundle = source_bundle_thread.value
21
25
  rescue StandardError => e
22
- SgtnClient.logger.error "[#{__FILE__}][#{__callee__}] failed to load soruce(or old source) bundle. component:#{component}. error: #{e}"
26
+ SgtnClient.logger.error "[#{__FILE__}][#{__callee__}] failed to load source bundle. component:#{component}. error: #{e}"
23
27
  return translation_bundle
24
28
  end
25
29
 
26
30
  compare_source(translation_bundle, old_source_bundle, source_bundle)
27
31
  end
28
32
 
29
- private
33
+ protected
30
34
 
31
- def compare_source(translation_bundle, old_source_bundle, source_bundle)
32
- if !translation_bundle.is_a?(Hash) || !source_bundle.is_a?(Hash) || !old_source_bundle.is_a?(Hash)
33
- SgtnClient.logger.warn "can't do source comparison because some bundle data are wrong."
34
- return translation_bundle
35
- end
35
+ def old_source_locale(_locale)
36
+ LocaleUtil.get_source_locale
37
+ end
36
38
 
37
- source_bundle.each do |key, value|
38
- if old_source_bundle[key] != value || translation_bundle[key].nil?
39
- translation_bundle[key] = StringUtil.new(value, LocaleUtil.get_source_locale)
39
+ def compare_source(translation_bundle, old_source_bundle, source_bundle)
40
+ source_bundle.each do |k, v|
41
+ if translation_bundle[k].nil? || (!old_source_bundle.nil? && old_source_bundle[k] != v)
42
+ translation_bundle[k] = LocalizedString.new(v, LocaleUtil.get_source_locale) if v
40
43
  end
41
44
  end
42
45
  translation_bundle
43
46
  end
44
47
 
48
+ private
49
+
45
50
  def cache_to_real_map
46
51
  @cache_to_real_map ||= {
47
- LocaleUtil.get_source_locale => CONSTS::REAL_SOURCE_LOCALE,
48
- CONSTS::OLD_SOURCE_LOCALE => LocaleUtil.get_source_locale
52
+ LocaleUtil.get_source_locale => CONSTS::REAL_SOURCE_LOCALE
49
53
  }.freeze
50
54
  end
51
55
  end
@@ -11,6 +11,7 @@ module SgtnClient
11
11
  autoload :CONSTS, 'sgtn-client/loader/consts'
12
12
  autoload :LoaderFactory, 'sgtn-client/loader/loader_factory'
13
13
  autoload :LocalTranslation, 'sgtn-client/loader/local_translation'
14
+ autoload :Pseudo, 'sgtn-client/loader/pseudo'
14
15
  autoload :SgtnServer, 'sgtn-client/loader/server'
15
16
  autoload :SingleLoader, 'sgtn-client/loader/single_loader'
16
17
  autoload :SourceComparer, 'sgtn-client/loader/source_comparer'
@@ -16,9 +16,8 @@ module SgtnClient # :nodoc:
16
16
  autoload :Exceptions, 'sgtn-client/core/exceptions'
17
17
  autoload :ValidateUtil, 'sgtn-client/util/validate-util'
18
18
  autoload :LocaleUtil, 'sgtn-client/util/locale-util'
19
- autoload :StringUtil, 'sgtn-client/util/string-util'
19
+ autoload :LocalizedString, 'sgtn-client/util/localized_string'
20
20
  autoload :SingletonError, 'sgtn-client/exceptions'
21
- autoload :I18nBackend, 'sgtn-client/i18n_backend'
22
21
 
23
22
  module Formatters # :nodoc:
24
23
  autoload :PluralFormatter, 'sgtn-client/formatters/plurals/plural_formatter'
@@ -15,40 +15,38 @@ module SgtnClient
15
15
  }.freeze
16
16
  LOCALE_SEPARATOR = '-'
17
17
  EN_LOCALE = 'en'
18
- @locale_match_results = Concurrent::Map.new
18
+
19
+ @locale_match_results = Concurrent::Map.new do |hash, component|
20
+ components = SgtnClient.config.available_components
21
+ unless components.empty? || components.include?(component)
22
+ raise SingletonError, "component '#{component}' doesn't exist!"
23
+ end
24
+
25
+ hash[component] = Concurrent::Map.new
26
+ end
19
27
  @lowercase_locales_map = Concurrent::Map.new
20
28
 
21
29
  def self.get_best_locale(locale, component)
22
- component_result = @locale_match_results[component] ||= begin
23
- components = SgtnClient.config.available_components
24
- unless components.empty? || components.include?(component)
25
- raise SingletonError, "component '#{component}' doesn't exist!"
30
+ return locale if SgtnClient.config.available_locales(component).include?(locale)
31
+
32
+ component_result = @locale_match_results[component]
33
+ component_result[locale] ||= begin
34
+ if component_result.size >= 50
35
+ component_result.delete(component_result.keys[Random.rand(component_result.size)])
26
36
  end
27
37
 
28
- Concurrent::Map.new
38
+ locale = locale.to_s
39
+ if locale.empty?
40
+ get_fallback_locale
41
+ else
42
+ candidates = lowercase_locales_map(component)
43
+ if candidates.empty?
44
+ locale
45
+ else
46
+ get_best_match(locale.gsub('_', LOCALE_SEPARATOR).downcase, candidates)
47
+ end
48
+ end
29
49
  end
30
-
31
- component_result[locale] ||= begin
32
- component_result.delete(component_result.keys[Random.rand(component_result.size)]) if component_result.size >= 50
33
-
34
- if SgtnClient.config.available_locales(component).include?(locale)
35
- locale
36
- elsif locale.nil?
37
- get_fallback_locale
38
- else
39
- locale = locale.to_s
40
- if locale.empty?
41
- get_fallback_locale
42
- else
43
- candidates = lowercase_locales_map(component)
44
- if candidates.empty?
45
- locale
46
- else
47
- get_best_match(locale.gsub('_', LOCALE_SEPARATOR).downcase, candidates)
48
- end
49
- end
50
- end
51
- end
52
50
  end
53
51
 
54
52
  def self.get_best_match(locale, candidates)
@@ -2,9 +2,9 @@
2
2
  # SPDX-License-Identifier: EPL-2.0
3
3
 
4
4
  module SgtnClient
5
- class StringUtil < String
6
- def initialize(str, locale)
7
- super(str)
5
+ class LocalizedString < String
6
+ def initialize(value, locale)
7
+ super(value)
8
8
  @locale = locale
9
9
  end
10
10
 
@@ -3,7 +3,7 @@
3
3
 
4
4
  require 'i18n'
5
5
 
6
- module SgtnClient # :nodoc:
6
+ module Sgtn # :nodoc:
7
7
  # When integrating Singleton in a client application that is already using [I18n::Backend (https://www.rubydoc.info/github/svenfuchs/i18n/master/I18n/Backend/), it would be useful to have Singleton override the said module in order to minimize necessary changes. Here is a common usage:
8
8
  #
9
9
  # I18n::Backend::Simple.include(I18n::Backend::Fallbacks) # add fallbacks behavior to current backend
@@ -13,6 +13,10 @@ module SgtnClient # :nodoc:
13
13
  class I18nBackend
14
14
  def initialize(component)
15
15
  @component = component
16
+ @translation = Class.new do
17
+ include SgtnClient::Translation::Implementation
18
+ include Sgtn::Pseudo
19
+ end.new
16
20
  end
17
21
 
18
22
  def initialized?
@@ -34,13 +38,13 @@ module SgtnClient # :nodoc:
34
38
  def translations; end
35
39
 
36
40
  def exists?(locale, key, options)
37
- !!(translate(locale, key, options) { nil })
41
+ !!translate(locale, key, options)
38
42
  end
39
43
 
40
44
  def translate(locale, key, options)
41
45
  flat_key = I18n::Backend::Flatten.normalize_flat_keys(locale, key, options[:scope], '.')
42
46
  values = options.except(*I18n::RESERVED_KEYS)
43
- Translation.translate(flat_key, @component, locale, **values) { nil }
47
+ @translation.translate(flat_key, @component, locale, **values) { nil }
44
48
  end
45
49
 
46
50
  def localize(locale, object, format, options) end
@@ -0,0 +1,14 @@
1
+ # frozen_string_literal: true
2
+
3
+ # Copyright 2022 VMware, Inc.
4
+ # SPDX-License-Identifier: EPL-2.0
5
+
6
+ module Sgtn
7
+ module Pseudo # :nodoc:
8
+ protected
9
+
10
+ def pickup_locale(locale, _component)
11
+ locale == PSEUDO_LOCALE ? PSEUDO_LOCALE : super
12
+ end
13
+ end
14
+ end
@@ -5,6 +5,15 @@ require 'forwardable'
5
5
  require_relative 'singleton-ruby'
6
6
 
7
7
  module Sgtn # :nodoc:
8
+ autoload :Pseudo, 'singleton-client/pseudo'
9
+ autoload :I18nBackend, 'singleton-client/i18n_backend'
10
+
11
+ extend SgtnClient::Translation::Implementation
12
+ extend SgtnClient::Fallbacks
13
+ extend Sgtn::Pseudo
14
+
15
+ PSEUDO_LOCALE = 'pseudo'.freeze
16
+
8
17
  class << self
9
18
  extend Forwardable
10
19
 
@@ -13,14 +22,6 @@ module Sgtn # :nodoc:
13
22
  SgtnClient.load(config_file, env)
14
23
  end
15
24
 
16
- def_delegator SgtnClient::Config, :instance, :config
17
- delegate %i[translate! t! translate t get_translations! get_translations] => SgtnClient::Translation,
18
- %i[locale locale=] => SgtnClient,
19
- %i[logger product_name version vip_server translation_bundle
20
- source_bundle cache_expiry_period log_file log_level].flat_map { |m|
21
- [m, "#{m}=".to_sym]
22
- } => :config
23
-
24
25
  def with_locale(tmp_locale = nil)
25
26
  if tmp_locale.nil?
26
27
  yield
@@ -34,7 +35,11 @@ module Sgtn # :nodoc:
34
35
  end
35
36
  end
36
37
  end
37
- end
38
38
 
39
- I18nBackend = SgtnClient::I18nBackend
39
+ def_delegator SgtnClient::Config, :instance, :config
40
+ delegate %i[locale locale=] => SgtnClient,
41
+ %i[logger product_name version vip_server translation_bundle
42
+ source_bundle cache_expiry_period log_file log_level
43
+ pseudo_tag ].flat_map { |m| [m, "#{m}=".to_sym] } => :config
44
+ end
40
45
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: singleton-client-test
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.7.7.7
4
+ version: 0.7.7.8
5
5
  platform: ruby
6
6
  authors:
7
7
  - VMware G11n Team
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2022-10-18 00:00:00.000000000 Z
11
+ date: 2022-12-08 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: concurrent-ruby
@@ -146,22 +146,24 @@ files:
146
146
  - lib/sgtn-client/exceptions.rb
147
147
  - lib/sgtn-client/fallbacks.rb
148
148
  - lib/sgtn-client/formatters/plurals/plural_formatter.rb
149
- - lib/sgtn-client/i18n_backend.rb
150
149
  - lib/sgtn-client/loader.rb
151
150
  - lib/sgtn-client/loader/cache.rb
152
151
  - lib/sgtn-client/loader/chain_loader.rb
153
152
  - lib/sgtn-client/loader/consts.rb
154
153
  - lib/sgtn-client/loader/loader_factory.rb
155
154
  - lib/sgtn-client/loader/local_translation.rb
155
+ - lib/sgtn-client/loader/pseudo.rb
156
156
  - lib/sgtn-client/loader/server.rb
157
157
  - lib/sgtn-client/loader/single_loader.rb
158
158
  - lib/sgtn-client/loader/source.rb
159
159
  - lib/sgtn-client/loader/source_comparer.rb
160
160
  - lib/sgtn-client/sgtn-client.rb
161
161
  - lib/sgtn-client/util/locale-util.rb
162
- - lib/sgtn-client/util/string-util.rb
162
+ - lib/sgtn-client/util/localized_string.rb
163
163
  - lib/sgtn-client/util/validate-util.rb
164
164
  - lib/singleton-client.rb
165
+ - lib/singleton-client/i18n_backend.rb
166
+ - lib/singleton-client/pseudo.rb
165
167
  - lib/singleton-ruby.rb
166
168
  - lib/version.rb
167
169
  homepage: https://github.com/vmware/singleton
@@ -183,7 +185,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
183
185
  - !ruby/object:Gem::Version
184
186
  version: '0'
185
187
  requirements: []
186
- rubygems_version: 3.2.22
188
+ rubygems_version: 3.3.26
187
189
  signing_key:
188
190
  specification_version: 4
189
191
  summary: Singleton Ruby client