tml 4.3.12 → 4.4.1
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/tml/api/client.rb +57 -11
- data/lib/tml/application.rb +1 -1
- data/lib/tml/cache.rb +47 -34
- data/lib/tml/cache_adapters/file.rb +0 -5
- data/lib/tml/cache_adapters/memcache.rb +2 -1
- data/lib/tml/cache_adapters/redis.rb +1 -1
- data/lib/tml/config.rb +6 -6
- data/lib/tml/decorators/html.rb +5 -1
- data/lib/tml/language.rb +4 -6
- data/lib/tml/logger.rb +17 -23
- data/lib/tml/session.rb +5 -5
- data/lib/tml/source.rb +2 -0
- data/lib/tml/version.rb +1 -1
- metadata +2 -3
- data/lib/tml/cache_adapters/cdn.rb +0 -101
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 219ec288ae06a6e1f41055d5a43911f912a9a60b
|
4
|
+
data.tar.gz: af5bb4eb638a821d605611fe3dfdb0eb3bfd1ef1
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 284ba13aed6ef6aff3a8b016edf77d8e9e844e587fd80e4d8029e8fe2904552f7c5d75b91e31ea7173ab0bdcae24f8ffc6f3e19396d632322f566e120b5e3b85
|
7
|
+
data.tar.gz: a53fe934ba88ef001c8ab23c8f8ac14344397f5240d0ffb330bf5ac8d6967a02943c97505bea742ca0ea3d7b6a8bd023863eb29a40639b8e44d41e4f9d2c2656
|
data/lib/tml/api/client.rb
CHANGED
@@ -33,15 +33,13 @@
|
|
33
33
|
require 'faraday'
|
34
34
|
|
35
35
|
class Tml::Api::Client < Tml::Base
|
36
|
+
CDN_HOST = 'https://cdn.translationexchange.com'
|
36
37
|
API_HOST = 'https://api.translationexchange.com'
|
37
38
|
API_PATH = '/v1'
|
38
39
|
|
39
40
|
attributes :application
|
40
41
|
|
41
|
-
|
42
|
-
Tml.config.application[:token] || Tml.config.application[:access_token]
|
43
|
-
end
|
44
|
-
|
42
|
+
# get results from api
|
45
43
|
def results(path, params = {}, opts = {})
|
46
44
|
get(path, params, opts)['results']
|
47
45
|
end
|
@@ -78,14 +76,61 @@ class Tml::Api::Client < Tml::Base
|
|
78
76
|
end
|
79
77
|
end
|
80
78
|
|
81
|
-
def
|
82
|
-
if Tml.
|
83
|
-
|
79
|
+
def verify_cache_version
|
80
|
+
return if Tml.cache.version and Tml.cache.version != 'undefined'
|
81
|
+
|
82
|
+
current_version = Tml.cache.fetch_version
|
83
|
+
if current_version == 'undefined'
|
84
|
+
Tml.cache.store_version(execute_request('applications/current/version', {}, {:raw => true}))
|
85
|
+
else
|
86
|
+
Tml.cache.version = current_version
|
87
|
+
end
|
88
|
+
Tml.logger.info("Version: #{Tml.cache.version}")
|
89
|
+
end
|
90
|
+
|
91
|
+
def cdn_connection
|
92
|
+
@cdn_connection ||= Faraday.new(:url => CDN_HOST) do |faraday|
|
93
|
+
faraday.request(:url_encoded) # form-encode POST params
|
94
|
+
faraday.adapter(Faraday.default_adapter) # make requests with Net::HTTP
|
95
|
+
end
|
96
|
+
end
|
97
|
+
|
98
|
+
def get_from_cdn(key, params = {}, opts = {})
|
99
|
+
return nil if Tml.cache.version == 'undefined' || Tml.cache.version.to_s == '0'
|
100
|
+
|
101
|
+
response = nil
|
102
|
+
cdn_path = "#{Tml.config.access_token}/#{Tml.cache.version}/#{key}.json"
|
103
|
+
trace_api_call(cdn_path, params, opts) do
|
104
|
+
begin
|
105
|
+
response = cdn_connection.get(cdn_path, params)
|
106
|
+
rescue Exception => ex
|
107
|
+
Tml.logger.error("Failed to execute request: #{ex.message[0..255]}")
|
108
|
+
return nil
|
109
|
+
end
|
84
110
|
end
|
111
|
+
return if response.status >= 500 and response.status < 600
|
112
|
+
return if response.body.nil? or response.body == '' or response.body.match(/xml/)
|
85
113
|
|
86
|
-
|
114
|
+
begin
|
115
|
+
data = JSON.parse(response.body)
|
116
|
+
rescue Exception => ex
|
117
|
+
return nil
|
118
|
+
end
|
119
|
+
|
120
|
+
data
|
121
|
+
end
|
122
|
+
|
123
|
+
def api(path, params = {}, opts = {})
|
124
|
+
# inline mode should always bypass API calls
|
125
|
+
# get request uses local cache, then CDN, the API
|
126
|
+
if opts[:method] == :get and opts[:cache_key] and Tml.cache.enabled? and not Tml.session.inline_mode?
|
127
|
+
verify_cache_version
|
87
128
|
data = Tml.cache.fetch(opts[:cache_key]) do
|
88
|
-
Tml.cache.read_only?
|
129
|
+
if Tml.cache.read_only?
|
130
|
+
nil
|
131
|
+
else
|
132
|
+
get_from_cdn(opts[:cache_key]) || execute_request(path, params, opts)
|
133
|
+
end
|
89
134
|
end
|
90
135
|
process_response(data, opts)
|
91
136
|
else
|
@@ -125,7 +170,7 @@ class Tml::Api::Client < Tml::Base
|
|
125
170
|
|
126
171
|
# oauth path is separate from versioned APIs
|
127
172
|
path = prepare_api_path(path)
|
128
|
-
params = params.merge(:access_token => access_token) unless path.index('oauth')
|
173
|
+
params = params.merge(:access_token => Tml.config.access_token) unless path.index('oauth')
|
129
174
|
|
130
175
|
if opts[:method] == :post
|
131
176
|
params = params.merge(:api_key => application.key)
|
@@ -155,6 +200,7 @@ class Tml::Api::Client < Tml::Base
|
|
155
200
|
end
|
156
201
|
|
157
202
|
return if response.body.nil? or response.body == ''
|
203
|
+
return response.body if opts[:raw]
|
158
204
|
|
159
205
|
begin
|
160
206
|
data = JSON.parse(response.body)
|
@@ -206,7 +252,7 @@ class Tml::Api::Client < Tml::Base
|
|
206
252
|
#end
|
207
253
|
|
208
254
|
if opts[:method] == :post
|
209
|
-
Tml.logger.debug("post: [#{path}]
|
255
|
+
Tml.logger.debug("post: [#{path}]")
|
210
256
|
else
|
211
257
|
Tml.logger.debug("get: #{path}?#{to_query(params)}")
|
212
258
|
end
|
data/lib/tml/application.rb
CHANGED
@@ -137,7 +137,7 @@ class Tml::Application < Tml::Base
|
|
137
137
|
end
|
138
138
|
|
139
139
|
def register_missing_key(source_key, tkey)
|
140
|
-
return if Tml.cache.
|
140
|
+
return if Tml.cache.enabled? and not Tml.session.inline_mode?
|
141
141
|
|
142
142
|
@missing_keys_by_sources ||= {}
|
143
143
|
@missing_keys_by_sources[source_key] ||= {}
|
data/lib/tml/cache.rb
CHANGED
@@ -32,7 +32,7 @@
|
|
32
32
|
|
33
33
|
module Tml
|
34
34
|
|
35
|
-
CACHE_VERSION_KEY = '
|
35
|
+
CACHE_VERSION_KEY = 'current_version'
|
36
36
|
|
37
37
|
def self.memory
|
38
38
|
@memory ||= Tml::CacheAdapters::Memory.new
|
@@ -52,92 +52,105 @@ module Tml
|
|
52
52
|
|
53
53
|
class Cache
|
54
54
|
|
55
|
+
# Returns current cache version
|
55
56
|
def version
|
56
|
-
Tml.config.cache[:version] ||= 1
|
57
|
-
|
58
|
-
@version ||= begin
|
59
|
-
v = fetch(CACHE_VERSION_KEY) do
|
60
|
-
{'version' => Tml.config.cache[:version]}
|
61
|
-
end
|
62
|
-
v['version']
|
63
|
-
end
|
64
|
-
|
65
|
-
@version ||= Tml.config.cache[:version]
|
66
|
-
|
67
|
-
if Tml.config.cache[:version] > @version
|
68
|
-
update_version(Tml.config.cache[:version])
|
69
|
-
@version = Tml.config.cache[:version]
|
70
|
-
end
|
71
|
-
|
72
57
|
@version
|
73
58
|
end
|
74
59
|
|
75
|
-
|
76
|
-
|
60
|
+
# sets the current version
|
61
|
+
def version=(new_version)
|
62
|
+
@version = new_version
|
77
63
|
end
|
78
64
|
|
79
|
-
|
80
|
-
|
65
|
+
# resets current version
|
66
|
+
def reset_version
|
81
67
|
@version = nil
|
82
68
|
end
|
83
69
|
|
84
|
-
|
85
|
-
|
70
|
+
# upgrade current version
|
71
|
+
def upgrade_version
|
72
|
+
store(CACHE_VERSION_KEY, {'version' => 'undefined'})
|
73
|
+
reset_version
|
86
74
|
end
|
87
75
|
|
88
|
-
|
89
|
-
|
76
|
+
# fetches the version from the cache
|
77
|
+
def fetch_version
|
78
|
+
@version ||= begin
|
79
|
+
v = fetch(CACHE_VERSION_KEY) do
|
80
|
+
{'version' => Tml.config.cache[:version] || 'undefined'}
|
81
|
+
end
|
82
|
+
v.is_a?(Hash) ? v['version'] : v
|
83
|
+
end
|
90
84
|
end
|
91
85
|
|
92
|
-
|
93
|
-
|
86
|
+
# stores the current version back in cache
|
87
|
+
def store_version(new_version)
|
88
|
+
@version = new_version
|
89
|
+
store(CACHE_VERSION_KEY, {'version' => new_version})
|
94
90
|
end
|
95
91
|
|
96
|
-
|
97
|
-
|
92
|
+
# checks if Tml is enabled
|
93
|
+
def enabled?
|
94
|
+
Tml.config.cache_enabled?
|
98
95
|
end
|
99
96
|
|
100
|
-
|
101
|
-
|
97
|
+
# by default all cache is read/write
|
98
|
+
# cache like files based should be set to read only
|
99
|
+
def read_only?
|
100
|
+
false
|
102
101
|
end
|
103
102
|
|
103
|
+
# name of the cache adapter
|
104
104
|
def cache_name
|
105
105
|
self.class.name.split('::').last
|
106
106
|
end
|
107
107
|
|
108
|
+
# logs information messages
|
108
109
|
def info(msg)
|
109
110
|
Tml.logger.info("#{cache_name} - #{msg}")
|
110
111
|
end
|
111
112
|
|
113
|
+
# logs a warning
|
112
114
|
def warn(msg)
|
113
115
|
Tml.logger.warn("#{cache_name} - #{msg}")
|
114
116
|
end
|
115
117
|
|
118
|
+
# namespace of each cache key
|
119
|
+
def namespace
|
120
|
+
return '#' if Tml.config.disabled?
|
121
|
+
Tml.config.cache[:namespace] || Tml.config.access_token[0..5]
|
122
|
+
end
|
123
|
+
|
124
|
+
# versioned name of cache key
|
116
125
|
def versioned_key(key, opts = {})
|
117
|
-
|
118
|
-
"tml_rc_v#{version}_#{key}"
|
126
|
+
"tml_#{namespace}#{CACHE_VERSION_KEY == key ? '' : "_v#{version}"}_#{key}"
|
119
127
|
end
|
120
128
|
|
129
|
+
# fetches key from cache
|
121
130
|
def fetch(key, opts = {})
|
122
131
|
return nil unless block_given?
|
123
132
|
yield
|
124
133
|
end
|
125
134
|
|
135
|
+
# stores key in cache
|
126
136
|
def store(key, data, opts = {})
|
127
137
|
# do nothing
|
128
138
|
end
|
129
139
|
|
140
|
+
# deletes key from cache
|
130
141
|
def delete(key, opts = {})
|
131
142
|
# do nothing
|
132
143
|
end
|
133
144
|
|
145
|
+
# checks if the key exists
|
134
146
|
def exist?(key, opts = {})
|
135
147
|
false
|
136
148
|
end
|
137
149
|
|
150
|
+
# clears cache
|
138
151
|
def clear(opts = {})
|
139
152
|
# do nothing
|
140
153
|
end
|
141
154
|
|
142
155
|
end
|
143
|
-
end
|
156
|
+
end
|
@@ -48,11 +48,6 @@ class Tml::CacheAdapters::File < Tml::Cache
|
|
48
48
|
'file'
|
49
49
|
end
|
50
50
|
|
51
|
-
def segmented?
|
52
|
-
return true if Tml.config.cache[:segmented].nil?
|
53
|
-
Tml.config.cache[:segmented]
|
54
|
-
end
|
55
|
-
|
56
51
|
def fetch(key, opts = {})
|
57
52
|
if self.class.cache[key]
|
58
53
|
info("Memory hit: #{key}")
|
@@ -71,10 +71,11 @@ class Tml::CacheAdapters::Memcache < Tml::Cache
|
|
71
71
|
|
72
72
|
def store(key, data, opts = {})
|
73
73
|
info("Cache store: #{key}")
|
74
|
-
ttl = opts[:ttl] || Tml.config.cache[:timeout]
|
74
|
+
ttl = opts[:ttl] || Tml.config.cache[:timeout] || 0
|
75
75
|
@cache.set(versioned_key(key, opts), data, ttl)
|
76
76
|
data
|
77
77
|
rescue Exception => ex
|
78
|
+
pp ex
|
78
79
|
warn("Failed to store data: #{key}")
|
79
80
|
data
|
80
81
|
end
|
data/lib/tml/config.rb
CHANGED
@@ -78,7 +78,7 @@ module Tml
|
|
78
78
|
attr_accessor :enabled, :default_locale, :default_level, :format, :application, :context_rules, :logger, :cache, :default_tokens, :localization
|
79
79
|
|
80
80
|
# Used by Rails and Sinatra extensions
|
81
|
-
attr_accessor :current_locale_method, :current_user_method, :translator_options
|
81
|
+
attr_accessor :current_locale_method, :current_user_method, :translator_options, :i18n_backend
|
82
82
|
|
83
83
|
# Used for IRB only
|
84
84
|
attr_accessor :submit_missing_keys_realtime
|
@@ -166,11 +166,7 @@ module Tml
|
|
166
166
|
}
|
167
167
|
|
168
168
|
@cache = {
|
169
|
-
:enabled => false
|
170
|
-
:host => 'localhost:11211',
|
171
|
-
:adapter => 'memcache',
|
172
|
-
:version => 1,
|
173
|
-
:timeout => 3600
|
169
|
+
:enabled => false
|
174
170
|
}
|
175
171
|
|
176
172
|
@default_tokens = {
|
@@ -343,6 +339,10 @@ module Tml
|
|
343
339
|
@default_application ||= Tml::Application.new(:host => Tml::Api::Client::API_HOST)
|
344
340
|
end
|
345
341
|
|
342
|
+
def access_token
|
343
|
+
@application[:token] || @application[:access_token] || ''
|
344
|
+
end
|
345
|
+
|
346
346
|
#########################################################
|
347
347
|
## Decorations
|
348
348
|
#########################################################
|
data/lib/tml/decorators/html.rb
CHANGED
@@ -50,7 +50,11 @@ class Tml::Decorators::Html < Tml::Decorators::Base
|
|
50
50
|
# return translated_label unless Tml.session.current_translator.feature_enabled?(:show_locked_keys)
|
51
51
|
classes << 'tml_locked'
|
52
52
|
elsif translation_language == translation_key.language
|
53
|
-
|
53
|
+
if options[:pending]
|
54
|
+
classes << 'tml_pending'
|
55
|
+
else
|
56
|
+
classes << 'tml_not_translated'
|
57
|
+
end
|
54
58
|
elsif translation_language == target_language
|
55
59
|
classes << 'tml_translated'
|
56
60
|
else
|
data/lib/tml/language.rb
CHANGED
@@ -155,16 +155,14 @@ class Tml::Language < Tml::Base
|
|
155
155
|
|
156
156
|
source_key = current_source(options)
|
157
157
|
|
158
|
-
|
159
|
-
|
160
|
-
cached_translations = source.cached_translations(locale, translation_key.key)
|
161
|
-
else
|
162
|
-
cached_translations = application.fetch_translations(locale)[translation_key.key]
|
163
|
-
end
|
158
|
+
source = application.source(source_key, locale)
|
159
|
+
cached_translations = source.cached_translations(locale, translation_key.key)
|
164
160
|
|
165
161
|
if cached_translations
|
166
162
|
translation_key.set_translations(locale, cached_translations)
|
167
163
|
else
|
164
|
+
params[:options] ||= {}
|
165
|
+
params[:options][:pending] = true
|
168
166
|
application.register_missing_key(source_key, translation_key)
|
169
167
|
end
|
170
168
|
|
data/lib/tml/logger.rb
CHANGED
@@ -58,50 +58,44 @@ module Tml
|
|
58
58
|
class Logger < ::Logger
|
59
59
|
attr_accessor :external_logger
|
60
60
|
|
61
|
-
def
|
62
|
-
|
63
|
-
|
64
|
-
|
61
|
+
def log_to_console(msg)
|
62
|
+
return unless Tml.config.logger[:console]
|
63
|
+
puts msg
|
64
|
+
end
|
65
65
|
|
66
|
+
def info(message)
|
67
|
+
log_to_console(message)
|
68
|
+
return external_logger.info(format_message(Logger::Severity::INFO, Time.new, nil, message)) if external_logger
|
66
69
|
super
|
67
70
|
end
|
68
71
|
|
69
72
|
def debug(message)
|
70
|
-
|
71
|
-
|
72
|
-
end
|
73
|
-
|
73
|
+
log_to_console(message)
|
74
|
+
return external_logger.debug(format_message(Logger::Severity::DEBUG, Time.new, nil, message)) if external_logger
|
74
75
|
super
|
75
76
|
end
|
76
77
|
|
77
78
|
def warn(message)
|
78
|
-
|
79
|
-
|
80
|
-
end
|
81
|
-
|
79
|
+
log_to_console(message)
|
80
|
+
return external_logger.warn(format_message(Logger::Severity::WARN, Time.new, nil, message)) if external_logger
|
82
81
|
super
|
83
82
|
end
|
84
83
|
|
85
84
|
def error(message)
|
86
|
-
|
87
|
-
|
88
|
-
end
|
89
|
-
|
85
|
+
log_to_console(message)
|
86
|
+
return external_logger.error(format_message(Logger::Severity::ERROR, Time.new, nil, message)) if external_logger
|
90
87
|
super
|
91
88
|
end
|
92
89
|
|
93
90
|
def fatal(message)
|
94
|
-
|
95
|
-
|
96
|
-
end
|
97
|
-
|
91
|
+
log_to_console(message)
|
92
|
+
return external_logger.fatal(format_message(Logger::Severity::FATAL, Time.new, nil, message)) if external_logger
|
98
93
|
super
|
99
94
|
end
|
100
95
|
|
101
96
|
def format_message(severity, timestamp, progname, msg)
|
102
|
-
return
|
103
|
-
#
|
104
|
-
"[#{timestamp.strftime("%D %T")}]: tml: #{' ' * stack.size}#{msg}\n"
|
97
|
+
return '' unless Tml.config.logger[:enabled]
|
98
|
+
"[#{timestamp.strftime('%D %T')}]: tml: #{' ' * stack.size}#{msg}\n"
|
105
99
|
end
|
106
100
|
|
107
101
|
def add(severity, message = nil, progname = nil, &block)
|
data/lib/tml/session.rb
CHANGED
@@ -41,7 +41,7 @@ module Tml
|
|
41
41
|
:current_source, :current_component, :block_options, :cookie_params, :access_token, :tools_enabled
|
42
42
|
|
43
43
|
def cookie_name
|
44
|
-
"trex_#{
|
44
|
+
"trex_#{Tml.config.access_token[0..19]}_translationexchange"
|
45
45
|
end
|
46
46
|
|
47
47
|
def init(opts = {})
|
@@ -51,10 +51,6 @@ module Tml
|
|
51
51
|
|
52
52
|
Tml.cache.reset_version
|
53
53
|
|
54
|
-
self.application = Tml::Application.new(:host => host).fetch
|
55
|
-
|
56
|
-
# Tml.logger.info(self.cookie_params.inspect)
|
57
|
-
|
58
54
|
self.cookie_params = begin
|
59
55
|
if opts[:cookies] and opts[:cookies][cookie_name]
|
60
56
|
begin
|
@@ -70,6 +66,8 @@ module Tml
|
|
70
66
|
end
|
71
67
|
end
|
72
68
|
|
69
|
+
# Tml.logger.info(self.cookie_params.inspect)
|
70
|
+
|
73
71
|
self.tools_enabled = opts[:tools_enabled]
|
74
72
|
self.current_user = opts[:user]
|
75
73
|
self.current_source = opts[:source] || 'index'
|
@@ -80,6 +78,8 @@ module Tml
|
|
80
78
|
self.current_translator = Tml::Translator.new(self.cookie_params['translator'])
|
81
79
|
end
|
82
80
|
|
81
|
+
self.application = Tml::Application.new(:host => host).fetch
|
82
|
+
|
83
83
|
# if inline mode don't use any app cache
|
84
84
|
if inline_mode?
|
85
85
|
self.application = self.application.dup
|
data/lib/tml/source.rb
CHANGED
@@ -76,6 +76,8 @@ class Tml::Source < Tml::Base
|
|
76
76
|
{:cache_key => Tml::Source.cache_key(locale, self.source)}
|
77
77
|
)
|
78
78
|
|
79
|
+
return self unless results
|
80
|
+
|
79
81
|
results.each do |key, data|
|
80
82
|
translations_data = data.is_a?(Hash) ? data['translations'] : data
|
81
83
|
self.translations[locale][key] = translations_data.collect do |t|
|
data/lib/tml/version.rb
CHANGED
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: tml
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 4.
|
4
|
+
version: 4.4.1
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Michael Berkovich
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2015-
|
11
|
+
date: 2015-06-11 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: faraday
|
@@ -54,7 +54,6 @@ files:
|
|
54
54
|
- lib/tml/application.rb
|
55
55
|
- lib/tml/base.rb
|
56
56
|
- lib/tml/cache.rb
|
57
|
-
- lib/tml/cache_adapters/cdn.rb
|
58
57
|
- lib/tml/cache_adapters/file.rb
|
59
58
|
- lib/tml/cache_adapters/memcache.rb
|
60
59
|
- lib/tml/cache_adapters/redis.rb
|
@@ -1,101 +0,0 @@
|
|
1
|
-
# encoding: UTF-8
|
2
|
-
#--
|
3
|
-
# Copyright (c) 2015 Translation Exchange, Inc
|
4
|
-
#
|
5
|
-
# _______ _ _ _ ______ _
|
6
|
-
# |__ __| | | | | (_) | ____| | |
|
7
|
-
# | |_ __ __ _ _ __ ___| | __ _| |_ _ ___ _ __ | |__ __ _____| |__ __ _ _ __ __ _ ___
|
8
|
-
# | | '__/ _` | '_ \/ __| |/ _` | __| |/ _ \| '_ \| __| \ \/ / __| '_ \ / _` | '_ \ / _` |/ _ \
|
9
|
-
# | | | | (_| | | | \__ \ | (_| | |_| | (_) | | | | |____ > < (__| | | | (_| | | | | (_| | __/
|
10
|
-
# |_|_| \__,_|_| |_|___/_|\__,_|\__|_|\___/|_| |_|______/_/\_\___|_| |_|\__,_|_| |_|\__, |\___|
|
11
|
-
# __/ |
|
12
|
-
# |___/
|
13
|
-
# Permission is hereby granted, free of charge, to any person obtaining
|
14
|
-
# a copy of this software and associated documentation files (the
|
15
|
-
# "Software"), to deal in the Software without restriction, including
|
16
|
-
# without limitation the rights to use, copy, modify, merge, publish,
|
17
|
-
# distribute, sublicense, and/or sell copies of the Software, and to
|
18
|
-
# permit persons to whom the Software is furnished to do so, subject to
|
19
|
-
# the following conditions:
|
20
|
-
#
|
21
|
-
# The above copyright notice and this permission notice shall be
|
22
|
-
# included in all copies or substantial portions of the Software.
|
23
|
-
#
|
24
|
-
# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
25
|
-
# EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
26
|
-
# MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
|
27
|
-
# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
|
28
|
-
# LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
|
29
|
-
# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
|
30
|
-
# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
31
|
-
#++
|
32
|
-
|
33
|
-
class Tml::CacheAdapters::Cdn < Tml::Cache
|
34
|
-
|
35
|
-
def self.cache
|
36
|
-
@cache ||= {}
|
37
|
-
end
|
38
|
-
|
39
|
-
def self.cache_path
|
40
|
-
"#{Tml.config.cache[:base_url]}/#{Tml.config.cache[:version]}"
|
41
|
-
end
|
42
|
-
|
43
|
-
def self.cdn_path(key)
|
44
|
-
File.join(cache_path, "#{key}.json")
|
45
|
-
end
|
46
|
-
|
47
|
-
def cache_name
|
48
|
-
'cdn'
|
49
|
-
end
|
50
|
-
|
51
|
-
def segmented?
|
52
|
-
return true if Tml.config.cache[:segmented].nil?
|
53
|
-
Tml.config.cache[:segmented]
|
54
|
-
end
|
55
|
-
|
56
|
-
def fetch(key, opts = {})
|
57
|
-
if self.class.cache[key]
|
58
|
-
info("Memory hit: #{key}")
|
59
|
-
return self.class.cache[key]
|
60
|
-
end
|
61
|
-
|
62
|
-
path = self.class.cdn_path(key)
|
63
|
-
|
64
|
-
|
65
|
-
# load data from cdn
|
66
|
-
|
67
|
-
|
68
|
-
if File.exists?(path)
|
69
|
-
info("Cache hit: #{key}")
|
70
|
-
self.class.cache[key] = JSON.parse(File.read(path))
|
71
|
-
return self.class.cache[key]
|
72
|
-
end
|
73
|
-
|
74
|
-
info("Cache miss: #{key}")
|
75
|
-
|
76
|
-
return nil unless block_given?
|
77
|
-
|
78
|
-
yield
|
79
|
-
end
|
80
|
-
|
81
|
-
def store(key, data, opts = {})
|
82
|
-
warn('This is a readonly cache')
|
83
|
-
end
|
84
|
-
|
85
|
-
def delete(key, opts = {})
|
86
|
-
warn('This is a readonly cache')
|
87
|
-
end
|
88
|
-
|
89
|
-
def exist?(key, opts = {})
|
90
|
-
File.exists?(self.class.file_path(key))
|
91
|
-
end
|
92
|
-
|
93
|
-
def clear(opts = {})
|
94
|
-
warn('This is a readonly cache')
|
95
|
-
end
|
96
|
-
|
97
|
-
def read_only?
|
98
|
-
true
|
99
|
-
end
|
100
|
-
|
101
|
-
end
|