singleton-client 0.7.0 → 0.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: 4bff1730aecabe391982a491a349af0a51af8f7c894d79a3704866959460dec5
4
- data.tar.gz: ef351201885c96d9ada076af3f780291fc645ac100541bcdb87a7dd2f5bdf9c6
3
+ metadata.gz: 43d840f37ce5f60b23e16623db0b4393f014eaeaafa0ddf91520225a93bd9c57
4
+ data.tar.gz: d3c1e045e6c75f7e09cd2790de733a217516afede51dbfede1224cbabcbd3b53
5
5
  SHA512:
6
- metadata.gz: e10e2f79a2654cd0055dbfa555149c536aa2d7557b9ce1af12206abe2106e851cbb9b428e0e8f8fa6a6833a69f5566ec4a80df6d739d1c46d5b750a9e64d9653
7
- data.tar.gz: f7cfc58191dae18ae6b1235980d2009e9d308982ac80c977ffd769884817d4b9745cfb5415996681b9085e366abd93c1b44119983663ecbdf2be4a8d59ff5c86
6
+ metadata.gz: 56593be0f8686d669216a849592b9100bb47f52087bf10938d1fae79fb123b9b4ee68baa10e8e627c2ef263e79f2f056aac777e2e5ebc3d8d7f5fbd15b758ce5
7
+ data.tar.gz: 5eca696945202e002be5c489ee37153d63c6498e4cc8639f5ea3ad11666ac63e4fffee59572e29fbeb0ff4c7489ff29b06a77cb57e2f9f077cde0663ca5e115b
@@ -1,5 +1,3 @@
1
- require 'erb'
2
- require 'yaml'
3
1
 
4
2
  module SgtnClient
5
3
 
@@ -8,43 +6,47 @@ module SgtnClient
8
6
  class Source
9
7
 
10
8
  def self.getSource(component, key, locale)
9
+ SgtnClient.logger.debug "[Source][getSource]component=#{component}, key=#{key}, locale=#{locale}"
11
10
  cache_key = SgtnClient::CacheUtil.get_cachekey(component, locale)
12
- items = SgtnClient::CacheUtil.get_cache(cache_key)
11
+ expired, items = SgtnClient::CacheUtil.get_cache(cache_key)
13
12
  if items.nil?
14
- items = getBundle(component, locale)
15
- SgtnClient.logger.debug "Putting sources items into cache with key: " + cache_key
13
+ items = getBundle(component, locale)
16
14
  SgtnClient::CacheUtil.write_cache(cache_key, items)
17
15
  else
18
- SgtnClient.logger.debug "Getting sources from cache with key: " + cache_key
16
+ SgtnClient.logger.debug "[Source][getSource]getting sources from cache with key: " + cache_key
19
17
  end
20
- if items.nil?
21
- return key
18
+ s = items.nil?? nil : items[locale][key]
19
+ if items.nil? || s.nil?
20
+ SgtnClient.logger.debug "[Source][getSource]source not found, return key: " + key
21
+ #return key
22
+ return nil
23
+ else
24
+ return s
22
25
  end
23
- str = items[locale][key]
24
- return str
25
26
  end
26
27
 
27
28
  def self.getSources(component, locale)
29
+ SgtnClient.logger.debug "[Source][getSources]component=#{component}, locale=#{locale}"
28
30
  cache_key = SgtnClient::CacheUtil.get_cachekey(component, locale)
29
- items = SgtnClient::CacheUtil.get_cache(cache_key)
30
- if items.nil?
31
+ expired, items = SgtnClient::CacheUtil.get_cache(cache_key)
32
+ if items.nil? || expired
31
33
  items = getBundle(component, locale)
32
- SgtnClient.logger.debug "Putting sources items into cache with key: " + cache_key
33
34
  SgtnClient::CacheUtil.write_cache(cache_key, items)
34
35
  else
35
- SgtnClient.logger.debug "Getting sources from cache with key: " + cache_key
36
+ SgtnClient.logger.debug "[Source][getSources]getting sources from cache with key: " + cache_key
36
37
  end
37
38
  return items
38
39
  end
39
40
 
40
41
  def self.loadBundles(locale)
42
+ SgtnClient.logger.debug "[Source][loadBundles]locale=#{locale}"
41
43
  env = SgtnClient::Config.default_environment
42
44
  SgtnClient::Config.configurations.default = locale
43
45
  source_bundle = SgtnClient::Config.configurations[env]["source_bundle"]
44
- SgtnClient.logger.debug "Loading [" + locale + "] source bundles from path: " + source_bundle
45
- Dir.children(source_bundle).each do |component|
46
+ Dir.foreach(source_bundle) do |component|
47
+ next if component == '.' || component == '..'
46
48
  yamlfile = File.join(source_bundle, component + "/" + locale + ".yml")
