singleton-client 0.7.1 → 0.7.2
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 +4 -4
- data/lib/sgtn-client/api/source.rb +11 -14
- data/lib/sgtn-client/api/translation.rb +37 -26
- data/lib/sgtn-client/cldr/localized_datetime.rb +45 -9
- data/lib/sgtn-client/core/cache.rb +32 -23
- data/lib/sgtn-client/core/request.rb +5 -1
- data/lib/sgtn-client/sgtn-client.rb +1 -0
- data/lib/sgtn-client/util/file-util.rb +32 -0
- data/lib/version.rb +1 -1
- metadata +3 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 7b866f4160d99e04ac3140bf8da0e7f15abf5db1fac6360d2e5d8f8a6c392eb8
|
4
|
+
data.tar.gz: 7e4977b0480ef04e774a2891fafee6d6b76fc1abbafd436e718f9846c138d545
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: e34e259dbf04c59adb5ab96e3fde9d73a3918f9a7d284e5a33313185c1e6afbd25e43c850e3eedabbdb8602c6b32bbdb3cb76efee3536d1d7d615ddd43e94316
|
7
|
+
data.tar.gz: 73f14c209b98942d919c6037b31dd5f14ac44350609e8ab42d7afdc75098a42072794b40266145c44080c936c1a90aa86b7cea4d6e2b85053d30bf2db7d22324
|
@@ -1,5 +1,3 @@
|
|
1
|
-
require 'erb'
|
2
|
-
require 'yaml'
|
3
1
|
|
4
2
|
module SgtnClient
|
5
3
|
|
@@ -17,11 +15,14 @@ module SgtnClient
|
|
17
15
|
else
|
18
16
|
SgtnClient.logger.debug "Getting sources from cache with key: " + cache_key
|
19
17
|
end
|
20
|
-
|
21
|
-
|
18
|
+
s = items[locale][key]
|
19
|
+
if items.nil? || s.nil?
|
20
|
+
SgtnClient.logger.debug "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)
|
@@ -42,9 +43,10 @@ module SgtnClient
|
|
42
43
|
SgtnClient::Config.configurations.default = locale
|
43
44
|
source_bundle = SgtnClient::Config.configurations[env]["source_bundle"]
|
44
45
|
SgtnClient.logger.debug "Loading [" + locale + "] source bundles from path: " + source_bundle
|
45
|
-
Dir.
|
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
|
@@ -57,18 +59,13 @@ module SgtnClient
|
|
57
59
|
bundlepath = source_bundle + "/" + component + "/" + locale + ".yml"
|
58
60
|
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,25 @@ module SgtnClient
|
|
12
12
|
class Translation
|
13
13
|
|
14
14
|
def self.getString(component, key, locale)
|
15
|
-
|
16
|
-
|
17
|
-
|
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
|
+
str = getTranslation(component, key, locale)
|
16
|
+
if str.nil?
|
17
|
+
str = SgtnClient::Source.getSource(component, key, SgtnClient::Config.configurations.default)
|
23
18
|
end
|
19
|
+
str
|
20
|
+
end
|
24
21
|
|
25
|
-
|
26
|
-
|
27
|
-
return SgtnClient::Source.getSource(component, key, default)
|
28
|
-
end
|
29
|
-
str = items["messages"][key]
|
22
|
+
def self.getString_p(component, key, plural_args, locale)
|
23
|
+
str = getTranslation(component, key, locale)
|
30
24
|
if str.nil?
|
31
|
-
|
25
|
+
str = SgtnClient::Source.getSource(component, key, SgtnClient::Config.configurations.default)
|
26
|
+
str.to_plural_s(:en, plural_args)
|
32
27
|
else
|
33
|
-
|
28
|
+
str.to_plural_s(locale, plural_args)
|
34
29
|
end
|
35
|
-
|
30
|
+
end
|
36
31
|
|
37
|
-
def self.getString_f(component, key, args, locale)
|
38
|
-
s = getString(component, key, locale)
|
32
|
+
def self.getString_f(component, key, args, locale, *optionals)
|
33
|
+
s = getString(component, key, locale, *optionals)
|
39
34
|
if args.is_a?(Hash)
|
40
35
|
args.each do |source, arg|
|
41
36
|
s.gsub! "{#{source}}", arg
|
@@ -62,7 +57,7 @@ module SgtnClient
|
|
62
57
|
items = {}
|
63
58
|
s = SgtnClient::Source.getSources(component, default)
|
64
59
|
default_component, value = s.first
|
65
|
-
items["component"] =
|
60
|
+
items["component"] = component
|
66
61
|
items["messages"] = value
|
67
62
|
items["locale"] = 'source'
|
68
63
|
end
|
@@ -72,6 +67,28 @@ module SgtnClient
|
|
72
67
|
|
73
68
|
private
|
74
69
|
|
70
|
+
def self.getTranslation(component, key, locale)
|
71
|
+
flocale = SgtnClient::LocaleUtil.fallback(locale)
|
72
|
+
cache_key = SgtnClient::CacheUtil.get_cachekey(component, flocale)
|
73
|
+
items = SgtnClient::CacheUtil.get_cache(cache_key)
|
74
|
+
if items.nil?
|
75
|
+
items = getTranslations(component, flocale)
|
76
|
+
if items.nil?
|
77
|
+
items = SgtnClient::Source.getSources(component, SgtnClient::Config.configurations.default)
|
78
|
+
SgtnClient::Core::Cache.put(cache_key, items, 60)
|
79
|
+
else
|
80
|
+
SgtnClient::CacheUtil.write_cache(cache_key, items)
|
81
|
+
end
|
82
|
+
else
|
83
|
+
SgtnClient.logger.debug "Getting translations from cache with key: " + cache_key
|
84
|
+
end
|
85
|
+
if items.nil? || items["messages"] == nil
|
86
|
+
nil
|
87
|
+
else
|
88
|
+
items["messages"][key]
|
89
|
+
end
|
90
|
+
end
|
91
|
+
|
75
92
|
def self.getTranslations(component, locale)
|
76
93
|
env = SgtnClient::Config.default_environment
|
77
94
|
mode = SgtnClient::Config.configurations[env]["bundle_mode"]
|
@@ -89,13 +106,7 @@ module SgtnClient
|
|
89
106
|
translation_bundle = SgtnClient::Config.configurations[env]["translation_bundle"]
|
90
107
|
bundlepath = translation_bundle + "/" + product_name + "/" + version + "/" + component + "/messages_" + locale + ".json"
|
91
108
|
SgtnClient.logger.debug "Getting translations from offline bundle: " + bundlepath
|
92
|
-
|
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
|
109
|
+
SgtnClient::FileUtil.read_json(bundlepath)
|
99
110
|
end
|
100
111
|
|
101
112
|
def self.get_server(component, locale)
|
@@ -1,27 +1,63 @@
|
|
1
1
|
require 'date'
|
2
2
|
require 'time'
|
3
3
|
|
4
|
-
DateTime.class_eval <<-LOCALIZE, __FILE__, __LINE__ +
|
5
|
-
def l_full_s(locale = TwitterCldr.locale)
|
6
|
-
|
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
|
7
16
|
end
|
8
17
|
LOCALIZE
|
9
18
|
|
10
19
|
DateTime.class_eval <<-LOCALIZE, __FILE__, __LINE__ + 1
|
11
|
-
def l_long_s(locale = TwitterCldr.locale)
|
12
|
-
|
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
|
13
31
|
end
|
14
32
|
LOCALIZE
|
15
33
|
|
16
34
|
DateTime.class_eval <<-LOCALIZE, __FILE__, __LINE__ + 1
|
17
|
-
def l_medium_s(locale = TwitterCldr.locale)
|
18
|
-
|
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
|
19
46
|
end
|
20
47
|
LOCALIZE
|
21
48
|
|
22
49
|
|
23
50
|
DateTime.class_eval <<-LOCALIZE, __FILE__, __LINE__ + 1
|
24
|
-
def l_short_s(locale = TwitterCldr.locale)
|
25
|
-
|
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
|
26
62
|
end
|
27
63
|
LOCALIZE
|
@@ -6,6 +6,7 @@ module SgtnClient::Core
|
|
6
6
|
|
7
7
|
def self.initialize(disabled=false, opts={})
|
8
8
|
$opts = opts
|
9
|
+
@mutex = Mutex.new
|
9
10
|
SgtnClient.logger.debug "Initialize cache......"
|
10
11
|
if disabled == false
|
11
12
|
$data = Hash.new
|
@@ -41,42 +42,50 @@ module SgtnClient::Core
|
|
41
42
|
end
|
42
43
|
|
43
44
|
def self.put(key, value, ttl=nil)
|
44
|
-
|
45
|
-
|
45
|
+
@mutex.synchronize do
|
46
|
+
if $data == nil
|
47
|
+
return nil
|
48
|
+
end
|
49
|
+
ttl ||= @opts[:ttl]
|
50
|
+
# hours from new
|
51
|
+
SgtnClient.logger.debug "Put cache for key '" + key + "' with expired time at'" + (Time.now + ttl*60).to_s
|
52
|
+
$data[key] = Entry.new(Time.now + ttl*60, value)
|
46
53
|
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
54
|
end
|
52
55
|
|
53
56
|
def self.delete(key)
|
54
|
-
|
55
|
-
|
57
|
+
@mutex.synchronize do
|
58
|
+
if $data == nil
|
59
|
+
return nil
|
60
|
+
end
|
61
|
+
SgtnClient.logger.debug "Delete cache for key: " + key
|
62
|
+
$data.delete key
|
56
63
|
end
|
57
|
-
SgtnClient.logger.debug "Delete cache for key: " + key
|
58
|
-
$data.delete key
|
59
64
|
end
|
60
65
|
|
61
66
|
def self.clear
|
62
|
-
|
63
|
-
|
67
|
+
@mutex.synchronize do
|
68
|
+
if $data == nil
|
69
|
+
return nil
|
70
|
+
end
|
71
|
+
SgtnClient.logger.debug "Clear cache!"
|
72
|
+
$data = Hash.new
|
64
73
|
end
|
65
|
-
SgtnClient.logger.debug "Clear cache!"
|
66
|
-
$data = Hash.new
|
67
74
|
end
|
68
75
|
|
69
76
|
def self.invalidate
|
70
|
-
|
71
|
-
|
77
|
+
@mutex.synchronize do
|
78
|
+
if $data == nil
|
79
|
+
return nil
|
80
|
+
end
|
81
|
+
SgtnClient.logger.debug "Invalidating expired cache......"
|
82
|
+
now = Time.now
|
83
|
+
$data.each {
|
84
|
+
|k, v|
|
85
|
+
SgtnClient.logger.debug "Checking cache: key=#{k}, expiredtime=#{v[:expiry]}, now=#{now}, expired=#{(v[:expiry] < now)}"
|
86
|
+
}
|
87
|
+
$data.delete_if {|k, v| v[:expiry] < now}
|
72
88
|
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
89
|
end
|
81
90
|
end
|
82
91
|
|
@@ -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
|
+
#res = RestClient.get(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
|
@@ -11,6 +11,7 @@ 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"
|
14
15
|
|
15
16
|
module Formatters
|
16
17
|
autoload :PluralFormatter, "sgtn-client/formatters/plurals/plural_formatter"
|
@@ -0,0 +1,32 @@
|
|
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
|
+
@mutex.synchronize do
|
12
|
+
data_hash = nil
|
13
|
+
begin
|
14
|
+
file = File.read(bundlepath)
|
15
|
+
data_hash = MultiJson.load(file)
|
16
|
+
rescue => exception
|
17
|
+
SgtnClient.logger.error exception.message
|
18
|
+
end
|
19
|
+
return data_hash
|
20
|
+
end
|
21
|
+
end
|
22
|
+
|
23
|
+
def self.read_yml(file_name)
|
24
|
+
@mutex.synchronize do
|
25
|
+
erb = ERB.new(File.read(file_name))
|
26
|
+
erb.filename = file_name
|
27
|
+
YAML.load(erb.result)
|
28
|
+
end
|
29
|
+
end
|
30
|
+
end
|
31
|
+
|
32
|
+
end
|
data/lib/version.rb
CHANGED
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.
|
4
|
+
version: 0.7.2
|
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:
|
11
|
+
date: 2022-01-18 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: rest-client
|
@@ -282,6 +282,7 @@ files:
|
|
282
282
|
- lib/sgtn-client/formatters/plurals/plural_formatter.rb
|
283
283
|
- lib/sgtn-client/sgtn-client.rb
|
284
284
|
- lib/sgtn-client/util/cache-util.rb
|
285
|
+
- lib/sgtn-client/util/file-util.rb
|
285
286
|
- lib/sgtn-client/util/locale-util.rb
|
286
287
|
- lib/sgtn-client/util/validate-util.rb
|
287
288
|
- lib/singleton-ruby.rb
|