ghost_reader 1.1.6 → 1.2.0
Sign up to get free protection for your applications and to get access to all the features.
- data/lib/ghost_reader/backend.rb +106 -62
- data/lib/ghost_reader/version.rb +1 -1
- data/spec/ghost_reader/backend_spec.rb +3 -2
- metadata +3 -3
data/lib/ghost_reader/backend.rb
CHANGED
@@ -20,12 +20,13 @@ module GhostReader
|
|
20
20
|
config.logger.level = config.log_level || Logger::WARN
|
21
21
|
config.service[:logger] ||= config.logger
|
22
22
|
config.client ||= Client.new(config.service)
|
23
|
-
unless config.no_auto_spawn
|
24
|
-
|
25
|
-
|
26
|
-
|
27
|
-
|
28
|
-
end
|
23
|
+
# unless config.no_auto_spawn
|
24
|
+
# log "GhostReader spawning agents."
|
25
|
+
# spawn_retriever
|
26
|
+
# spawn_reporter
|
27
|
+
# log "GhostReader spawned its agents."
|
28
|
+
# end
|
29
|
+
@report_ts = @retrieval_ts = Time.now
|
29
30
|
log "Initialized GhostReader backend.", :info
|
30
31
|
end
|
31
32
|
|
@@ -42,20 +43,56 @@ module GhostReader
|
|
42
43
|
|
43
44
|
result = config.fallback.translate(locale, key, options)
|
44
45
|
log "fallback result: #{result.inspect}"
|
45
|
-
return result
|
46
46
|
rescue Exception => ex
|
47
47
|
log "fallback.translate raised exception: #{ex}"
|
48
48
|
ensure # make sure everything is tracked
|
49
49
|
# TODO results which are hashes need to be tracked disaggregated
|
50
50
|
track({ key => { locale.to_s => { 'default' => result } } }) unless result.is_a?(Hash)
|
51
|
-
|
51
|
+
report_and_retrieve
|
52
|
+
raise(ex) unless ex.nil?
|
53
|
+
return result
|
52
54
|
end
|
53
55
|
|
54
56
|
def track(missing)
|
55
57
|
return if missings.nil? # not yet initialized
|
56
58
|
log "tracking: #{missing.inspect}"
|
57
59
|
self.missings.deep_merge!(missing)
|
58
|
-
log "missings: #{missings.
|
60
|
+
log "# of missings: #{missings.keys.size}"
|
61
|
+
end
|
62
|
+
|
63
|
+
def report_and_retrieve
|
64
|
+
initialize_retrieval if missings.nil?
|
65
|
+
diff = Time.now - @report_ts
|
66
|
+
if diff > config.report_interval
|
67
|
+
threadify do
|
68
|
+
log "Kick off report. #{missings.inspect}", :info
|
69
|
+
@report_ts = Time.now
|
70
|
+
report
|
71
|
+
@report_ts = Time.now
|
72
|
+
end
|
73
|
+
else
|
74
|
+
log "Skipping report. #{diff}"
|
75
|
+
end
|
76
|
+
|
77
|
+
diff = Time.now - @retrieval_ts
|
78
|
+
if diff > config.retrieval_interval
|
79
|
+
threadify do
|
80
|
+
log "Kick off retrieval."
|
81
|
+
@retrieval_ts = Time.now
|
82
|
+
retrieve
|
83
|
+
@retrieval_ts = Time.now
|
84
|
+
end
|
85
|
+
else
|
86
|
+
log "Skipping retrieval. #{diff}"
|
87
|
+
end
|
88
|
+
end
|
89
|
+
|
90
|
+
def threadify(&block)
|
91
|
+
if config.no_threads
|
92
|
+
block.call
|
93
|
+
else
|
94
|
+
Thread.new { block.call }
|
95
|
+
end
|
59
96
|
end
|
60
97
|
|
61
98
|
# data, e.g. {'en' => {'this' => {'is' => {'a' => {'test' => 'This is a test.'}}}}}
|
@@ -65,64 +102,71 @@ module GhostReader
|
|
65
102
|
memoized_lookup.send(options[:method], symbolized_flattend)
|
66
103
|
end
|
67
104
|
|
68
|
-
# performs initial and incremental requests
|
69
|
-
def spawn_retriever
|
70
|
-
|
71
|
-
|
72
|
-
|
73
|
-
|
74
|
-
|
75
|
-
|
76
|
-
|
77
|
-
|
78
|
-
|
79
|
-
|
80
|
-
|
81
|
-
|
82
|
-
|
83
|
-
|
84
|
-
|
85
|
-
|
86
|
-
|
87
|
-
|
88
|
-
|
89
|
-
|
90
|
-
|
91
|
-
|
92
|
-
|
93
|
-
|
94
|
-
|
95
|
-
|
96
|
-
|
97
|
-
|
105
|
+
# # performs initial and incremental requests
|
106
|
+
# def spawn_retriever
|
107
|
+
# log "Spawning retriever."
|
108
|
+
# @retriever = Thread.new do
|
109
|
+
# initialize_retrieval
|
110
|
+
# until false
|
111
|
+
# sleep config.retrieval_interval
|
112
|
+
# retrieve
|
113
|
+
# end
|
114
|
+
# end
|
115
|
+
# end
|
116
|
+
|
117
|
+
def initialize_retrieval
|
118
|
+
log "Performing initial request."
|
119
|
+
response = config.client.initial_request
|
120
|
+
memoize_merge! response[:data]
|
121
|
+
self.missings = {} # initialized
|
122
|
+
log "Initial request successfull.", :info
|
123
|
+
rescue => ex
|
124
|
+
log "Exception initializing retrieval: #{ex}", :error
|
125
|
+
log ex.backtrace.join("\n"), :error
|
126
|
+
end
|
127
|
+
|
128
|
+
def retrieve
|
129
|
+
response = config.client.incremental_request
|
130
|
+
if response[:status] == 200
|
131
|
+
log "Incremental request with data.", :info
|
132
|
+
log "Data: #{response[:data].inspect}"
|
133
|
+
memoize_merge! response[:data], :method => :deep_merge!
|
134
|
+
else
|
135
|
+
log "Incremental request, but no data."
|
98
136
|
end
|
137
|
+
rescue => ex
|
138
|
+
log "Exception in retrieval: #{ex}", :error
|
139
|
+
log ex.backtrace.join("\n"), :error
|
99
140
|
end
|
100
141
|
|
101
|
-
# performs reporting requests
|
102
|
-
def spawn_reporter
|
103
|
-
|
104
|
-
|
105
|
-
|
106
|
-
|
107
|
-
|
108
|
-
|
109
|
-
|
110
|
-
|
111
|
-
|
112
|
-
|
113
|
-
|
114
|
-
|
115
|
-
|
116
|
-
|
117
|
-
|
118
|
-
|
119
|
-
|
120
|
-
|
121
|
-
log "Exception in reporter thread: #{ex}", :error
|
122
|
-
log ex.backtrace.join("\n")
|
123
|
-
end
|
142
|
+
# # performs reporting requests
|
143
|
+
# def spawn_reporter
|
144
|
+
# log "Spawning reporter."
|
145
|
+
# @reporter = Thread.new do
|
146
|
+
# until false
|
147
|
+
# sleep config.report_interval
|
148
|
+
# report
|
149
|
+
# end
|
150
|
+
# end
|
151
|
+
# end
|
152
|
+
|
153
|
+
def report
|
154
|
+
unless self.missings.nil?
|
155
|
+
unless self.missings.empty?
|
156
|
+
log "Reporting request with #{self.missings.keys.size} missings.", :info
|
157
|
+
config.client.reporting_request(missings)
|
158
|
+
self.missings.clear
|
159
|
+
log "Missings emptied.", :info
|
160
|
+
else
|
161
|
+
log "Reporting request omitted, nothing to report."
|
124
162
|
end
|
163
|
+
else
|
164
|
+
log "Reporting request omitted, not yet initialized," +
|
165
|
+
" waiting for intial request."
|
125
166
|
end
|
167
|
+
rescue => ex
|
168
|
+
log "Exception in report: #{ex}", :error
|
169
|
+
log ex.backtrace.join("\n")
|
126
170
|
end
|
127
171
|
|
128
172
|
# a wrapper for I18n::Backend::Flatten#flatten_translations
|
data/lib/ghost_reader/version.rb
CHANGED
@@ -134,8 +134,9 @@ describe GhostReader::Backend do
|
|
134
134
|
end
|
135
135
|
|
136
136
|
it 'should track lookups which raise exceptions' do
|
137
|
-
backend.retriever.should be_alive
|
138
|
-
backend.missings
|
137
|
+
# backend.retriever.should be_alive
|
138
|
+
backend.missings = {} # fake initialize
|
139
|
+
backend.missings.should be_empty
|
139
140
|
expect { backend.translate(:de, :asdf) }.to raise_error('missing translation')
|
140
141
|
backend.missings.should_not be_empty
|
141
142
|
end
|