47
- bundle = read_yml(yamlfile)
49
+ bundle = SgtnClient::FileUtil.read_yml(yamlfile)
48
50
  cachekey = SgtnClient::CacheUtil.get_cachekey(component, locale)
49
51
  SgtnClient::CacheUtil.write_cache(cachekey,bundle)
50
52
  end
@@ -52,23 +54,18 @@ module SgtnClient
52
54
 
53
55
  private
54
56
  def self.getBundle(component, locale)
57
+ SgtnClient.logger.debug "[Source][getBundle]component=#{component}, locale=#{locale}"
55
58
  env = SgtnClient::Config.default_environment
56
59
  source_bundle = SgtnClient::Config.configurations[env]["source_bundle"]
57
60
  bundlepath = source_bundle + "/" + component + "/" + locale + ".yml"
58
- SgtnClient.logger.debug "Getting source from bundle: " + bundlepath
59
61
  begin
60
- bundle = read_yml(bundlepath)
62
+ bundle = SgtnClient::FileUtil.read_yml(bundlepath)
61
63
  rescue => exception
62
64
  SgtnClient.logger.error exception.message
63
65
  end
64
66
  return bundle
65
67
  end
66
68
 
67
- def self.read_yml(file_name)
68
- erb = ERB.new(File.read(file_name))
69
- erb.filename = file_name
70
- YAML.load(erb.result)
71
- end
72
69
  end
73
70
 
74
71
  end
@@ -12,30 +12,38 @@ module SgtnClient
12
12
  class Translation
13
13
 
14
14
  def self.getString(component, key, locale)
15
- flocale = SgtnClient::LocaleUtil.fallback(locale)
16
- cache_key = SgtnClient::CacheUtil.get_cachekey(component, flocale)
17
- items = SgtnClient::CacheUtil.get_cache(cache_key)
18
- if items.nil?
19
- items = getTranslations(component, flocale)
20
- SgtnClient::CacheUtil.write_cache(cache_key, items)
21
- else
22
- SgtnClient.logger.debug "Getting translations from cache with key: " + cache_key
15
+ SgtnClient.logger.debug "[Translation.getString]component: #{component}, key: #{key}, locale: #{locale}"
16
+ str = getTranslation(component, key, locale)
17
+ if str.nil?
18
+ str = SgtnClient::Source.getSource(component, key, SgtnClient::Config.configurations.default)
19
+ if str.nil?
20
+ SgtnClient.logger.debug "[Translation][getString] Missing source string with key: #{key}, component: #{component}, locale: #{locale}"
21
+ end
23
22
  end
23
+ str
24
+ end
24
25
 
25
- default = SgtnClient::Config.configurations.default
26
- if items.nil? || items["messages"] == nil
27
- return SgtnClient::Source.getSource(component, key, default)
28
- end
29
- str = items["messages"][key]
26
+ def self.getString_p(component, key, plural_args, locale)
27
+ SgtnClient.logger.debug "[Translation][getString_p]component=#{component}, key=#{key}, locale=#{locale}"
28
+ str = getTranslation(component, key, locale)
30
29
  if str.nil?
31
- return SgtnClient::Source.getSource(component, key, default)
30
+ str = SgtnClient::Source.getSource(component, key, SgtnClient::Config.configurations.default)
31
+ if str.nil?
32
+ SgtnClient.logger.debug "[Translation][getString_p] Missing source string with key: #{key}, component: #{component}, locale: #{locale}"
33
+ return nil
34
+ end
35
+ str.to_plural_s(:en, plural_args)
32
36
  else
33
- return str
37
+ str.to_plural_s(locale, plural_args)
34
38
  end
35
- end
39
+ end
36
40
 
37
- def self.getString_f(component, key, args, locale)
38
- s = getString(component, key, locale)
41
+ def self.getString_f(component, key, args, locale, *optionals)
42
+ SgtnClient.logger.debug "[Translation][getString_f]component=#{component}, key=#{key}, locale=#{locale}"
43
+ s = getString(component, key, locale, *optionals)
44
+ if s.nil?
45
+ return nil
46
+ end
39
47
  if args.is_a?(Hash)
40
48
  args.each do |source, arg|
41
49
  s.gsub! "{#{source}}", arg
@@ -47,24 +55,20 @@ module SgtnClient
47
55
  end
48
56
 
49
57
  def self.getStrings(component, locale)
