minad-imaginator 0.1.4 → 0.1.5
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.
- data/lib/imaginator.rb +64 -44
- metadata +1 -1
data/lib/imaginator.rb
CHANGED
|
@@ -3,9 +3,10 @@ require 'fileutils'
|
|
|
3
3
|
require 'thread'
|
|
4
4
|
require 'monitor'
|
|
5
5
|
require 'drb'
|
|
6
|
+
require 'timeout'
|
|
6
7
|
|
|
7
8
|
class Imaginator
|
|
8
|
-
VERSION = '0.1.
|
|
9
|
+
VERSION = '0.1.5'
|
|
9
10
|
|
|
10
11
|
class LaTeX
|
|
11
12
|
def initialize(opts = {})
|
|
@@ -126,39 +127,62 @@ END
|
|
|
126
127
|
end
|
|
127
128
|
end
|
|
128
129
|
|
|
129
|
-
|
|
130
|
-
|
|
130
|
+
class Server
|
|
131
|
+
def initialize(renderer)
|
|
132
|
+
@renderer = renderer
|
|
133
|
+
@queue = []
|
|
134
|
+
@queue.extend(MonitorMixin)
|
|
135
|
+
@empty = @queue.new_cond
|
|
136
|
+
end
|
|
131
137
|
|
|
132
|
-
|
|
133
|
-
|
|
138
|
+
def enqueue(name, type, code)
|
|
139
|
+
@queue.synchronize do
|
|
140
|
+
@queue << [name, type, code]
|
|
141
|
+
@empty.signal
|
|
142
|
+
end
|
|
143
|
+
end
|
|
134
144
|
|
|
135
|
-
def
|
|
136
|
-
|
|
137
|
-
|
|
145
|
+
def enqueued?(name)
|
|
146
|
+
@queue.synchronize do
|
|
147
|
+
@queue.any? do |x|
|
|
148
|
+
x[0] == name
|
|
149
|
+
end
|
|
150
|
+
end
|
|
138
151
|
end
|
|
139
152
|
|
|
140
153
|
def run
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
154
|
+
loop do
|
|
155
|
+
name, type, code = @queue.synchronize do
|
|
156
|
+
return if !wait_while_empty
|
|
157
|
+
@queue.first
|
|
158
|
+
end
|
|
159
|
+
@renderer[type].render(code, name) rescue nil
|
|
160
|
+
@queue.synchronize do
|
|
161
|
+
@queue.shift
|
|
162
|
+
end
|
|
163
|
+
end
|
|
164
|
+
end
|
|
165
|
+
|
|
166
|
+
private
|
|
167
|
+
|
|
168
|
+
def wait_while_empty
|
|
169
|
+
Timeout.timeout(5) do
|
|
170
|
+
while @queue.empty?
|
|
171
|
+
@empty.wait
|
|
149
172
|
end
|
|
173
|
+
return true
|
|
150
174
|
end
|
|
151
|
-
|
|
175
|
+
rescue Timeout::Error => ex
|
|
176
|
+
false
|
|
152
177
|
end
|
|
153
178
|
end
|
|
154
179
|
|
|
155
|
-
def initialize(dir)
|
|
180
|
+
def initialize(uri, dir)
|
|
181
|
+
@uri = uri
|
|
156
182
|
@dir = dir
|
|
157
183
|
@renderer = {}
|
|
158
|
-
@queue = []
|
|
159
|
-
@queue.extend(MonitorMixin)
|
|
160
|
-
@empty = @queue.new_cond
|
|
161
184
|
FileUtils.mkdir_p(@dir, :mode => 0755)
|
|
185
|
+
yield(self) if block_given?
|
|
162
186
|
end
|
|
163
187
|
|
|
164
188
|
def add_renderer(type, renderer)
|
|
@@ -174,10 +198,7 @@ END
|
|
|
174
198
|
name = Digest::MD5.hexdigest(code) + '.' + format
|
|
175
199
|
file = File.join(@dir, name)
|
|
176
200
|
if !File.exists?(file)
|
|
177
|
-
|
|
178
|
-
@queue << [name, type, code]
|
|
179
|
-
@empty.signal
|
|
180
|
-
end
|
|
201
|
+
server.enqueue(file, type, code)
|
|
181
202
|
end
|
|
182
203
|
name
|
|
183
204
|
end
|
|
@@ -186,7 +207,7 @@ END
|
|
|
186
207
|
file = File.join(@dir, name)
|
|
187
208
|
if !File.exists?(file)
|
|
188
209
|
20.times do
|
|
189
|
-
break if !enqueued?(
|
|
210
|
+
break if !server.enqueued?(file)
|
|
190
211
|
sleep 0.5
|
|
191
212
|
end
|
|
192
213
|
end
|
|
@@ -194,26 +215,25 @@ END
|
|
|
194
215
|
file
|
|
195
216
|
end
|
|
196
217
|
|
|
197
|
-
def
|
|
198
|
-
|
|
199
|
-
|
|
200
|
-
|
|
218
|
+
def server
|
|
219
|
+
begin
|
|
220
|
+
@server ||= DRb::DRbObject.new(nil, @uri)
|
|
221
|
+
@server.respond_to? :enqueue
|
|
222
|
+
@server
|
|
223
|
+
rescue
|
|
224
|
+
if @uri =~ %r{^drbunix://(.+)$}
|
|
225
|
+
File.unlink($1) rescue nil
|
|
201
226
|
end
|
|
202
|
-
@
|
|
203
|
-
|
|
204
|
-
|
|
205
|
-
|
|
206
|
-
|
|
207
|
-
|
|
208
|
-
|
|
209
|
-
|
|
210
|
-
private
|
|
211
|
-
|
|
212
|
-
def enqueued?(name)
|
|
213
|
-
@queue.synchronize do
|
|
214
|
-
@queue.any? do |x|
|
|
215
|
-
x[0] == name
|
|
227
|
+
server = Server.new(@renderer)
|
|
228
|
+
drb_server = DRb.start_service(@uri, server)
|
|
229
|
+
Thread.new do
|
|
230
|
+
server.run
|
|
231
|
+
drb_server.stop_service
|
|
232
|
+
DRb.primary_server = nil if DRb.primary_server == drb_server
|
|
233
|
+
@server = nil
|
|
216
234
|
end
|
|
235
|
+
@server = server
|
|
217
236
|
end
|
|
218
237
|
end
|
|
219
238
|
end
|
|
239
|
+
|