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.
Files changed (2) hide show
  1. data/lib/imaginator.rb +64 -44
  2. metadata +1 -1
@@ -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.4'
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
- @uri = nil
130
- @dir = nil
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
- class<< self
133
- attr_accessor :uri, :dir
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 get
136
- raise(ArgumentError, "No URI given") if !@uri
137
- @client ||= DRb::DRbObject.new(nil, @uri)
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
- raise(ArgumentError, "No target directory given") if !@dir
142
- pid = Process.fork do
143
- begin
144
- server = Imaginator.new(@dir)
145
- DRb.start_service(@uri, server)
146
- yield(server) if block_given?
147
- loop { server.process }
148
- rescue Errno::EADDRINUSE
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
- Process.detach(pid)
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
- @queue.synchronize do
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?(name)
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 process
198
- name, type, code = @queue.synchronize do
199
- while @queue.empty? do
200
- @empty.wait
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
- @queue.first
203
- end
204
- @renderer[type].render(code, File.join(@dir, name)) rescue nil
205
- @queue.synchronize do
206
- @queue.shift
207
- end
208
- end
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
+
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: minad-imaginator
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.4
4
+ version: 0.1.5
5
5
  platform: ruby
6
6
  authors:
7
7
  - Daniel Mendler