50
- flocale = SgtnClient::LocaleUtil.fallback(locale)
51
- cache_key = SgtnClient::CacheUtil.get_cachekey(component, flocale)
52
- items = SgtnClient::CacheUtil.get_cache(cache_key)
53
- if items.nil?
54
- items = getTranslations(component, flocale)
55
- SgtnClient::CacheUtil.write_cache(cache_key, items)
56
- else
57
- SgtnClient.logger.debug "Getting translations from cache with key: " + cache_key
58
- end
59
-
58
+ SgtnClient.logger.debug "[Translation][getStrings]component=#{component}, locale=#{locale}"
59
+ items = get_cs(component, locale)
60
60
  default = SgtnClient::Config.configurations.default
61
61
  if items.nil? || items["messages"] == nil
62
62
  items = {}
63
63
  s = SgtnClient::Source.getSources(component, default)
64
- default_component, value = s.first
65
- items["component"] = default_component
66
- items["messages"] = value
67
- items["locale"] = 'source'
64
+ if s.nil?
65
+ SgtnClient.logger.error "[Translation][getStrings] Missing component: #{component}, locale: #{locale}"
66
+ else
67
+ default_component, value = s.first
68
+ items["component"] = component
69
+ items["messages"] = value
70
+ items["locale"] = 'source'
71
+ end
68
72
  end
69
73
  return items
70
74
  end
@@ -72,40 +76,61 @@ module SgtnClient
72
76
 
73
77
  private
74
78
 
75
- def self.getTranslations(component, locale)
79
+ def self.getTranslation(component, key, locale)
80
+ items = get_cs(component, locale)
81
+ if items.nil? || items["messages"] == nil
82
+ nil
83
+ else
84
+ items["messages"][key]
85
+ end
86
+ end
87
+
88
+ def self.get_cs(component, locale)
89
+ flocale = SgtnClient::LocaleUtil.fallback(locale)
90
+ cache_key = SgtnClient::CacheUtil.get_cachekey(component, flocale)
91
+ SgtnClient.logger.debug "[Translation][get_cs]cache_key=#{cache_key}"
92
+ expired, items = SgtnClient::CacheUtil.get_cache(cache_key)
93
+ if items.nil? || expired
94
+ items = load(component, flocale)
95
+ if items.nil?
96
+ items = SgtnClient::Source.getSources(component, SgtnClient::Config.configurations.default)
97
+ SgtnClient::Core::Cache.put(cache_key, items, 60)
98
+ else
99
+ SgtnClient::CacheUtil.write_cache(cache_key, items)
100
+ end
101
+ else
102
+ SgtnClient.logger.debug "[Translation]get translations from cache with key: " + cache_key
103
+ end
104
+
105
+ return items
106
+ end
107
+
108
+ def self.load(component, locale)
76
109
  env = SgtnClient::Config.default_environment
77
110
  mode = SgtnClient::Config.configurations[env]["bundle_mode"]
111
+ SgtnClient.logger.debug "[Translation][load]mode=#{mode}"
78
112
  if mode == 'offline'
79
- return get_offbundle(component, locale)
113
+ return load_o(component, locale)
80
114
  else
81
- return get_server(component, locale)
115
+ return load_s(component, locale)
82
116
  end
83
117
  end
84
118
 
85
- def self.get_offbundle(component, locale)
119
+ def self.load_o(component, locale)
86
120
  env = SgtnClient::Config.default_environment
87
121
  product_name = SgtnClient::Config.configurations[env]["product_name"]
88
122
  version = SgtnClient::Config.configurations[env]["version"].to_s
89
123
  translation_bundle = SgtnClient::Config.configurations[env]["translation_bundle"]
90
124
  bundlepath = translation_bundle + "/" + product_name + "/" + version + "/" + component + "/messages_" + locale + ".json"
91
- SgtnClient.logger.debug "Getting translations from offline bundle: " + bundlepath
92
- begin
93
- file = File.read(bundlepath)
94
- data_hash = MultiJson.load(file)
95
- rescue => exception
96
- SgtnClient.logger.error exception.message
97
- end
98
- return data_hash
125
+ SgtnClient::FileUtil.read_json(bundlepath)
99
126
  end
100
127
 
101
- def self.get_server(component, locale)
128
+ def self.load_s(component, locale)
102
129
  env = SgtnClient::Config.default_environment
103
130
  product_name = SgtnClient::Config.configurations[env]["product_name"]
104
131
  vip_server = SgtnClient::Config.configurations[env]["vip_server"]
105
- SgtnClient.logger.debug "Getting translations from server: " + vip_server
106
132
  version = SgtnClient::Config.configurations[env]["version"].to_s
107
133
  url = vip_server + "/i18n/api/v2/translation/products/" + product_name + "/versions/" + version + "/locales/" + locale + "/components/" + component+ "?checkTranslationStatus=false&machineTranslation=false&pseudo=false"
108
- SgtnClient.logger.debug url
109
134
  begin
110
135
  obj = SgtnClient::Core::Request.get(url)
111
136
  rescue => exception
@@ -0,0 +1,4 @@
1
+ require 'sgtn-client/cldr/localized_datetime'
2
+ require 'sgtn-client/cldr/localized_date'
3
+ require 'sgtn-client/cldr/localized_time'
4
+ require 'sgtn-client/cldr/localized_str'
@@ -0,0 +1,27 @@
1
+ require 'date'
2
+ require 'time'
3
+
4
+ Date.class_eval <<-LOCALIZE, __FILE__, __LINE__ + 1
5
+ def l_full_s(locale = TwitterCldr.locale)
6
+ self.to_datetime().localize(locale).to_date().to_full_s
7
+ end
8
+ LOCALIZE
9
+
10
+ Date.class_eval <<-LOCALIZE, __FILE__, __LINE__ + 1
11
+ def l_long_s(locale = TwitterCldr.locale)
12
+ self.to_datetime().localize(locale).to_date().to_long_s
13
+ end
14
+ LOCALIZE
15
+
16
+ Date.class_eval <<-LOCALIZE, __FILE__, __LINE__ + 1
17
+ def l_medium_s(locale = TwitterCldr.locale)
18
+ self.to_datetime().localize(locale).to_date().to_medium_s
19
+ end
20
+ LOCALIZE
21
+
22
+
23
+ Date.class_eval <<-LOCALIZE, __FILE__, __LINE__ + 1
24
+ def l_short_s(locale = TwitterCldr.locale)
25
+ self.to_datetime().localize(locale).to_date().to_short_s
26
+ end
27
+ LOCALIZE
@@ -0,0 +1,63 @@
1
+ require 'date'
2
+ require 'time'
3
+
4
+ DateTime.class_eval <<-LOCALIZE, __FILE__, __LINE__ + 2
5
+ def l_full_s(locale = TwitterCldr.locale, *args)
6
+ timezone = args[0]
7
+ display_name = args[1]
8
+ if timezone.nil?
9
+ self.localize(locale).to_full_s
10
+ elsif display_name.nil?
11
+ self.localize(locale).with_timezone(timezone).to_full_s
12
+ else
13
+ tz = TwitterCldr::Timezones::Timezone.instance(timezone, locale)
14
+ tz.display_name_for(self, display_name)
15
+ end
16
+ end
17
+ LOCALIZE
18
+
19
+ DateTime.class_eval <<-LOCALIZE, __FILE__, __LINE__ + 1
20
+ def l_long_s(locale = TwitterCldr.locale, *args)
21
+ timezone = args[0]
22
+ display_name = args[1]
23
+ if timezone.nil?
24
+ self.localize(locale).to_long_s
25
+ elsif display_name.nil?
26
+ self.localize(locale).with_timezone(timezone).to_long_s
27
+ else
28
+ tz = TwitterCldr::Timezones::Timezone.instance(timezone, locale)
29
+ tz.display_name_for(self, display_name)
30
+ end
31
+ end
32
+ LOCALIZE
33
+
34
+ DateTime.class_eval <<-LOCALIZE, __FILE__, __LINE__ + 1
35
+ def l_medium_s(locale = TwitterCldr.locale, *args)
36
+ timezone = args[0]
37
+ display_name = args[1]
38
+ if timezone.nil?
39
+ self.localize(locale).to_medium_s
40
+ elsif display_name.nil?
41
+ self.localize(locale).with_timezone(timezone).to_medium_s
42
+ else
43
+ tz = TwitterCldr::Timezones::Timezone.instance(timezone, locale)
44
+ tz.display_name_for(self, display_name)
45
+ end
46
+ end
47
+ LOCALIZE
48
+
49
+
50
+ DateTime.class_eval <<-LOCALIZE, __FILE__, __LINE__ + 1
51
+ def l_short_s(locale = TwitterCldr.locale, *args)
52
+ timezone = args[0]
53
+ display_name = args[1]
54
+ if timezone.nil?
55
+ self.localize(locale).to_short_s
56
+ elsif display_name.nil?
57
+ self.localize(locale).with_timezone(timezone).to_short_s
58
+ else
59
+ tz = TwitterCldr::Timezones::Timezone.instance(timezone, locale)
60
+ tz.display_name_for(self, display_name)
61
+ end
62
+ end
63
+ LOCALIZE
@@ -0,0 +1,11 @@
1
+
2
+ String.class_eval <<-LOCALIZE, __FILE__, __LINE__ + 1
3
+ def to_plural_s(locale, arg)
4
+ num_str = SgtnClient::Formatters::PluralFormatter.new(locale).num_s(self, arg)
5
+ if num_str.nil? || num_str.empty?
6
+ self.localize(locale) % arg
7
+ else
8
+ num_str
9
+ end
10
+ end
11
+ LOCALIZE
@@ -0,0 +1,27 @@
1
+ require 'date'
2
+ require 'time'
3
+
4
+ Time.class_eval <<-LOCALIZE, __FILE__, __LINE__ + 1
5
+ def l_full_s(locale = TwitterCldr.locale)
6
+ self.localize(locale).to_full_s
7
+ end
8
+ LOCALIZE
9
+
10
+ Time.class_eval <<-LOCALIZE, __FILE__, __LINE__ + 1
11
+ def l_long_s(locale = TwitterCldr.locale)
12
+ self.localize(locale).to_long_s
13
+ end
14
+ LOCALIZE
15
+
16
+ Time.class_eval <<-LOCALIZE, __FILE__, __LINE__ + 1
17
+ def l_medium_s(locale = TwitterCldr.locale)
18
+ self.localize(locale).to_medium_s
19
+ end
20
+ LOCALIZE
21
+
22
+
23
+ Time.class_eval <<-LOCALIZE, __FILE__, __LINE__ + 1
24
+ def l_short_s(locale = TwitterCldr.locale)
25
+ self.localize(locale).to_short_s
26
+ end
27
+ LOCALIZE
@@ -5,78 +5,95 @@ module SgtnClient::Core
5
5
  Entry = Struct.new(:expiry, :value)
6
6
 
7
7
  def self.initialize(disabled=false, opts={})
8
- $opts = opts
9
- SgtnClient.logger.debug "Initialize cache......"
8
+ @@opts = opts
9
+ @mutex = Mutex.new
10
10
  if disabled == false
11
- $data = Hash.new
12
- SgtnClient.logger.debug "Cache is enabled!"
11
+ @@data = Hash.new
12
+ SgtnClient.logger.debug "[Cache][initialize]cache is enabled!"
13
13
  else
14
- SgtnClient.logger.debug "Cache is disabled!"
14
+ @@data = nil
15
+ SgtnClient.logger.debug "[Cache][initialize]cache is disabled!"
15
16
  end
16
17
  end
17
18
 
18
19
  def self.keys
19
- if $data == nil
20
+ if @@data == nil
20
21
  return nil
21
22
  end
22
- SgtnClient.logger.debug "Get cache keys"
23
- $data.keys
23
+ SgtnClient.logger.debug "[Cache][keys]get cache keys"
24
+ @@data.keys
24
25
  end
25
26
 
26
27
  def self.get(key)
27
- if $data == nil
28
- return nil
28
+ if @@data == nil
29
+ return nil, nil
29
30
  end
30
- SgtnClient.logger.debug "Get cache for key: " + key
31
- invalidate
32
- $data[key][:value] if has(key)
31
+ SgtnClient.logger.debug "[Cache][get]get cache for key: " + key
32
+ invalidate(key)
33
33
  end
34
34
 
35
35
  def self.has(key)
36
- if $data == nil
36
+ if @@data == nil
37
37
  return nil
38
38
  end
39
- SgtnClient.logger.debug "Has cache for key: " + key
40
- $data.has_key? key
39
+ SgtnClient.logger.debug "[Cache][has]check if the cache has key: #{(@@data.has_key? key)}"
40
+ @@data.has_key? key
41
41
  end
42
42
 
43
43
  def self.put(key, value, ttl=nil)
44
- if $data == nil
45
- return nil
44
+ @mutex.synchronize do
45
+ if @@data == nil || value == nil
46
+ return nil
47
+ end
48
+ ttl ||= @@opts[:ttl]
49
+ # hours from new
50
+ SgtnClient.logger.debug "[Cache][put]put cache for key '" + key + "' with expired time at'" + (Time.now + ttl*60).to_s
51
+ @@data[key] = Entry.new(Time.now + ttl*60, value)
46
52
  end
47
- ttl ||= @opts[:ttl]
48
- # hours from new
49
- SgtnClient.logger.debug "Put cache for key '" + key + "' with expired time at'" + (Time.now + ttl*60).to_s
50
- $data[key] = Entry.new(Time.now + ttl*60, value)
51
53
  end
52
54
 
53
55
  def self.delete(key)
54
- if $data == nil
55
- return nil
56
+ @mutex.synchronize do
57
+ if @@data == nil
58
+ return nil
59
+ end
60
+ SgtnClient.logger.debug "[Cache][delete]delete cache for key: " + key
61
+ @@data.delete key
56
62
  end
57
- SgtnClient.logger.debug "Delete cache for key: " + key
58
- $data.delete key
59
63
  end
60
64
 
61
65
  def self.clear
62
- if $data == nil
63
- return nil
66
+ @mutex.synchronize do
67
+ if @@data == nil
68
+ return nil
69
+ end
70
+ SgtnClient.logger.debug "[Cache][clear]clear cache!"
71
+ @@data = Hash.new
64
72
  end
65
- SgtnClient.logger.debug "Clear cache!"
66
- $data = Hash.new
67
73
  end
68
74
 
69
- def self.invalidate
70
- if $data == nil
71
- return nil
75
+ def self.invalidate(key)
76
+ @mutex.synchronize do
77
+ if @@data == nil
78
+ return nil, nil
79
+ end
80
+ SgtnClient.logger.debug "[Cache][invalidate]invalidate expired cache......"
81
+ now = Time.now
82
+ if has(key)
83
+ v = @@data[key]
84
+ expired = false
85
+ SgtnClient.logger.debug "[Cache][invalidate]check cache: key=#{key}, expiredtime=#{v[:expiry]}, now=#{now}, expired=#{(v[:expiry] < now)}"
86
+ if v[:expiry] < now
87
+ SgtnClient.logger.debug "[Cache][invalidate]before deleting the cache: data=#{@@data}"
88
+ @@data.delete(key)
89
+ SgtnClient.logger.debug "[Cache][invalidate]after deleting the cache: data=#{@@data}"
90
+ expired = true
91
+ end
92
+ return expired, v[:value]
93
+ else
94
+ return nil, nil
95
+ end
72
96
  end
73
- SgtnClient.logger.debug "Invalidating expired cache......"
74
- now = Time.now
75
- $data.each {
76
- |k, v|
77
- SgtnClient.logger.debug "Checking cache: key=#{k}, expiredtime=#{v[:expiry]}, now=#{now}, expired=#{(v[:expiry] < now)}"
78
- }
79
- $data.delete_if {|k, v| v[:expiry] < now}
80
97
  end
81
98
  end
82
99
 
@@ -40,7 +40,7 @@ module SgtnClient
40
40
  :rest_endpoint, :rest_token_endpoint, :client_id, :client_secret,
41
41
  :openid_endpoint, :openid_redirect_uri, :openid_client_id, :openid_client_secret,
42
42
  :verbose_logging, :product_name, :version, :vip_server, :bundle_mode,
43
- :translation_bundle, :source_bundle, :cache_expiry_period, :disable_cache
43
+ :translation_bundle, :source_bundle, :cache_expiry_period, :disable_cache, :default_language
44
44
 
45
45
 
46
46
  # Create Config object
@@ -4,7 +4,11 @@ require 'multi_json'
4
4
  module SgtnClient::Core
5
5
  class Request
6
6
  def self.get(url)
7
- res = RestClient.get(url)
7
+ SgtnClient.logger.debug "[Request][get]url=#{url}"
8
+ res = RestClient::Resource.new(
9
+ url,
10
+ :verify_ssl => false
11
+ ).get
8
12
  begin
9
13
  obj = MultiJson.load(res)
10
14
  rescue MultiJson::ParseError => exception
@@ -0,0 +1,38 @@
1
+ require 'json'
2
+
3
+ module SgtnClient
4
+ module Formatters
5
+ class PluralFormatter
6
+
7
+ attr_reader :locale
8
+
9
+ def initialize(locale = TwitterCldr.locale)
10
+ @locale = TwitterCldr.convert_locale(locale)
11
+ end
12
+
13
+ def num_s(string, replacements)
14
+ reg = Regexp.union(
15
+ /%<(\{.*?\})>/
16
+ )
17
+ string.gsub(reg) do
18
+ count_placeholder, patterns = if $1
19
+ pluralization_hash = JSON.parse($1)
20
+ if pluralization_hash.is_a?(Hash) && pluralization_hash.size == 1
21
+ pluralization_hash.first
22
+ else
23
+ raise ArgumentError.new('expected a Hash with a single key')
24
+ end
25
+ else
26
+ raise ArgumentError.new('invalide format')
27
+ end
28
+ count = replacements[count_placeholder.to_sym].to_s
29
+ if patterns.is_a?(Hash)
30
+ return TwitterCldr::Utils.deep_symbolize_keys(patterns)[count.to_sym]
31
+ else
32
+ raise ArgumentError.new('expected patterns to be a Hash')
33
+ end
34
+ end
35
+ end
36
+ end
37
+ end
38
+ end
@@ -11,6 +11,12 @@ module SgtnClient
11
11
  autoload :Exceptions, "sgtn-client/core/exceptions"
12
12
  autoload :ValidateUtil, "sgtn-client/util/validate-util"
13
13
  autoload :LocaleUtil, "sgtn-client/util/locale-util"
14
+ autoload :FileUtil, "sgtn-client/util/file-util"
15
+
16
+ module Formatters
17
+ autoload :PluralFormatter, "sgtn-client/formatters/plurals/plural_formatter"
18
+ end
19
+
14
20
 
15
21
  class << self
16
22
  def configure(options = {}, &block)
@@ -32,6 +38,7 @@ module SgtnClient
32
38
 
33
39
  # create log file
34
40
  file = './sgtnclient_d.log'
41
+ SgtnClient.logger.debug "[Client][load]create log file=#{file}"
35
42
  if args[2] != nil
36
43
  file = args[2]
37
44
  end
@@ -42,7 +49,7 @@ module SgtnClient
42
49
  # Set log level for sandbox mode
43
50
  env = SgtnClient::Config.default_environment
44
51
  mode = SgtnClient::Config.configurations[env]["mode"]
45
- SgtnClient.logger.info "Current mode is: " + mode
52
+ SgtnClient.logger.debug "[Client][load]set log level, mode=#{mode}"
46
53
  if mode == 'sandbox'
47
54
  SgtnClient.logger.level = Logger::DEBUG
48
55
  else
@@ -51,6 +58,7 @@ module SgtnClient
51
58
 
52
59
  # initialize cache
53
60
  disable_cache = SgtnClient::Config.configurations[env]["disable_cache"]
61
+ SgtnClient.logger.debug "[Client][load]cache initialize, disable_cache=#{disable_cache}"
54
62
  if disable_cache != nil
55
63
  SgtnClient::Core::Cache.initialize(disable_cache)
56
64
  else
@@ -10,21 +10,27 @@ module SgtnClient
10
10
  class CacheUtil
11
11
 
12
12
  def self.get_cache(cache_key)
13
- items = SgtnClient::Core::Cache.get(cache_key)
14
- return items
13
+ expired, items = SgtnClient::Core::Cache.get(cache_key)
14
+ SgtnClient.logger.debug "[CacheUtil]get cache with key #{cache_key}, expired #{expired}"
15
+ return expired, items
15
16
  end
16
17
 
17
18
  def self.clear_cache()
18
19
  SgtnClient::Core::Cache.clear()
20
+ SgtnClient.logger.debug "[CacheUtil]clear cache"
19
21
  end
20
22
 
21
23
  def self.write_cache(cache_key, items)
24
+ if items.nil?
25
+ return nil
26
+ end
22
27
  env = SgtnClient::Config.default_environment
23
28
  cache_expiry_period = SgtnClient::Config.configurations[env]["cache_expiry_period"]
24
29
  # expired after 24 hours
25
30
  if cache_expiry_period == nil
26
31
  cache_expiry_period = 24*60
27
32
  end
33
+ SgtnClient.logger.debug "[CacheUtil]write cache with key #{cache_key}, cache_expiry_period #{cache_expiry_period}, itmes #{items}"
28
34
  SgtnClient::Core::Cache.put(cache_key, items, cache_expiry_period)
29
35
  end
30
36
 
@@ -32,7 +38,13 @@ module SgtnClient
32
38
  env = SgtnClient::Config.default_environment
33
39
  product_name = SgtnClient::Config.configurations[env]["product_name"]
34
40
  version = SgtnClient::Config.configurations[env]["version"].to_s
35
- return product_name + "_" + version + "_" + component + "_" + locale
41
+ default_l = SgtnClient::Config.configurations[env]["default_language"]
42
+ if default_l == nil
43
+ default_l = 'en'
44
+ end
45
+ lc = locale == default_l ? SgtnClient::Config.configurations.default: locale
46
+ SgtnClient.logger.debug "[CacheUtil]get cache key: #{lc}"
47
+ return product_name + "_" + version + "_" + component + "_" + lc
36
48
  end
37
49
  end
38
50
 
@@ -0,0 +1,34 @@
1
+ require 'erb'
2
+ require 'yaml'
3
+
4
+ module SgtnClient
5
+
6
+ class FileUtil
7
+
8
+ @mutex = Mutex.new
9
+
10
+ def self.read_json(bundlepath)
11
+ SgtnClient.logger.debug "[FileUtil]read json file from: " + bundlepath
12
+ @mutex.synchronize do
13
+ data_hash = nil
14
+ begin
15
+ file = File.read(bundlepath)
16
+ data_hash = MultiJson.load(file)
17
+ rescue => exception
18
+ SgtnClient.logger.error exception.message
19
+ end
20
+ return data_hash
21
+ end
22
+ end
23
+
24
+ def self.read_yml(file_name)
25
+ SgtnClient.logger.debug "[FileUtil]read yml file from: " + file_name
26
+ @mutex.synchronize do
27
+ erb = ERB.new(File.read(file_name))
28
+ erb.filename = file_name
29
+ YAML.load(erb.result)
30
+ end
31
+ end
32
+ end
33
+
34
+ end
@@ -4,8 +4,8 @@ module SgtnClient
4
4
  class ValidateUtil
5
5
 
6
6
  def self.validate_config()
7
- SgtnClient.logger.debug "-----------Start to validate configuration's setting itmes-----------"
8
7
  env = SgtnClient::Config.default_environment
8
+ SgtnClient.logger.debug "[ValidateUtil][validate_config] env = #{env}"
9
9
  messages = "\n"
10
10
 
11
11
  mode = SgtnClient::Config.configurations[env]["mode"]
@@ -36,7 +36,6 @@ module SgtnClient
36
36
  if messages != "\n"
37
37
  raise SgtnClient::Exceptions::MissingConfig.new(messages)
38
38
  end
39
- SgtnClient.logger.debug "-----------End to validate configuration's setting itmes-----------"
40
39
  end
41
40
 
42
41
  end
@@ -1,2 +1,3 @@
1
1
  require "sgtn-client/sgtn-client"
2
-
2
+ require 'sgtn-client/cldr/core_ext'
3
+ require 'twitter_cldr'
data/lib/version.rb CHANGED
@@ -1,3 +1,3 @@
1
1
 
2
- VERSION_INFO = [0, 1, 7].freeze
2
+ VERSION_INFO = [0, 2, 1].freeze
3
3
  VERSION = VERSION_INFO.map(&:to_s).join('.').freeze
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: singleton-client
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.7.0
4
+ version: 0.7.4
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: 2021-11-18 00:00:00.000000000 Z
11
+ date: 2022-02-15 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: rest-client
@@ -52,6 +52,20 @@ dependencies:
52
52
  - - "~>"
53
53
  - !ruby/object:Gem::Version
54
54
  version: '1.1'
55
+ - !ruby/object:Gem::Dependency
56
+ name: twitter_cldr
57
+ requirement: !ruby/object:Gem::Requirement
58
+ requirements:
59
+ - - "~>"
60
+ - !ruby/object:Gem::Version
61
+ version: '6.6'
62
+ type: :development
63
+ prerelease: false
64
+ version_requirements: !ruby/object:Gem::Requirement
65
+ requirements:
66
+ - - "~>"
67
+ - !ruby/object:Gem::Version
68
+ version: '6.6'
55
69
  - !ruby/object:Gem::Dependency
56
70
  name: webmock
57
71
  requirement: !ruby/object:Gem::Requirement
@@ -230,6 +244,20 @@ dependencies:
230
244
  - - "~>"
231
245
  - !ruby/object:Gem::Version
232
246
  version: '1.0'
247
+ - !ruby/object:Gem::Dependency
248
+ name: twitter_cldr
249
+ requirement: !ruby/object:Gem::Requirement
250
+ requirements:
251
+ - - "~>"
252
+ - !ruby/object:Gem::Version
253
+ version: '6.6'
254
+ type: :runtime
255
+ prerelease: false
256
+ version_requirements: !ruby/object:Gem::Requirement
257
+ requirements:
258
+ - - "~>"
259
+ - !ruby/object:Gem::Version
260
+ version: '6.6'
233
261
  description: Singleton Ruby client
234
262
  email: g11n-vip-project@vmware.com
235
263
  executables: []
@@ -241,13 +269,20 @@ files:
241
269
  - lib/sgtn-client/api/source.rb
242
270
  - lib/sgtn-client/api/t.rb
243
271
  - lib/sgtn-client/api/translation.rb
272
+ - lib/sgtn-client/cldr/core_ext.rb
273
+ - lib/sgtn-client/cldr/localized_date.rb
274
+ - lib/sgtn-client/cldr/localized_datetime.rb
275
+ - lib/sgtn-client/cldr/localized_str.rb
276
+ - lib/sgtn-client/cldr/localized_time.rb
244
277
  - lib/sgtn-client/core/cache.rb
245
278
  - lib/sgtn-client/core/config.rb
246
279
  - lib/sgtn-client/core/exceptions.rb
247
280
  - lib/sgtn-client/core/logging.rb
248
281
  - lib/sgtn-client/core/request.rb
282
+ - lib/sgtn-client/formatters/plurals/plural_formatter.rb
249
283
  - lib/sgtn-client/sgtn-client.rb
250
284
  - lib/sgtn-client/util/cache-util.rb
285
+ - lib/sgtn-client/util/file-util.rb
251
286
  - lib/sgtn-client/util/locale-util.rb
252
287
  - lib/sgtn-client/util/validate-util.rb
253
288
  - lib/singleton-ruby.rb